Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/lvs...
authorSimon Horman <horms@verge.net.au>
Wed, 27 Aug 2008 05:11:37 +0000 (15:11 +1000)
committerSimon Horman <horms@verge.net.au>
Wed, 27 Aug 2008 05:11:37 +0000 (15:11 +1000)
852 files changed:
Documentation/arm/Samsung-S3C24XX/GPIO.txt
Documentation/arm/Samsung-S3C24XX/Overview.txt
Documentation/filesystems/ubifs.txt
Documentation/hwmon/ibmaem
Documentation/kernel-parameters.txt
Documentation/scsi/ChangeLog.megaraid_sas
Documentation/sound/alsa/ALSA-Configuration.txt
Documentation/vm/page_migration
MAINTAINERS
Makefile
arch/alpha/include/asm/8253pit.h [new file with mode: 0644]
arch/alpha/include/asm/Kbuild [new file with mode: 0644]
arch/alpha/include/asm/a.out-core.h [new file with mode: 0644]
arch/alpha/include/asm/a.out.h [new file with mode: 0644]
arch/alpha/include/asm/agp.h [new file with mode: 0644]
arch/alpha/include/asm/agp_backend.h [new file with mode: 0644]
arch/alpha/include/asm/atomic.h [new file with mode: 0644]
arch/alpha/include/asm/auxvec.h [new file with mode: 0644]
arch/alpha/include/asm/barrier.h [new file with mode: 0644]
arch/alpha/include/asm/bitops.h [new file with mode: 0644]
arch/alpha/include/asm/bug.h [new file with mode: 0644]
arch/alpha/include/asm/bugs.h [new file with mode: 0644]
arch/alpha/include/asm/byteorder.h [new file with mode: 0644]
arch/alpha/include/asm/cache.h [new file with mode: 0644]
arch/alpha/include/asm/cacheflush.h [new file with mode: 0644]
arch/alpha/include/asm/checksum.h [new file with mode: 0644]
arch/alpha/include/asm/compiler.h [new file with mode: 0644]
arch/alpha/include/asm/console.h [new file with mode: 0644]
arch/alpha/include/asm/core_apecs.h [new file with mode: 0644]
arch/alpha/include/asm/core_cia.h [new file with mode: 0644]
arch/alpha/include/asm/core_irongate.h [new file with mode: 0644]
arch/alpha/include/asm/core_lca.h [new file with mode: 0644]
arch/alpha/include/asm/core_marvel.h [new file with mode: 0644]
arch/alpha/include/asm/core_mcpcia.h [new file with mode: 0644]
arch/alpha/include/asm/core_polaris.h [new file with mode: 0644]
arch/alpha/include/asm/core_t2.h [new file with mode: 0644]
arch/alpha/include/asm/core_titan.h [new file with mode: 0644]
arch/alpha/include/asm/core_tsunami.h [new file with mode: 0644]
arch/alpha/include/asm/core_wildfire.h [new file with mode: 0644]
arch/alpha/include/asm/cputime.h [new file with mode: 0644]
arch/alpha/include/asm/current.h [new file with mode: 0644]
arch/alpha/include/asm/delay.h [new file with mode: 0644]
arch/alpha/include/asm/device.h [new file with mode: 0644]
arch/alpha/include/asm/div64.h [new file with mode: 0644]
arch/alpha/include/asm/dma-mapping.h [new file with mode: 0644]
arch/alpha/include/asm/dma.h [new file with mode: 0644]
arch/alpha/include/asm/elf.h [new file with mode: 0644]
arch/alpha/include/asm/emergency-restart.h [new file with mode: 0644]
arch/alpha/include/asm/err_common.h [new file with mode: 0644]
arch/alpha/include/asm/err_ev6.h [new file with mode: 0644]
arch/alpha/include/asm/err_ev7.h [new file with mode: 0644]
arch/alpha/include/asm/errno.h [new file with mode: 0644]
arch/alpha/include/asm/fb.h [new file with mode: 0644]
arch/alpha/include/asm/fcntl.h [new file with mode: 0644]
arch/alpha/include/asm/floppy.h [new file with mode: 0644]
arch/alpha/include/asm/fpu.h [new file with mode: 0644]
arch/alpha/include/asm/futex.h [new file with mode: 0644]
arch/alpha/include/asm/gct.h [new file with mode: 0644]
arch/alpha/include/asm/gentrap.h [new file with mode: 0644]
arch/alpha/include/asm/hardirq.h [new file with mode: 0644]
arch/alpha/include/asm/hw_irq.h [new file with mode: 0644]
arch/alpha/include/asm/hwrpb.h [new file with mode: 0644]
arch/alpha/include/asm/io.h [new file with mode: 0644]
arch/alpha/include/asm/io_trivial.h [new file with mode: 0644]
arch/alpha/include/asm/ioctl.h [new file with mode: 0644]
arch/alpha/include/asm/ioctls.h [new file with mode: 0644]
arch/alpha/include/asm/ipcbuf.h [new file with mode: 0644]
arch/alpha/include/asm/irq.h [new file with mode: 0644]
arch/alpha/include/asm/irq_regs.h [new file with mode: 0644]
arch/alpha/include/asm/jensen.h [new file with mode: 0644]
arch/alpha/include/asm/kdebug.h [new file with mode: 0644]
arch/alpha/include/asm/kmap_types.h [new file with mode: 0644]
arch/alpha/include/asm/linkage.h [new file with mode: 0644]
arch/alpha/include/asm/local.h [new file with mode: 0644]
arch/alpha/include/asm/machvec.h [new file with mode: 0644]
arch/alpha/include/asm/mc146818rtc.h [new file with mode: 0644]
arch/alpha/include/asm/md.h [new file with mode: 0644]
arch/alpha/include/asm/mman.h [new file with mode: 0644]
arch/alpha/include/asm/mmu.h [new file with mode: 0644]
arch/alpha/include/asm/mmu_context.h [new file with mode: 0644]
arch/alpha/include/asm/mmzone.h [new file with mode: 0644]
arch/alpha/include/asm/module.h [new file with mode: 0644]
arch/alpha/include/asm/msgbuf.h [new file with mode: 0644]
arch/alpha/include/asm/mutex.h [new file with mode: 0644]
arch/alpha/include/asm/page.h [new file with mode: 0644]
arch/alpha/include/asm/pal.h [new file with mode: 0644]
arch/alpha/include/asm/param.h [new file with mode: 0644]
arch/alpha/include/asm/parport.h [new file with mode: 0644]
arch/alpha/include/asm/pci.h [new file with mode: 0644]
arch/alpha/include/asm/percpu.h [new file with mode: 0644]
arch/alpha/include/asm/pgalloc.h [new file with mode: 0644]
arch/alpha/include/asm/pgtable.h [new file with mode: 0644]
arch/alpha/include/asm/poll.h [new file with mode: 0644]
arch/alpha/include/asm/posix_types.h [new file with mode: 0644]
arch/alpha/include/asm/processor.h [new file with mode: 0644]
arch/alpha/include/asm/ptrace.h [new file with mode: 0644]
arch/alpha/include/asm/reg.h [new file with mode: 0644]
arch/alpha/include/asm/regdef.h [new file with mode: 0644]
arch/alpha/include/asm/resource.h [new file with mode: 0644]
arch/alpha/include/asm/rtc.h [new file with mode: 0644]
arch/alpha/include/asm/rwsem.h [new file with mode: 0644]
arch/alpha/include/asm/scatterlist.h [new file with mode: 0644]
arch/alpha/include/asm/sections.h [new file with mode: 0644]
arch/alpha/include/asm/segment.h [new file with mode: 0644]
arch/alpha/include/asm/sembuf.h [new file with mode: 0644]
arch/alpha/include/asm/serial.h [new file with mode: 0644]
arch/alpha/include/asm/setup.h [new file with mode: 0644]
arch/alpha/include/asm/sfp-machine.h [new file with mode: 0644]
arch/alpha/include/asm/shmbuf.h [new file with mode: 0644]
arch/alpha/include/asm/shmparam.h [new file with mode: 0644]
arch/alpha/include/asm/sigcontext.h [new file with mode: 0644]
arch/alpha/include/asm/siginfo.h [new file with mode: 0644]
arch/alpha/include/asm/signal.h [new file with mode: 0644]
arch/alpha/include/asm/smp.h [new file with mode: 0644]
arch/alpha/include/asm/socket.h [new file with mode: 0644]
arch/alpha/include/asm/sockios.h [new file with mode: 0644]
arch/alpha/include/asm/spinlock.h [new file with mode: 0644]
arch/alpha/include/asm/spinlock_types.h [new file with mode: 0644]
arch/alpha/include/asm/stat.h [new file with mode: 0644]
arch/alpha/include/asm/statfs.h [new file with mode: 0644]
arch/alpha/include/asm/string.h [new file with mode: 0644]
arch/alpha/include/asm/suspend.h [new file with mode: 0644]
arch/alpha/include/asm/sysinfo.h [new file with mode: 0644]
arch/alpha/include/asm/system.h [new file with mode: 0644]
arch/alpha/include/asm/termbits.h [new file with mode: 0644]
arch/alpha/include/asm/termios.h [new file with mode: 0644]
arch/alpha/include/asm/thread_info.h [new file with mode: 0644]
arch/alpha/include/asm/timex.h [new file with mode: 0644]
arch/alpha/include/asm/tlb.h [new file with mode: 0644]
arch/alpha/include/asm/tlbflush.h [new file with mode: 0644]
arch/alpha/include/asm/topology.h [new file with mode: 0644]
arch/alpha/include/asm/types.h [new file with mode: 0644]
arch/alpha/include/asm/uaccess.h [new file with mode: 0644]
arch/alpha/include/asm/ucontext.h [new file with mode: 0644]
arch/alpha/include/asm/unaligned.h [new file with mode: 0644]
arch/alpha/include/asm/unistd.h [new file with mode: 0644]
arch/alpha/include/asm/user.h [new file with mode: 0644]
arch/alpha/include/asm/vga.h [new file with mode: 0644]
arch/alpha/include/asm/xor.h [new file with mode: 0644]
arch/arm/boot/compressed/.gitignore
arch/arm/common/dmabounce.c
arch/arm/configs/orion5x_defconfig
arch/arm/include/asm/dma-mapping.h
arch/arm/include/asm/kexec.h
arch/arm/include/asm/memory.h
arch/arm/include/asm/mtd-xip.h
arch/arm/include/asm/processor.h
arch/arm/include/asm/tlbflush.h
arch/arm/include/asm/unistd.h
arch/arm/kernel/.gitignore [new file with mode: 0644]
arch/arm/kernel/calls.S
arch/arm/kernel/machine_kexec.c
arch/arm/kernel/setup.c
arch/arm/kernel/traps.c
arch/arm/mach-footbridge/cats-pci.c
arch/arm/mach-integrator/cpu.c
arch/arm/mach-integrator/include/mach/platform.h
arch/arm/mach-kirkwood/common.c
arch/arm/mach-kirkwood/common.h
arch/arm/mach-kirkwood/include/mach/kirkwood.h
arch/arm/mach-kirkwood/irq.c
arch/arm/mach-kirkwood/pcie.c
arch/arm/mach-kirkwood/rd88f6192-nas-setup.c
arch/arm/mach-kirkwood/rd88f6281-setup.c
arch/arm/mach-lh7a40x/include/mach/ssp.h
arch/arm/mach-lh7a40x/lcd-panel.h
arch/arm/mach-loki/common.c
arch/arm/mach-loki/irq.c
arch/arm/mach-mv78xx0/common.c
arch/arm/mach-mv78xx0/irq.c
arch/arm/mach-mv78xx0/pcie.c
arch/arm/mach-orion5x/common.c
arch/arm/mach-orion5x/common.h
arch/arm/mach-orion5x/db88f5281-setup.c
arch/arm/mach-orion5x/include/mach/orion5x.h
arch/arm/mach-orion5x/irq.c
arch/arm/mach-orion5x/kurobox_pro-setup.c
arch/arm/mach-orion5x/mss2-setup.c
arch/arm/mach-orion5x/mv2120-setup.c
arch/arm/mach-orion5x/pci.c
arch/arm/mach-orion5x/rd88f5182-setup.c
arch/arm/mach-orion5x/ts209-setup.c
arch/arm/mach-orion5x/ts409-setup.c
arch/arm/mach-orion5x/ts78xx-setup.c
arch/arm/mach-pxa/include/mach/mtd-xip.h
arch/arm/mach-pxa/include/mach/poodle.h
arch/arm/mach-pxa/include/mach/pxafb.h
arch/arm/mach-s3c2410/include/mach/regs-clock.h
arch/arm/mach-s3c2410/include/mach/regs-gpio.h
arch/arm/mach-s3c2410/include/mach/regs-irq.h
arch/arm/mach-s3c2410/include/mach/regs-lcd.h
arch/arm/mach-s3c2410/include/mach/regs-mem.h
arch/arm/mach-s3c2410/mach-bast.c
arch/arm/mach-s3c2410/mach-smdk2410.c
arch/arm/mach-s3c2410/mach-vr1000.c
arch/arm/mach-s3c2412/mach-jive.c
arch/arm/mach-s3c2440/mach-anubis.c
arch/arm/mach-s3c2440/mach-osiris.c
arch/arm/mach-sa1100/cpu-sa1110.c
arch/arm/mach-sa1100/include/mach/mtd-xip.h
arch/arm/mm/cache-feroceon-l2.c
arch/arm/mm/mmu.c
arch/arm/mm/proc-arm940.S
arch/arm/mm/proc-arm946.S
arch/arm/plat-omap/include/mach/memory.h
arch/arm/plat-orion/include/plat/cache-feroceon-l2.h [new file with mode: 0644]
arch/arm/plat-orion/include/plat/ehci-orion.h [new file with mode: 0644]
arch/arm/plat-orion/include/plat/irq.h [new file with mode: 0644]
arch/arm/plat-orion/include/plat/mv_xor.h [new file with mode: 0644]
arch/arm/plat-orion/include/plat/orion_nand.h [new file with mode: 0644]
arch/arm/plat-orion/include/plat/pcie.h [new file with mode: 0644]
arch/arm/plat-orion/include/plat/time.h [new file with mode: 0644]
arch/arm/plat-orion/irq.c
arch/arm/plat-orion/pcie.c
arch/arm/plat-s3c24xx/cpu.c
arch/arm/tools/mach-types
arch/blackfin/Kconfig
arch/blackfin/configs/BlackStamp_defconfig [new file with mode: 0644]
arch/blackfin/configs/TCM-BF537_defconfig [new file with mode: 0644]
arch/blackfin/kernel/cplb-mpu/cacheinit.c
arch/blackfin/kernel/cplb-nompu/cacheinit.c
arch/blackfin/kernel/cplb-nompu/cplbinit.c
arch/blackfin/kernel/setup.c
arch/blackfin/kernel/traps.c
arch/blackfin/kernel/vmlinux.lds.S
arch/blackfin/lib/ins.S
arch/blackfin/mach-bf527/boards/cm_bf527.c
arch/blackfin/mach-bf527/boards/ezkit.c
arch/blackfin/mach-bf527/head.S
arch/blackfin/mach-bf527/ints-priority.c
arch/blackfin/mach-bf533/boards/H8606.c
arch/blackfin/mach-bf533/boards/Kconfig
arch/blackfin/mach-bf533/boards/Makefile
arch/blackfin/mach-bf533/boards/blackstamp.c [new file with mode: 0644]
arch/blackfin/mach-bf533/boards/cm_bf533.c
arch/blackfin/mach-bf533/boards/ezkit.c
arch/blackfin/mach-bf533/boards/stamp.c
arch/blackfin/mach-bf533/head.S
arch/blackfin/mach-bf533/ints-priority.c
arch/blackfin/mach-bf537/boards/Kconfig
arch/blackfin/mach-bf537/boards/Makefile
arch/blackfin/mach-bf537/boards/cm_bf537.c
arch/blackfin/mach-bf537/boards/generic_board.c
arch/blackfin/mach-bf537/boards/minotaur.c
arch/blackfin/mach-bf537/boards/pnav10.c
arch/blackfin/mach-bf537/boards/stamp.c
arch/blackfin/mach-bf537/boards/tcm_bf537.c [new file with mode: 0644]
arch/blackfin/mach-bf537/head.S
arch/blackfin/mach-bf537/ints-priority.c
arch/blackfin/mach-bf548/boards/cm_bf548.c
arch/blackfin/mach-bf548/boards/ezkit.c
arch/blackfin/mach-bf548/head.S
arch/blackfin/mach-bf548/ints-priority.c
arch/blackfin/mach-bf561/boards/cm_bf561.c
arch/blackfin/mach-bf561/boards/ezkit.c
arch/blackfin/mach-bf561/head.S
arch/blackfin/mach-bf561/ints-priority.c
arch/blackfin/mach-common/Makefile
arch/blackfin/mach-common/arch_checks.c
arch/blackfin/mach-common/cache.S
arch/blackfin/mach-common/cacheinit.S [deleted file]
arch/blackfin/mach-common/dpmc_modes.S
arch/blackfin/mach-common/entry.S
arch/blackfin/mach-common/head.S [new file with mode: 0644]
arch/blackfin/mach-common/ints-priority.c
arch/blackfin/mach-common/lock.S
arch/blackfin/mach-common/pm.c
arch/blackfin/mm/blackfin_sram.c
arch/ia64/configs/sn2_defconfig [deleted file]
arch/ia64/ia32/ia32_entry.S
arch/ia64/ia32/ia32priv.h
arch/ia64/ia32/sys_ia32.c
arch/ia64/include/asm/kexec.h
arch/ia64/kernel/smp.c
arch/ia64/pci/pci.c
arch/powerpc/include/asm/hvcall.h
arch/powerpc/include/asm/ide.h
arch/powerpc/include/asm/irqflags.h
arch/powerpc/include/asm/kexec.h
arch/powerpc/include/asm/mmu_context.h
arch/powerpc/include/asm/systbl.h
arch/powerpc/kernel/crash_dump.c
arch/powerpc/kernel/head_32.S
arch/powerpc/kernel/ibmebus.c
arch/powerpc/kernel/lparcfg.c
arch/powerpc/kernel/machine_kexec_32.c
arch/powerpc/kernel/misc_32.S
arch/powerpc/kernel/module.c
arch/powerpc/kernel/sys_ppc32.c
arch/powerpc/kernel/vio.c
arch/powerpc/platforms/cell/spufs/run.c
arch/powerpc/platforms/cell/spufs/sched.c
arch/powerpc/platforms/pseries/plpar_wrappers.h
arch/powerpc/platforms/pseries/setup.c
arch/s390/include/asm/kexec.h
arch/sh/boards/board-ap325rxa.c
arch/sh/boards/mach-migor/setup.c
arch/sh/boards/mach-sh7763rdp/setup.c
arch/sh/boards/mach-x3proto/setup.c
arch/sh/configs/sh7763rdp_defconfig
arch/sh/include/asm/flat.h
arch/sh/include/asm/kexec.h
arch/sh/include/asm/migor.h
arch/sh/include/asm/sh_mobile_lcdc.h
arch/sh/include/cpu-sh3/cpu/cacheflush.h
arch/sh/kernel/cpu/sh4a/setup-sh7723.c
arch/sh/kernel/sh_ksyms_32.c
arch/sh/mm/Kconfig
arch/sh/mm/consistent.c
arch/sparc64/mm/init.c
arch/x86/Kconfig
arch/x86/boot/boot.h
arch/x86/boot/cpu.c
arch/x86/boot/cpucheck.c
arch/x86/boot/main.c
arch/x86/boot/memory.c
arch/x86/kernel/acpi/boot.c
arch/x86/kernel/acpi/sleep.c
arch/x86/kernel/amd_iommu.c
arch/x86/kernel/amd_iommu_init.c
arch/x86/kernel/apic_32.c
arch/x86/kernel/apic_64.c
arch/x86/kernel/cpu/cpufreq/powernow-k8.c
arch/x86/kernel/cpu/cpufreq/powernow-k8.h
arch/x86/kernel/cpu/perfctr-watchdog.c
arch/x86/kernel/efi_32.c
arch/x86/kernel/genx2apic_uv_x.c
arch/x86/kernel/head64.c
arch/x86/kernel/hpet.c
arch/x86/kernel/machine_kexec_32.c
arch/x86/kernel/mfgpt_32.c
arch/x86/kernel/mmconf-fam10h_64.c
arch/x86/kernel/mpparse.c
arch/x86/kernel/msr.c
arch/x86/kernel/nmi.c
arch/x86/kernel/pci-calgary_64.c
arch/x86/kernel/process_32.c
arch/x86/kernel/process_64.c
arch/x86/kernel/relocate_kernel_32.S
arch/x86/kernel/setup.c
arch/x86/kernel/signal_64.c
arch/x86/kernel/smpboot.c
arch/x86/kernel/smpcommon.c
arch/x86/kernel/traps_64.c
arch/x86/kernel/tsc.c
arch/x86/kernel/visws_quirks.c
arch/x86/kernel/vmlinux_32.lds.S
arch/x86/mm/init_64.c
arch/x86/mm/ioremap.c
arch/x86/mm/pageattr-test.c
arch/x86/mm/pageattr.c
arch/x86/mm/srat_32.c
arch/x86/pci/irq.c
arch/x86/pci/legacy.c
arch/x86/pci/mmconfig-shared.c
arch/x86/power/cpu_32.c
arch/x86/power/hibernate_asm_32.S
drivers/acpi/dock.c
drivers/acpi/ec.c
drivers/acpi/executer/exconfig.c
drivers/acpi/namespace/nsnames.c
drivers/acpi/pci_link.c
drivers/acpi/processor_core.c
drivers/acpi/processor_idle.c
drivers/acpi/processor_perflib.c
drivers/acpi/resources/rscalc.c
drivers/acpi/utilities/utalloc.c
drivers/acpi/utilities/utdelete.c
drivers/acpi/utilities/utobject.c
drivers/acpi/wmi.c
drivers/block/brd.c
drivers/block/nbd.c
drivers/bluetooth/Kconfig
drivers/bluetooth/bt3c_cs.c
drivers/bluetooth/btusb.c
drivers/bluetooth/hci_ldisc.c
drivers/bluetooth/hci_usb.c
drivers/bluetooth/hci_vhci.c
drivers/cdrom/cdrom.c
drivers/cdrom/gdrom.c
drivers/cdrom/viocd.c
drivers/char/ipmi/ipmi_si_intf.c
drivers/char/pcmcia/ipwireless/tty.c
drivers/char/synclink_gt.c
drivers/char/tty_io.c
drivers/char/vt.c
drivers/char/vt_ioctl.c
drivers/char/xilinx_hwicap/xilinx_hwicap.c
drivers/cpuidle/governors/ladder.c
drivers/cpuidle/governors/menu.c
drivers/dma/mv_xor.c
drivers/firewire/Kconfig
drivers/hid/usbhid/hid-quirks.c
drivers/hwmon/Kconfig
drivers/hwmon/Makefile
drivers/hwmon/abituguru3.c
drivers/hwmon/adcxx.c [new file with mode: 0644]
drivers/hwmon/applesmc.c
drivers/hwmon/coretemp.c
drivers/hwmon/hwmon-vid.c
drivers/hwmon/i5k_amb.c
drivers/hwmon/ibmaem.c
drivers/hwmon/w83791d.c
drivers/ide/ide-cd.c
drivers/ide/pci/aec62xx.c
drivers/ide/pci/cy82c693.c
drivers/ide/pci/hpt366.c
drivers/ide/pci/it821x.c
drivers/ide/pci/pdc202xx_new.c
drivers/ide/pci/scc_pata.c
drivers/ide/pci/sgiioc4.c
drivers/ide/pci/siimage.c
drivers/ide/pci/sis5513.c
drivers/ide/pci/tc86c001.c
drivers/ide/pci/via82cxxx.c
drivers/ieee1394/nodemgr.c
drivers/ieee1394/nodemgr.h
drivers/ieee1394/sbp2.c
drivers/input/evdev.c
drivers/input/joystick/xpad.c
drivers/input/keyboard/gpio_keys.c
drivers/input/misc/cobalt_btns.c
drivers/input/mouse/Kconfig
drivers/input/mouse/Makefile
drivers/input/mouse/bcm5974.c [new file with mode: 0644]
drivers/input/mouse/gpio_mouse.c
drivers/input/serio/i8042-x86ia64io.h
drivers/input/serio/xilinx_ps2.c
drivers/input/tablet/gtco.c
drivers/input/touchscreen/Kconfig
drivers/input/touchscreen/migor_ts.c
drivers/input/touchscreen/wm9705.c
drivers/input/touchscreen/wm9712.c
drivers/input/touchscreen/wm9713.c
drivers/input/touchscreen/wm97xx-core.c
drivers/md/md.c
drivers/md/raid10.c
drivers/md/raid5.c
drivers/misc/acer-wmi.c
drivers/misc/eeepc-laptop.c
drivers/mmc/host/s3cmci.c
drivers/mmc/host/sdricoh_cs.c
drivers/mtd/nand/orion_nand.c
drivers/net/wireless/Kconfig
drivers/net/wireless/Makefile
drivers/net/wireless/airo.c
drivers/net/wireless/airport.c
drivers/net/wireless/ath5k/ath5k.h
drivers/net/wireless/ath5k/base.c
drivers/net/wireless/ath5k/base.h
drivers/net/wireless/ath5k/hw.c
drivers/net/wireless/b43legacy/xmit.c
drivers/net/wireless/hermes.c
drivers/net/wireless/hermes.h
drivers/net/wireless/hermes_dld.c [new file with mode: 0644]
drivers/net/wireless/hermes_dld.h [new file with mode: 0644]
drivers/net/wireless/hermes_rid.h
drivers/net/wireless/ipw2100.c
drivers/net/wireless/ipw2200.h
drivers/net/wireless/iwlwifi/iwl-3945-debug.h
drivers/net/wireless/iwlwifi/iwl-3945.c
drivers/net/wireless/iwlwifi/iwl-3945.h
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-debug.h
drivers/net/wireless/iwlwifi/iwl-dev.h
drivers/net/wireless/iwlwifi/iwl-hcmd.c
drivers/net/wireless/iwlwifi/iwl-rx.c
drivers/net/wireless/iwlwifi/iwl-tx.c
drivers/net/wireless/iwlwifi/iwl3945-base.c
drivers/net/wireless/libertas/cmd.c
drivers/net/wireless/libertas/defs.h
drivers/net/wireless/libertas/if_cs.c
drivers/net/wireless/libertas/if_usb.c
drivers/net/wireless/libertas/if_usb.h
drivers/net/wireless/libertas_tf/Makefile [new file with mode: 0644]
drivers/net/wireless/libertas_tf/cmd.c [new file with mode: 0644]
drivers/net/wireless/libertas_tf/if_usb.c [new file with mode: 0644]
drivers/net/wireless/libertas_tf/if_usb.h [new file with mode: 0644]
drivers/net/wireless/libertas_tf/libertas_tf.h [new file with mode: 0644]
drivers/net/wireless/libertas_tf/main.c [new file with mode: 0644]
drivers/net/wireless/orinoco.c
drivers/net/wireless/orinoco.h
drivers/net/wireless/orinoco_cs.c
drivers/net/wireless/orinoco_nortel.c
drivers/net/wireless/orinoco_pci.c
drivers/net/wireless/orinoco_plx.c
drivers/net/wireless/orinoco_tmd.c
drivers/net/wireless/p54/p54.h
drivers/net/wireless/p54/p54common.h
drivers/net/wireless/p54/p54pci.c
drivers/net/wireless/p54/p54pci.h
drivers/net/wireless/p54/p54usb.c
drivers/net/wireless/p54/p54usb.h
drivers/net/wireless/prism54/isl_ioctl.c
drivers/net/wireless/rt2x00/Kconfig
drivers/net/wireless/rt2x00/Makefile
drivers/net/wireless/rt2x00/rt2400pci.c
drivers/net/wireless/rt2x00/rt2400pci.h
drivers/net/wireless/rt2x00/rt2500pci.c
drivers/net/wireless/rt2x00/rt2500pci.h
drivers/net/wireless/rt2x00/rt2500usb.c
drivers/net/wireless/rt2x00/rt2500usb.h
drivers/net/wireless/rt2x00/rt2x00.h
drivers/net/wireless/rt2x00/rt2x00config.c
drivers/net/wireless/rt2x00/rt2x00crypto.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00debug.c
drivers/net/wireless/rt2x00/rt2x00dev.c
drivers/net/wireless/rt2x00/rt2x00lib.h
drivers/net/wireless/rt2x00/rt2x00mac.c
drivers/net/wireless/rt2x00/rt2x00queue.c
drivers/net/wireless/rt2x00/rt2x00queue.h
drivers/net/wireless/rt2x00/rt2x00reg.h
drivers/net/wireless/rt2x00/rt61pci.c
drivers/net/wireless/rt2x00/rt61pci.h
drivers/net/wireless/rt2x00/rt73usb.c
drivers/net/wireless/rt2x00/rt73usb.h
drivers/net/wireless/rtl8180.h
drivers/net/wireless/rtl8180_dev.c
drivers/net/wireless/rtl8187.h
drivers/net/wireless/rtl8187_dev.c
drivers/net/wireless/rtl818x.h
drivers/net/wireless/spectrum_cs.c
drivers/net/wireless/wl3501_cs.c
drivers/of/device.c
drivers/pci/hotplug/acpi_pcihp.c
drivers/pci/pcie/aer/aerdrv_acpi.c
drivers/pci/probe.c
drivers/pci/setup-bus.c
drivers/pcmcia/pxa2xx_palmtx.c
drivers/rtc/Kconfig
drivers/rtc/rtc-bfin.c
drivers/rtc/rtc-dev.c
drivers/rtc/rtc-ds1374.c
drivers/scsi/device_handler/scsi_dh_rdac.c
drivers/scsi/ibmvscsi/ibmvfc.c
drivers/scsi/ibmvscsi/ibmvfc.h
drivers/scsi/ibmvscsi/ibmvscsi.c
drivers/scsi/megaraid/megaraid_sas.c
drivers/scsi/megaraid/megaraid_sas.h
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_def.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_version.h
drivers/serial/Kconfig
drivers/spi/spi.c
drivers/usb/host/ehci-orion.c
drivers/video/bf54x-lq043fb.c
drivers/video/fb_defio.c
drivers/video/fbmem.c
drivers/video/fsl-diu-fb.c
drivers/video/pm2fb.c
drivers/video/pxafb.c
drivers/video/sh_mobile_lcdcfb.c
drivers/watchdog/s3c2410_wdt.c
fs/binfmt_flat.c
fs/binfmt_misc.c
fs/cifs/cifsfs.c
fs/cifs/inode.c
fs/cramfs/inode.c
fs/fat/inode.c
fs/inode.c
fs/ioprio.c
fs/omfs/bitmap.c
fs/omfs/file.c
fs/omfs/inode.c
fs/proc/nommu.c
fs/proc/task_mmu.c
fs/ubifs/budget.c
fs/ubifs/commit.c
fs/ubifs/debug.c
fs/ubifs/debug.h
fs/ubifs/dir.c
fs/ubifs/file.c
fs/ubifs/find.c
fs/ubifs/io.c
fs/ubifs/journal.c
fs/ubifs/log.c
fs/ubifs/misc.h
fs/ubifs/orphan.c
fs/ubifs/super.c
fs/ubifs/tnc_commit.c
fs/ubifs/ubifs-media.h
fs/ubifs/ubifs.h
fs/ubifs/xattr.c
include/acpi/acnamesp.h
include/asm-alpha/8253pit.h [deleted file]
include/asm-alpha/Kbuild [deleted file]
include/asm-alpha/a.out-core.h [deleted file]
include/asm-alpha/a.out.h [deleted file]
include/asm-alpha/agp.h [deleted file]
include/asm-alpha/agp_backend.h [deleted file]
include/asm-alpha/atomic.h [deleted file]
include/asm-alpha/auxvec.h [deleted file]
include/asm-alpha/barrier.h [deleted file]
include/asm-alpha/bitops.h [deleted file]
include/asm-alpha/bug.h [deleted file]
include/asm-alpha/bugs.h [deleted file]
include/asm-alpha/byteorder.h [deleted file]
include/asm-alpha/cache.h [deleted file]
include/asm-alpha/cacheflush.h [deleted file]
include/asm-alpha/checksum.h [deleted file]
include/asm-alpha/compiler.h [deleted file]
include/asm-alpha/console.h [deleted file]
include/asm-alpha/core_apecs.h [deleted file]
include/asm-alpha/core_cia.h [deleted file]
include/asm-alpha/core_irongate.h [deleted file]
include/asm-alpha/core_lca.h [deleted file]
include/asm-alpha/core_marvel.h [deleted file]
include/asm-alpha/core_mcpcia.h [deleted file]
include/asm-alpha/core_polaris.h [deleted file]
include/asm-alpha/core_t2.h [deleted file]
include/asm-alpha/core_titan.h [deleted file]
include/asm-alpha/core_tsunami.h [deleted file]
include/asm-alpha/core_wildfire.h [deleted file]
include/asm-alpha/cputime.h [deleted file]
include/asm-alpha/current.h [deleted file]
include/asm-alpha/delay.h [deleted file]
include/asm-alpha/device.h [deleted file]
include/asm-alpha/div64.h [deleted file]
include/asm-alpha/dma-mapping.h [deleted file]
include/asm-alpha/dma.h [deleted file]
include/asm-alpha/elf.h [deleted file]
include/asm-alpha/emergency-restart.h [deleted file]
include/asm-alpha/err_common.h [deleted file]
include/asm-alpha/err_ev6.h [deleted file]
include/asm-alpha/err_ev7.h [deleted file]
include/asm-alpha/errno.h [deleted file]
include/asm-alpha/fb.h [deleted file]
include/asm-alpha/fcntl.h [deleted file]
include/asm-alpha/floppy.h [deleted file]
include/asm-alpha/fpu.h [deleted file]
include/asm-alpha/futex.h [deleted file]
include/asm-alpha/gct.h [deleted file]
include/asm-alpha/gentrap.h [deleted file]
include/asm-alpha/hardirq.h [deleted file]
include/asm-alpha/hw_irq.h [deleted file]
include/asm-alpha/hwrpb.h [deleted file]
include/asm-alpha/io.h [deleted file]
include/asm-alpha/io_trivial.h [deleted file]
include/asm-alpha/ioctl.h [deleted file]
include/asm-alpha/ioctls.h [deleted file]
include/asm-alpha/ipcbuf.h [deleted file]
include/asm-alpha/irq.h [deleted file]
include/asm-alpha/irq_regs.h [deleted file]
include/asm-alpha/jensen.h [deleted file]
include/asm-alpha/kdebug.h [deleted file]
include/asm-alpha/kmap_types.h [deleted file]
include/asm-alpha/linkage.h [deleted file]
include/asm-alpha/local.h [deleted file]
include/asm-alpha/machvec.h [deleted file]
include/asm-alpha/mc146818rtc.h [deleted file]
include/asm-alpha/md.h [deleted file]
include/asm-alpha/mman.h [deleted file]
include/asm-alpha/mmu.h [deleted file]
include/asm-alpha/mmu_context.h [deleted file]
include/asm-alpha/mmzone.h [deleted file]
include/asm-alpha/module.h [deleted file]
include/asm-alpha/msgbuf.h [deleted file]
include/asm-alpha/mutex.h [deleted file]
include/asm-alpha/page.h [deleted file]
include/asm-alpha/pal.h [deleted file]
include/asm-alpha/param.h [deleted file]
include/asm-alpha/parport.h [deleted file]
include/asm-alpha/pci.h [deleted file]
include/asm-alpha/percpu.h [deleted file]
include/asm-alpha/pgalloc.h [deleted file]
include/asm-alpha/pgtable.h [deleted file]
include/asm-alpha/poll.h [deleted file]
include/asm-alpha/posix_types.h [deleted file]
include/asm-alpha/processor.h [deleted file]
include/asm-alpha/ptrace.h [deleted file]
include/asm-alpha/reg.h [deleted file]
include/asm-alpha/regdef.h [deleted file]
include/asm-alpha/resource.h [deleted file]
include/asm-alpha/rtc.h [deleted file]
include/asm-alpha/rwsem.h [deleted file]
include/asm-alpha/scatterlist.h [deleted file]
include/asm-alpha/sections.h [deleted file]
include/asm-alpha/segment.h [deleted file]
include/asm-alpha/sembuf.h [deleted file]
include/asm-alpha/serial.h [deleted file]
include/asm-alpha/setup.h [deleted file]
include/asm-alpha/sfp-machine.h [deleted file]
include/asm-alpha/shmbuf.h [deleted file]
include/asm-alpha/shmparam.h [deleted file]
include/asm-alpha/sigcontext.h [deleted file]
include/asm-alpha/siginfo.h [deleted file]
include/asm-alpha/signal.h [deleted file]
include/asm-alpha/smp.h [deleted file]
include/asm-alpha/socket.h [deleted file]
include/asm-alpha/sockios.h [deleted file]
include/asm-alpha/spinlock.h [deleted file]
include/asm-alpha/spinlock_types.h [deleted file]
include/asm-alpha/stat.h [deleted file]
include/asm-alpha/statfs.h [deleted file]
include/asm-alpha/string.h [deleted file]
include/asm-alpha/suspend.h [deleted file]
include/asm-alpha/sysinfo.h [deleted file]
include/asm-alpha/system.h [deleted file]
include/asm-alpha/termbits.h [deleted file]
include/asm-alpha/termios.h [deleted file]
include/asm-alpha/thread_info.h [deleted file]
include/asm-alpha/timex.h [deleted file]
include/asm-alpha/tlb.h [deleted file]
include/asm-alpha/tlbflush.h [deleted file]
include/asm-alpha/topology.h [deleted file]
include/asm-alpha/types.h [deleted file]
include/asm-alpha/uaccess.h [deleted file]
include/asm-alpha/ucontext.h [deleted file]
include/asm-alpha/unaligned.h [deleted file]
include/asm-alpha/unistd.h [deleted file]
include/asm-alpha/user.h [deleted file]
include/asm-alpha/vga.h [deleted file]
include/asm-alpha/xor.h [deleted file]
include/asm-arm/plat-orion/cache-feroceon-l2.h [deleted file]
include/asm-arm/plat-orion/ehci-orion.h [deleted file]
include/asm-arm/plat-orion/irq.h [deleted file]
include/asm-arm/plat-orion/mv_xor.h [deleted file]
include/asm-arm/plat-orion/orion_nand.h [deleted file]
include/asm-arm/plat-orion/pcie.h [deleted file]
include/asm-arm/plat-orion/time.h [deleted file]
include/asm-arm/plat-s3c/regs-nand.h
include/asm-arm/plat-s3c/regs-timer.h
include/asm-arm/plat-s3c/regs-watchdog.h
include/asm-arm/plat-s3c24xx/s3c2410.h
include/asm-blackfin/Kbuild
include/asm-blackfin/bfin-global.h
include/asm-blackfin/dpmc.h
include/asm-blackfin/fixed_code.h
include/asm-blackfin/mach-bf527/mem_map.h
include/asm-blackfin/mach-bf533/mem_init.h
include/asm-blackfin/mach-bf533/mem_map.h
include/asm-blackfin/mach-bf537/mem_map.h
include/asm-blackfin/mach-common/cdef_LPBlackfin.h
include/asm-blackfin/unistd.h
include/asm-cris/Kbuild
include/asm-frv/io.h
include/asm-mips/kexec.h
include/asm-mn10300/io.h
include/asm-x86/amd_iommu_types.h
include/asm-x86/atomic_64.h
include/asm-x86/geode.h
include/asm-x86/i387.h
include/asm-x86/io.h
include/asm-x86/kexec.h
include/asm-x86/mman.h
include/asm-x86/mmconfig.h
include/asm-x86/mmzone_32.h
include/asm-x86/percpu.h
include/asm-x86/pgtable_64.h
include/asm-x86/processor.h
include/asm-x86/spinlock.h
include/linux/Kbuild
include/linux/ata.h
include/linux/capability.h
include/linux/completion.h
include/linux/exportfs.h
include/linux/fb.h
include/linux/ftrace.h
include/linux/if_ether.h
include/linux/ivtv.h
include/linux/ivtvfb.h
include/linux/kexec.h
include/linux/mm.h
include/linux/mm_types.h
include/linux/pci-acpi.h
include/linux/pci_ids.h
include/linux/pid.h
include/linux/reboot.h
include/linux/rfkill.h
include/linux/rmap.h
include/linux/security.h
include/linux/suspend.h
include/linux/tty.h
include/linux/tty_driver.h
include/linux/videodev2.h
include/linux/vmalloc.h
include/linux/vt_kern.h
include/net/mac80211.h
include/net/sch_generic.h
include/scsi/scsi_device.h
init/Kconfig
kernel/capability.c
kernel/kexec.c
kernel/lockdep.c
kernel/lockdep_internals.h
kernel/lockdep_proc.c
kernel/ptrace.c
kernel/sched.c
kernel/sched_rt.c
kernel/signal.c
kernel/spinlock.c
kernel/sys.c
lib/Kconfig.debug
lib/lmb.c
mm/bootmem.c
mm/filemap_xip.c
mm/mm_init.c
mm/oom_kill.c
mm/rmap.c
mm/swap_state.c
net/Kconfig
net/bluetooth/af_bluetooth.c
net/bluetooth/bnep/core.c
net/bluetooth/hci_sysfs.c
net/bluetooth/l2cap.c
net/bluetooth/rfcomm/core.c
net/bluetooth/sco.c
net/core/dev.c
net/core/gen_estimator.c
net/ieee80211/ieee80211_module.c
net/ipv4/tcp_input.c
net/mac80211/cfg.c
net/mac80211/debugfs_sta.c
net/mac80211/event.c
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/main.c
net/mac80211/mesh.c
net/mac80211/mesh.h
net/mac80211/mesh_hwmp.c
net/mac80211/mesh_pathtbl.c
net/mac80211/mesh_plink.c
net/mac80211/mlme.c
net/mac80211/rx.c
net/mac80211/tx.c
net/mac80211/util.c
net/mac80211/wep.c
net/mac80211/wext.c
net/mac80211/wme.h
net/mac80211/wpa.c
net/rfkill/rfkill-input.h
net/rfkill/rfkill.c
net/sched/sch_api.c
net/sched/sch_cbq.c
net/sctp/endpointola.c
net/sctp/socket.c
security/capability.c
security/commoncap.c
security/root_plug.c
security/security.c
security/selinux/hooks.c
security/smack/smack_lsm.c
sound/pci/Kconfig
sound/pci/hda/patch_realtek.c
sound/pci/oxygen/virtuoso.c
sound/soc/codecs/wm8990.c
sound/soc/codecs/wm8990.h

index b5d20c0b2ab46d60472797dad8dcf197971d9199..ea7ccfc4b274f5dcf269d9d239c8aeaf36cb4a6c 100644 (file)
@@ -13,6 +13,21 @@ Introduction
   data-sheet/users manual to find out the complete list.
 
 
+GPIOLIB
+-------
+
+  With the event of the GPIOLIB in drivers/gpio, support for some
+  of the GPIO functions such as reading and writing a pin will
+  be removed in favour of this common access method.
+
+  Once all the extant drivers have been converted, the functions
+  listed below will be removed (they may be marked as __deprecated
+  in the near future).
+
+  - s3c2410_gpio_getpin
+  - s3c2410_gpio_setpin
+
+
 Headers
 -------
 
index 014a8ec4877d296be7864abd82e663fb93e8c8f0..cff6227b44844dae251e4425468c3c099f58d272 100644 (file)
@@ -8,9 +8,10 @@ Introduction
 
   The Samsung S3C24XX range of ARM9 System-on-Chip CPUs are supported
   by the 's3c2410' architecture of ARM Linux. Currently the S3C2410,
-  S3C2412, S3C2413, S3C2440 and S3C2442 devices are supported.
+  S3C2412, S3C2413, S3C2440, S3C2442 and S3C2443 devices are supported.
+
+  Support for the S3C2400 and S3C24A0 series are in progress.
 
-  Support for the S3C2400 series is in progress.
 
 Configuration
 -------------
@@ -38,6 +39,22 @@ Layout
   Register, kernel and platform data definitions are held in the
   arch/arm/mach-s3c2410 directory./include/mach
 
+arch/arm/plat-s3c24xx:
+
+  Files in here are either common to all the s3c24xx family,
+  or are common to only some of them with names to indicate this
+  status. The files that are not common to all are generally named
+  with the initial cpu they support in the series to ensure a short
+  name without any possibility of confusion with newer devices.
+
+  As an example, initially s3c244x would cover s3c2440 and s3c2442, but
+  with the s3c2443 which does not share many of the same drivers in
+  this directory, the name becomes invalid. We stick to s3c2440-<x>
+  to indicate a driver that is s3c2440 and s3c2442 compatible.
+
+  This does mean that to find the status of any given SoC, a number
+  of directories may need to be searched.
+
 
 Machines
 --------
@@ -159,6 +176,17 @@ NAND
   For more information see Documentation/arm/Samsung-S3C24XX/NAND.txt
 
 
+SD/MMC
+------
+
+  The SD/MMC hardware pre S3C2443 is supported in the current
+  kernel, the driver is drivers/mmc/host/s3cmci.c and supports
+  1 and 4 bit SD or MMC cards.
+
+  The SDIO behaviour of this driver has not been fully tested. There is no
+  current support for hardware SDIO interrupts.
+
+
 Serial
 ------
 
@@ -178,6 +206,9 @@ GPIO
   The core contains support for manipulating the GPIO, see the
   documentation in GPIO.txt in the same directory as this file.
 
+  Newer kernels carry GPIOLIB, and support is being moved towards
+  this with some of the older support in line to be removed.
+
 
 Clock Management
 ----------------
index 540e9e7f59c53f083f105432a7a7be28f53eb2d3..6a0d70a22f05f238cb1da86208437818f192b495 100644 (file)
@@ -57,7 +57,7 @@ Similarly to JFFS2, UBIFS supports on-the-flight compression which makes
 it possible to fit quite a lot of data to the flash.
 
 Similarly to JFFS2, UBIFS is tolerant of unclean reboots and power-cuts.
-It does not need stuff like ckfs.ext2. UBIFS automatically replays its
+It does not need stuff like fsck.ext2. UBIFS automatically replays its
 journal and recovers from crashes, ensuring that the on-flash data
 structures are consistent.
 
index 2fefaf582a43b928b48b0e196fab6445b28aa171..e98bdfea3467f679411f86d8f82be7ea421da491 100644 (file)
@@ -1,8 +1,11 @@
 Kernel driver ibmaem
 ======================
 
+This driver talks to the IBM Systems Director Active Energy Manager, known
+henceforth as AEM.
+
 Supported systems:
-  * Any recent IBM System X server with Active Energy Manager support.
+  * Any recent IBM System X server with AEM support.
     This includes the x3350, x3550, x3650, x3655, x3755, x3850 M2,
     x3950 M2, and certain HS2x/LS2x/QS2x blades.  The IPMI host interface
     driver ("ipmi-si") needs to be loaded for this driver to do anything.
@@ -14,24 +17,22 @@ Author: Darrick J. Wong
 Description
 -----------
 
-This driver implements sensor reading support for the energy and power
-meters available on various IBM System X hardware through the BMC.  All
-sensor banks will be exported as platform devices; this driver can talk
-to both v1 and v2 interfaces.  This driver is completely separate from the
-older ibmpex driver.
+This driver implements sensor reading support for the energy and power meters
+available on various IBM System X hardware through the BMC.  All sensor banks
+will be exported as platform devices; this driver can talk to both v1 and v2
+interfaces.  This driver is completely separate from the older ibmpex driver.
 
-The v1 AEM interface has a simple set of features to monitor energy use.
-There is a register that displays an estimate of raw energy consumption
-since the last BMC reset, and a power sensor that returns average power
-use over a configurable interval.
+The v1 AEM interface has a simple set of features to monitor energy use.  There
+is a register that displays an estimate of raw energy consumption since the
+last BMC reset, and a power sensor that returns average power use over a
+configurable interval.
 
-The v2 AEM interface is a bit more sophisticated, being able to present
-a wider range of energy and power use registers, the power cap as
-set by the AEM software, and temperature sensors.
+The v2 AEM interface is a bit more sophisticated, being able to present a wider
+range of energy and power use registers, the power cap as set by the AEM
+software, and temperature sensors.
 
 Special Features
 ----------------
 
-The "power_cap" value displays the current system power cap, as set by
-the Active Energy Manager software.  Setting the power cap from the host
-is not currently supported.
+The "power_cap" value displays the current system power cap, as set by the AEM
+software.  Setting the power cap from the host is not currently supported.
index e7bea3e853044e54f3ee863ad3d295b0df84a522..a8976467a983c5e6c3d5b9f25eb61cc63264803e 100644 (file)
@@ -365,6 +365,8 @@ and is between 256 and 4096 characters. It is defined in the file
                        no delay (0).
                        Format: integer
 
+       bootmem_debug   [KNL] Enable bootmem allocator debug messages.
+
        bttv.card=      [HW,V4L] bttv (bt848 + bt878 based grabber cards)
        bttv.radio=     Most important insmod options are available as
                        kernel args too.
index 716fcc1cafb5cac5f1e13aa6be971825687a2f04..c851ef49779566a970e8e64c15385e2cf6f80033 100644 (file)
@@ -1,3 +1,26 @@
+
+1 Release Date    : Thur.July. 24 11:41:51 PST 2008 -
+                       (emaild-id:megaraidlinux@lsi.com)
+                       Sumant Patro
+                       Bo Yang
+
+2 Current Version : 00.00.04.01
+3 Older Version   : 00.00.03.22
+
+1. Add the new controller (0078, 0079) support to the driver
+       Those controllers are LSI's next generatation(gen2) SAS controllers.
+
+1 Release Date    : Mon.June. 23 10:12:45 PST 2008 -
+                       (emaild-id:megaraidlinux@lsi.com)
+                       Sumant Patro
+                       Bo Yang
+
+2 Current Version : 00.00.03.22
+3 Older Version   : 00.00.03.20
+
+1. Add shutdown DCMD cmd to the shutdown routine to make FW shutdown proper.
+2. Unexpected interrupt occurs in HWR Linux driver, add the dumy readl pci flush will fix this issue.
+
 1 Release Date    : Mon. March 10 11:02:31 PDT 2008 -
                        (emaild-id:megaraidlinux@lsi.com)
                        Sumant Patro
index 6f6d117ac7e22cd2d9fc981f0fc8542d824d1db8..b117e42a616686e6ef6156a80e07ee4ff2d2e485 100644 (file)
@@ -1144,8 +1144,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
 
     This module supports autoprobe and multiple cards.
 
-    Power management is _not_ supported.
-
   Module snd-ice1712
   ------------------
 
@@ -1628,8 +1626,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
 
     This module supports autoprobe and multiple cards.
 
-    Power management is _not_ supported.
-
   Module snd-pcsp
   -----------------
 
@@ -2081,13 +2077,11 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
   Module snd-virtuoso
   -------------------
 
-    Module for sound cards based on the Asus AV200 chip, i.e.,
-    Xonar D2 and Xonar D2X.
+    Module for sound cards based on the Asus AV100/AV200 chips,
+    i.e., Xonar D1, DX, D2 and D2X.
 
     This module supports autoprobe and multiple cards.
 
-    Power management is _not_ supported.
-
   Module snd-vx222
   ----------------
 
index 99f89aa101697d553f60602022694c945de9dd80..d5fdfd34bbaf4835bd7381b93cdd09774f8b9b01 100644 (file)
@@ -18,10 +18,11 @@ migrate_pages function call takes two sets of nodes and moves pages of a
 process that are located on the from nodes to the destination nodes.
 Page migration functions are provided by the numactl package by Andi Kleen
 (a version later than 0.9.3 is required. Get it from
-ftp://ftp.suse.com/pub/people/ak). numactl provided libnuma which
-provides an interface similar to other numa functionality for page migration.
-cat /proc/<pid>/numa_maps allows an easy review of where the pages of
-a process are located. See also the numa_maps manpage in the numactl package.
+ftp://oss.sgi.com/www/projects/libnuma/download/). numactl provides libnuma
+which provides an interface similar to other numa functionality for page
+migration.  cat /proc/<pid>/numa_maps allows an easy review of where the
+pages of a process are located. See also the numa_maps documentation in the
+proc(5) man page.
 
 Manual migration is useful if for example the scheduler has relocated
 a process to a processor on a distant node. A batch scheduler or an
index 4c5e9fe0f7db5cd80b3fe2c4a76d38a3df1d7fcc..28c69aaefcd94601a1bf8e3d096e2f89a5d1b5a8 100644 (file)
@@ -175,12 +175,18 @@ M:        bcrl@kvack.org
 L:     linux-aio@kvack.org
 S:     Supported
 
-ABIT UGURU HARDWARE MONITOR DRIVER
+ABIT UGURU 1,2 HARDWARE MONITOR DRIVER
 P:     Hans de Goede
 M:     j.w.r.degoede@hhs.nl
 L:     lm-sensors@lm-sensors.org
 S:     Maintained
 
+ABIT UGURU 3 HARDWARE MONITOR DRIVER
+P:     Alistair John Strachan
+M:     alistair@devzero.co.uk
+L:     lm-sensors@lm-sensors.org
+S:     Maintained
+
 ACENIC DRIVER
 P:     Jes Sorensen
 M:     jes@trained-monkey.org
@@ -936,94 +942,19 @@ M:        joern@lazybastard.org
 L:     linux-mtd@lists.infradead.org
 S:     Maintained
 
-BLUETOOTH SUBSYSTEM
+BLUETOOTH DRIVERS
 P:     Marcel Holtmann
 M:     marcel@holtmann.org
-P:     Maxim Krasnyansky
-M:     maxk@qualcomm.com
 L:     linux-bluetooth@vger.kernel.org
-W:     http://bluez.sf.net
-W:     http://www.bluez.org
-W:     http://www.holtmann.org/linux/bluetooth/
-T:     git kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git
-S:     Maintained
-
-BLUETOOTH RFCOMM LAYER
-P:     Marcel Holtmann
-M:     marcel@holtmann.org
-P:     Maxim Krasnyansky
-M:     maxk@qualcomm.com
-S:     Maintained
-
-BLUETOOTH BNEP LAYER
-P:     Marcel Holtmann
-M:     marcel@holtmann.org
-P:     Maxim Krasnyansky
-M:     maxk@qualcomm.com
-S:     Maintained
-
-BLUETOOTH CMTP LAYER
-P:     Marcel Holtmann
-M:     marcel@holtmann.org
-S:     Maintained
-
-BLUETOOTH HIDP LAYER
-P:     Marcel Holtmann
-M:     marcel@holtmann.org
-S:     Maintained
-
-BLUETOOTH HCI UART DRIVER
-P:     Marcel Holtmann
-M:     marcel@holtmann.org
-P:     Maxim Krasnyansky
-M:     maxk@qualcomm.com
-S:     Maintained
-
-BLUETOOTH HCI USB DRIVER
-P:     Marcel Holtmann
-M:     marcel@holtmann.org
-P:     Maxim Krasnyansky
-M:     maxk@qualcomm.com
-S:     Maintained
-
-BLUETOOTH HCI BCM203X DRIVER
-P:     Marcel Holtmann
-M:     marcel@holtmann.org
-S:     Maintained
-
-BLUETOOTH HCI BPA10X DRIVER
-P:     Marcel Holtmann
-M:     marcel@holtmann.org
+W:     http://www.bluez.org/
 S:     Maintained
 
-BLUETOOTH HCI BFUSB DRIVER
-P:     Marcel Holtmann
-M:     marcel@holtmann.org
-S:     Maintained
-
-BLUETOOTH HCI DTL1 DRIVER
-P:     Marcel Holtmann
-M:     marcel@holtmann.org
-S:     Maintained
-
-BLUETOOTH HCI BLUECARD DRIVER
-P:     Marcel Holtmann
-M:     marcel@holtmann.org
-S:     Maintained
-
-BLUETOOTH HCI BT3C DRIVER
-P:     Marcel Holtmann
-M:     marcel@holtmann.org
-S:     Maintained
-
-BLUETOOTH HCI BTUART DRIVER
+BLUETOOTH SUBSYSTEM
 P:     Marcel Holtmann
 M:     marcel@holtmann.org
-S:     Maintained
-
-BLUETOOTH HCI VHCI DRIVER
-P:     Maxim Krasnyansky
-M:     maxk@qualcomm.com
+L:     linux-bluetooth@vger.kernel.org
+W:     http://www.bluez.org/
+T:     git kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git
 S:     Maintained
 
 BONDING DRIVER
@@ -3748,6 +3679,16 @@ L:       linux-visws-devel@lists.sf.net
 W:     http://linux-visws.sf.net
 S:     Maintained for 2.6.
 
+SGI GRU DRIVER
+P:     Jack Steiner
+M:     steiner@sgi.com
+S:     Maintained
+
+SGI XP/XPC/XPNET DRIVER
+P:     Dean Nelson
+M:     dcn@sgi.com
+S:     Maintained
+
 SIMTEC EB110ATX (Chalice CATS)
 P:     Ben Dooks
 P:     Vincent Sanders
index 53bf6ec1af9d29fac6682fb6cd4c2e5dbcb84490..2e15e0b4483d68a2bfb37bc8cdca42fe86e12195 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 27
-EXTRAVERSION = -rc3
+EXTRAVERSION = -rc4
 NAME = Rotary Wombat
 
 # *DOCUMENTATION*
diff --git a/arch/alpha/include/asm/8253pit.h b/arch/alpha/include/asm/8253pit.h
new file mode 100644 (file)
index 0000000..fef5c14
--- /dev/null
@@ -0,0 +1,10 @@
+/*
+ * 8253/8254 Programmable Interval Timer
+ */
+
+#ifndef _8253PIT_H
+#define _8253PIT_H
+
+#define PIT_TICK_RATE  1193180UL
+
+#endif
diff --git a/arch/alpha/include/asm/Kbuild b/arch/alpha/include/asm/Kbuild
new file mode 100644 (file)
index 0000000..b7c8f18
--- /dev/null
@@ -0,0 +1,11 @@
+include include/asm-generic/Kbuild.asm
+
+header-y += gentrap.h
+header-y += regdef.h
+header-y += pal.h
+header-y += reg.h
+
+unifdef-y += console.h
+unifdef-y += fpu.h
+unifdef-y += sysinfo.h
+unifdef-y += compiler.h
diff --git a/arch/alpha/include/asm/a.out-core.h b/arch/alpha/include/asm/a.out-core.h
new file mode 100644 (file)
index 0000000..9e33e92
--- /dev/null
@@ -0,0 +1,80 @@
+/* a.out coredump register dumper
+ *
+ * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public Licence
+ * as published by the Free Software Foundation; either version
+ * 2 of the Licence, or (at your option) any later version.
+ */
+
+#ifndef _ASM_A_OUT_CORE_H
+#define _ASM_A_OUT_CORE_H
+
+#ifdef __KERNEL__
+
+#include <linux/user.h>
+
+/*
+ * Fill in the user structure for an ECOFF core dump.
+ */
+static inline void aout_dump_thread(struct pt_regs *pt, struct user *dump)
+{
+       /* switch stack follows right below pt_regs: */
+       struct switch_stack * sw = ((struct switch_stack *) pt) - 1;
+
+       dump->magic = CMAGIC;
+       dump->start_code  = current->mm->start_code;
+       dump->start_data  = current->mm->start_data;
+       dump->start_stack = rdusp() & ~(PAGE_SIZE - 1);
+       dump->u_tsize = ((current->mm->end_code - dump->start_code)
+                        >> PAGE_SHIFT);
+       dump->u_dsize = ((current->mm->brk + PAGE_SIZE-1 - dump->start_data)
+                        >> PAGE_SHIFT);
+       dump->u_ssize = (current->mm->start_stack - dump->start_stack
+                        + PAGE_SIZE-1) >> PAGE_SHIFT;
+
+       /*
+        * We store the registers in an order/format that is
+        * compatible with DEC Unix/OSF/1 as this makes life easier
+        * for gdb.
+        */
+       dump->regs[EF_V0]  = pt->r0;
+       dump->regs[EF_T0]  = pt->r1;
+       dump->regs[EF_T1]  = pt->r2;
+       dump->regs[EF_T2]  = pt->r3;
+       dump->regs[EF_T3]  = pt->r4;
+       dump->regs[EF_T4]  = pt->r5;
+       dump->regs[EF_T5]  = pt->r6;
+       dump->regs[EF_T6]  = pt->r7;
+       dump->regs[EF_T7]  = pt->r8;
+       dump->regs[EF_S0]  = sw->r9;
+       dump->regs[EF_S1]  = sw->r10;
+       dump->regs[EF_S2]  = sw->r11;
+       dump->regs[EF_S3]  = sw->r12;
+       dump->regs[EF_S4]  = sw->r13;
+       dump->regs[EF_S5]  = sw->r14;
+       dump->regs[EF_S6]  = sw->r15;
+       dump->regs[EF_A3]  = pt->r19;
+       dump->regs[EF_A4]  = pt->r20;
+       dump->regs[EF_A5]  = pt->r21;
+       dump->regs[EF_T8]  = pt->r22;
+       dump->regs[EF_T9]  = pt->r23;
+       dump->regs[EF_T10] = pt->r24;
+       dump->regs[EF_T11] = pt->r25;
+       dump->regs[EF_RA]  = pt->r26;
+       dump->regs[EF_T12] = pt->r27;
+       dump->regs[EF_AT]  = pt->r28;
+       dump->regs[EF_SP]  = rdusp();
+       dump->regs[EF_PS]  = pt->ps;
+       dump->regs[EF_PC]  = pt->pc;
+       dump->regs[EF_GP]  = pt->gp;
+       dump->regs[EF_A0]  = pt->r16;
+       dump->regs[EF_A1]  = pt->r17;
+       dump->regs[EF_A2]  = pt->r18;
+       memcpy((char *)dump->regs + EF_SIZE, sw->fp, 32 * 8);
+}
+
+#endif /* __KERNEL__ */
+#endif /* _ASM_A_OUT_CORE_H */
diff --git a/arch/alpha/include/asm/a.out.h b/arch/alpha/include/asm/a.out.h
new file mode 100644 (file)
index 0000000..02ce847
--- /dev/null
@@ -0,0 +1,102 @@
+#ifndef __ALPHA_A_OUT_H__
+#define __ALPHA_A_OUT_H__
+
+#include <linux/types.h>
+
+/*
+ * OSF/1 ECOFF header structs.  ECOFF files consist of:
+ *     - a file header (struct filehdr),
+ *     - an a.out header (struct aouthdr),
+ *     - one or more section headers (struct scnhdr). 
+ *       The filhdr's "f_nscns" field contains the
+ *       number of section headers.
+ */
+
+struct filehdr
+{
+       /* OSF/1 "file" header */
+       __u16 f_magic, f_nscns;
+       __u32 f_timdat;
+       __u64 f_symptr;
+       __u32 f_nsyms;
+       __u16 f_opthdr, f_flags;
+};
+
+struct aouthdr
+{
+       __u64 info;             /* after that it looks quite normal.. */
+       __u64 tsize;
+       __u64 dsize;
+       __u64 bsize;
+       __u64 entry;
+       __u64 text_start;       /* with a few additions that actually make sense */
+       __u64 data_start;
+       __u64 bss_start;
+       __u32 gprmask, fprmask; /* bitmask of general & floating point regs used in binary */
+       __u64 gpvalue;
+};
+
+struct scnhdr
+{
+       char    s_name[8];
+       __u64   s_paddr;
+       __u64   s_vaddr;
+       __u64   s_size;
+       __u64   s_scnptr;
+       __u64   s_relptr;
+       __u64   s_lnnoptr;
+       __u16   s_nreloc;
+       __u16   s_nlnno;
+       __u32   s_flags;
+};
+
+struct exec
+{
+       /* OSF/1 "file" header */
+       struct filehdr          fh;
+       struct aouthdr          ah;
+};
+
+/*
+ * Define's so that the kernel exec code can access the a.out header
+ * fields...
+ */
+#define        a_info          ah.info
+#define        a_text          ah.tsize
+#define a_data         ah.dsize
+#define a_bss          ah.bsize
+#define a_entry                ah.entry
+#define a_textstart    ah.text_start
+#define        a_datastart     ah.data_start
+#define        a_bssstart      ah.bss_start
+#define        a_gprmask       ah.gprmask
+#define a_fprmask      ah.fprmask
+#define a_gpvalue      ah.gpvalue
+
+#define N_TXTADDR(x) ((x).a_textstart)
+#define N_DATADDR(x) ((x).a_datastart)
+#define N_BSSADDR(x) ((x).a_bssstart)
+#define N_DRSIZE(x) 0
+#define N_TRSIZE(x) 0
+#define N_SYMSIZE(x) 0
+
+#define AOUTHSZ                sizeof(struct aouthdr)
+#define SCNHSZ         sizeof(struct scnhdr)
+#define SCNROUND       16
+
+#define N_TXTOFF(x) \
+  ((long) N_MAGIC(x) == ZMAGIC ? 0 : \
+   (sizeof(struct exec) + (x).fh.f_nscns*SCNHSZ + SCNROUND - 1) & ~(SCNROUND - 1))
+
+#ifdef __KERNEL__
+
+/* Assume that start addresses below 4G belong to a TASO application.
+   Unfortunately, there is no proper bit in the exec header to check.
+   Worse, we have to notice the start address before swapping to use
+   /sbin/loader, which of course is _not_ a TASO application.  */
+#define SET_AOUT_PERSONALITY(BFPM, EX) \
+       set_personality (((BFPM->sh_bang || EX.ah.entry < 0x100000000L \
+                          ? ADDR_LIMIT_32BIT : 0) | PER_OSF4))
+
+#endif /* __KERNEL__ */
+#endif /* __A_OUT_GNU_H__ */
diff --git a/arch/alpha/include/asm/agp.h b/arch/alpha/include/asm/agp.h
new file mode 100644 (file)
index 0000000..26c1791
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef AGP_H
+#define AGP_H 1
+
+#include <asm/io.h>
+
+/* dummy for now */
+
+#define map_page_into_agp(page) 
+#define unmap_page_from_agp(page) 
+#define flush_agp_cache() mb()
+
+/* Convert a physical address to an address suitable for the GART. */
+#define phys_to_gart(x) (x)
+#define gart_to_phys(x) (x)
+
+/* GATT allocation. Returns/accepts GATT kernel virtual address. */
+#define alloc_gatt_pages(order)                \
+       ((char *)__get_free_pages(GFP_KERNEL, (order)))
+#define free_gatt_pages(table, order)  \
+       free_pages((unsigned long)(table), (order))
+
+#endif
diff --git a/arch/alpha/include/asm/agp_backend.h b/arch/alpha/include/asm/agp_backend.h
new file mode 100644 (file)
index 0000000..55dd44a
--- /dev/null
@@ -0,0 +1,42 @@
+#ifndef _ALPHA_AGP_BACKEND_H
+#define _ALPHA_AGP_BACKEND_H 1
+
+typedef        union _alpha_agp_mode {
+       struct {
+               u32 rate : 3;
+               u32 reserved0 : 1;
+               u32 fw : 1;
+               u32 fourgb : 1;
+               u32 reserved1 : 2;
+               u32 enable : 1;
+               u32 sba : 1;
+               u32 reserved2 : 14;
+               u32 rq : 8;
+       } bits;
+       u32 lw;
+} alpha_agp_mode;
+
+typedef struct _alpha_agp_info {
+       struct pci_controller *hose;
+       struct {
+               dma_addr_t bus_base;
+               unsigned long size;
+               void *sysdata;
+       } aperture;
+       alpha_agp_mode capability;
+       alpha_agp_mode mode;
+       void *private;
+       struct alpha_agp_ops *ops;
+} alpha_agp_info;
+
+struct alpha_agp_ops {
+       int (*setup)(alpha_agp_info *);
+       void (*cleanup)(alpha_agp_info *);
+       int (*configure)(alpha_agp_info *);
+       int (*bind)(alpha_agp_info *, off_t, struct agp_memory *);
+       int (*unbind)(alpha_agp_info *, off_t, struct agp_memory *);
+       unsigned long (*translate)(alpha_agp_info *, dma_addr_t);
+};
+
+
+#endif /* _ALPHA_AGP_BACKEND_H */
diff --git a/arch/alpha/include/asm/atomic.h b/arch/alpha/include/asm/atomic.h
new file mode 100644 (file)
index 0000000..ca88e54
--- /dev/null
@@ -0,0 +1,267 @@
+#ifndef _ALPHA_ATOMIC_H
+#define _ALPHA_ATOMIC_H
+
+#include <asm/barrier.h>
+#include <asm/system.h>
+
+/*
+ * Atomic operations that C can't guarantee us.  Useful for
+ * resource counting etc...
+ *
+ * But use these as seldom as possible since they are much slower
+ * than regular operations.
+ */
+
+
+/*
+ * Counter is volatile to make sure gcc doesn't try to be clever
+ * and move things around on us. We need to use _exactly_ the address
+ * the user gave us, not some alias that contains the same information.
+ */
+typedef struct { volatile int counter; } atomic_t;
+typedef struct { volatile long counter; } atomic64_t;
+
+#define ATOMIC_INIT(i)         ( (atomic_t) { (i) } )
+#define ATOMIC64_INIT(i)       ( (atomic64_t) { (i) } )
+
+#define atomic_read(v)         ((v)->counter + 0)
+#define atomic64_read(v)       ((v)->counter + 0)
+
+#define atomic_set(v,i)                ((v)->counter = (i))
+#define atomic64_set(v,i)      ((v)->counter = (i))
+
+/*
+ * To get proper branch prediction for the main line, we must branch
+ * forward to code at the end of this object's .text section, then
+ * branch back to restart the operation.
+ */
+
+static __inline__ void atomic_add(int i, atomic_t * v)
+{
+       unsigned long temp;
+       __asm__ __volatile__(
+       "1:     ldl_l %0,%1\n"
+       "       addl %0,%2,%0\n"
+       "       stl_c %0,%1\n"
+       "       beq %0,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (v->counter)
+       :"Ir" (i), "m" (v->counter));
+}
+
+static __inline__ void atomic64_add(long i, atomic64_t * v)
+{
+       unsigned long temp;
+       __asm__ __volatile__(
+       "1:     ldq_l %0,%1\n"
+       "       addq %0,%2,%0\n"
+       "       stq_c %0,%1\n"
+       "       beq %0,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (v->counter)
+       :"Ir" (i), "m" (v->counter));
+}
+
+static __inline__ void atomic_sub(int i, atomic_t * v)
+{
+       unsigned long temp;
+       __asm__ __volatile__(
+       "1:     ldl_l %0,%1\n"
+       "       subl %0,%2,%0\n"
+       "       stl_c %0,%1\n"
+       "       beq %0,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (v->counter)
+       :"Ir" (i), "m" (v->counter));
+}
+
+static __inline__ void atomic64_sub(long i, atomic64_t * v)
+{
+       unsigned long temp;
+       __asm__ __volatile__(
+       "1:     ldq_l %0,%1\n"
+       "       subq %0,%2,%0\n"
+       "       stq_c %0,%1\n"
+       "       beq %0,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (v->counter)
+       :"Ir" (i), "m" (v->counter));
+}
+
+
+/*
+ * Same as above, but return the result value
+ */
+static inline int atomic_add_return(int i, atomic_t *v)
+{
+       long temp, result;
+       smp_mb();
+       __asm__ __volatile__(
+       "1:     ldl_l %0,%1\n"
+       "       addl %0,%3,%2\n"
+       "       addl %0,%3,%0\n"
+       "       stl_c %0,%1\n"
+       "       beq %0,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (v->counter), "=&r" (result)
+       :"Ir" (i), "m" (v->counter) : "memory");
+       smp_mb();
+       return result;
+}
+
+static __inline__ long atomic64_add_return(long i, atomic64_t * v)
+{
+       long temp, result;
+       smp_mb();
+       __asm__ __volatile__(
+       "1:     ldq_l %0,%1\n"
+       "       addq %0,%3,%2\n"
+       "       addq %0,%3,%0\n"
+       "       stq_c %0,%1\n"
+       "       beq %0,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (v->counter), "=&r" (result)
+       :"Ir" (i), "m" (v->counter) : "memory");
+       smp_mb();
+       return result;
+}
+
+static __inline__ long atomic_sub_return(int i, atomic_t * v)
+{
+       long temp, result;
+       smp_mb();
+       __asm__ __volatile__(
+       "1:     ldl_l %0,%1\n"
+       "       subl %0,%3,%2\n"
+       "       subl %0,%3,%0\n"
+       "       stl_c %0,%1\n"
+       "       beq %0,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (v->counter), "=&r" (result)
+       :"Ir" (i), "m" (v->counter) : "memory");
+       smp_mb();
+       return result;
+}
+
+static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
+{
+       long temp, result;
+       smp_mb();
+       __asm__ __volatile__(
+       "1:     ldq_l %0,%1\n"
+       "       subq %0,%3,%2\n"
+       "       subq %0,%3,%0\n"
+       "       stq_c %0,%1\n"
+       "       beq %0,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (v->counter), "=&r" (result)
+       :"Ir" (i), "m" (v->counter) : "memory");
+       smp_mb();
+       return result;
+}
+
+#define atomic64_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new))
+#define atomic64_xchg(v, new) (xchg(&((v)->counter), new))
+
+#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new))
+#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
+
+/**
+ * atomic_add_unless - add unless the number is a given value
+ * @v: pointer of type atomic_t
+ * @a: the amount to add to v...
+ * @u: ...unless v is equal to u.
+ *
+ * Atomically adds @a to @v, so long as it was not @u.
+ * Returns non-zero if @v was not @u, and zero otherwise.
+ */
+static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
+{
+       int c, old;
+       c = atomic_read(v);
+       for (;;) {
+               if (unlikely(c == (u)))
+                       break;
+               old = atomic_cmpxchg((v), c, c + (a));
+               if (likely(old == c))
+                       break;
+               c = old;
+       }
+       return c != (u);
+}
+
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
+/**
+ * atomic64_add_unless - add unless the number is a given value
+ * @v: pointer of type atomic64_t
+ * @a: the amount to add to v...
+ * @u: ...unless v is equal to u.
+ *
+ * Atomically adds @a to @v, so long as it was not @u.
+ * Returns non-zero if @v was not @u, and zero otherwise.
+ */
+static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
+{
+       long c, old;
+       c = atomic64_read(v);
+       for (;;) {
+               if (unlikely(c == (u)))
+                       break;
+               old = atomic64_cmpxchg((v), c, c + (a));
+               if (likely(old == c))
+                       break;
+               c = old;
+       }
+       return c != (u);
+}
+
+#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
+
+#define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0)
+#define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0)
+
+#define atomic_dec_return(v) atomic_sub_return(1,(v))
+#define atomic64_dec_return(v) atomic64_sub_return(1,(v))
+
+#define atomic_inc_return(v) atomic_add_return(1,(v))
+#define atomic64_inc_return(v) atomic64_add_return(1,(v))
+
+#define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0)
+#define atomic64_sub_and_test(i,v) (atomic64_sub_return((i), (v)) == 0)
+
+#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0)
+#define atomic64_inc_and_test(v) (atomic64_add_return(1, (v)) == 0)
+
+#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
+#define atomic64_dec_and_test(v) (atomic64_sub_return(1, (v)) == 0)
+
+#define atomic_inc(v) atomic_add(1,(v))
+#define atomic64_inc(v) atomic64_add(1,(v))
+
+#define atomic_dec(v) atomic_sub(1,(v))
+#define atomic64_dec(v) atomic64_sub(1,(v))
+
+#define smp_mb__before_atomic_dec()    smp_mb()
+#define smp_mb__after_atomic_dec()     smp_mb()
+#define smp_mb__before_atomic_inc()    smp_mb()
+#define smp_mb__after_atomic_inc()     smp_mb()
+
+#include <asm-generic/atomic.h>
+#endif /* _ALPHA_ATOMIC_H */
diff --git a/arch/alpha/include/asm/auxvec.h b/arch/alpha/include/asm/auxvec.h
new file mode 100644 (file)
index 0000000..e96fe88
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef __ASM_ALPHA_AUXVEC_H
+#define __ASM_ALPHA_AUXVEC_H
+
+/* Reserve these numbers for any future use of a VDSO.  */
+#if 0
+#define AT_SYSINFO             32
+#define AT_SYSINFO_EHDR                33
+#endif
+
+/* More complete cache descriptions than AT_[DIU]CACHEBSIZE.  If the
+   value is -1, then the cache doesn't exist.  Otherwise:
+
+      bit 0-3:   Cache set-associativity; 0 means fully associative.
+      bit 4-7:   Log2 of cacheline size.
+      bit 8-31:          Size of the entire cache >> 8.
+      bit 32-63:  Reserved.
+*/
+
+#define AT_L1I_CACHESHAPE      34
+#define AT_L1D_CACHESHAPE      35
+#define AT_L2_CACHESHAPE       36
+#define AT_L3_CACHESHAPE       37
+
+#endif /* __ASM_ALPHA_AUXVEC_H */
diff --git a/arch/alpha/include/asm/barrier.h b/arch/alpha/include/asm/barrier.h
new file mode 100644 (file)
index 0000000..ac78eba
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef __BARRIER_H
+#define __BARRIER_H
+
+#include <asm/compiler.h>
+
+#define mb() \
+__asm__ __volatile__("mb": : :"memory")
+
+#define rmb() \
+__asm__ __volatile__("mb": : :"memory")
+
+#define wmb() \
+__asm__ __volatile__("wmb": : :"memory")
+
+#define read_barrier_depends() \
+__asm__ __volatile__("mb": : :"memory")
+
+#ifdef CONFIG_SMP
+#define smp_mb()       mb()
+#define smp_rmb()      rmb()
+#define smp_wmb()      wmb()
+#define smp_read_barrier_depends()     read_barrier_depends()
+#else
+#define smp_mb()       barrier()
+#define smp_rmb()      barrier()
+#define smp_wmb()      barrier()
+#define smp_read_barrier_depends()     do { } while (0)
+#endif
+
+#define set_mb(var, value) \
+do { var = value; mb(); } while (0)
+
+#endif         /* __BARRIER_H */
diff --git a/arch/alpha/include/asm/bitops.h b/arch/alpha/include/asm/bitops.h
new file mode 100644 (file)
index 0000000..15f3ae2
--- /dev/null
@@ -0,0 +1,466 @@
+#ifndef _ALPHA_BITOPS_H
+#define _ALPHA_BITOPS_H
+
+#ifndef _LINUX_BITOPS_H
+#error only <linux/bitops.h> can be included directly
+#endif
+
+#include <asm/compiler.h>
+#include <asm/barrier.h>
+
+/*
+ * Copyright 1994, Linus Torvalds.
+ */
+
+/*
+ * These have to be done with inline assembly: that way the bit-setting
+ * is guaranteed to be atomic. All bit operations return 0 if the bit
+ * was cleared before the operation and != 0 if it was not.
+ *
+ * To get proper branch prediction for the main line, we must branch
+ * forward to code at the end of this object's .text section, then
+ * branch back to restart the operation.
+ *
+ * bit 0 is the LSB of addr; bit 64 is the LSB of (addr+1).
+ */
+
+static inline void
+set_bit(unsigned long nr, volatile void * addr)
+{
+       unsigned long temp;
+       int *m = ((int *) addr) + (nr >> 5);
+
+       __asm__ __volatile__(
+       "1:     ldl_l %0,%3\n"
+       "       bis %0,%2,%0\n"
+       "       stl_c %0,%1\n"
+       "       beq %0,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (*m)
+       :"Ir" (1UL << (nr & 31)), "m" (*m));
+}
+
+/*
+ * WARNING: non atomic version.
+ */
+static inline void
+__set_bit(unsigned long nr, volatile void * addr)
+{
+       int *m = ((int *) addr) + (nr >> 5);
+
+       *m |= 1 << (nr & 31);
+}
+
+#define smp_mb__before_clear_bit()     smp_mb()
+#define smp_mb__after_clear_bit()      smp_mb()
+
+static inline void
+clear_bit(unsigned long nr, volatile void * addr)
+{
+       unsigned long temp;
+       int *m = ((int *) addr) + (nr >> 5);
+
+       __asm__ __volatile__(
+       "1:     ldl_l %0,%3\n"
+       "       bic %0,%2,%0\n"
+       "       stl_c %0,%1\n"
+       "       beq %0,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (*m)
+       :"Ir" (1UL << (nr & 31)), "m" (*m));
+}
+
+static inline void
+clear_bit_unlock(unsigned long nr, volatile void * addr)
+{
+       smp_mb();
+       clear_bit(nr, addr);
+}
+
+/*
+ * WARNING: non atomic version.
+ */
+static __inline__ void
+__clear_bit(unsigned long nr, volatile void * addr)
+{
+       int *m = ((int *) addr) + (nr >> 5);
+
+       *m &= ~(1 << (nr & 31));
+}
+
+static inline void
+__clear_bit_unlock(unsigned long nr, volatile void * addr)
+{
+       smp_mb();
+       __clear_bit(nr, addr);
+}
+
+static inline void
+change_bit(unsigned long nr, volatile void * addr)
+{
+       unsigned long temp;
+       int *m = ((int *) addr) + (nr >> 5);
+
+       __asm__ __volatile__(
+       "1:     ldl_l %0,%3\n"
+       "       xor %0,%2,%0\n"
+       "       stl_c %0,%1\n"
+       "       beq %0,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (*m)
+       :"Ir" (1UL << (nr & 31)), "m" (*m));
+}
+
+/*
+ * WARNING: non atomic version.
+ */
+static __inline__ void
+__change_bit(unsigned long nr, volatile void * addr)
+{
+       int *m = ((int *) addr) + (nr >> 5);
+
+       *m ^= 1 << (nr & 31);
+}
+
+static inline int
+test_and_set_bit(unsigned long nr, volatile void *addr)
+{
+       unsigned long oldbit;
+       unsigned long temp;
+       int *m = ((int *) addr) + (nr >> 5);
+
+       __asm__ __volatile__(
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       "1:     ldl_l %0,%4\n"
+       "       and %0,%3,%2\n"
+       "       bne %2,2f\n"
+       "       xor %0,%3,%0\n"
+       "       stl_c %0,%1\n"
+       "       beq %0,3f\n"
+       "2:\n"
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       ".subsection 2\n"
+       "3:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (*m), "=&r" (oldbit)
+       :"Ir" (1UL << (nr & 31)), "m" (*m) : "memory");
+
+       return oldbit != 0;
+}
+
+static inline int
+test_and_set_bit_lock(unsigned long nr, volatile void *addr)
+{
+       unsigned long oldbit;
+       unsigned long temp;
+       int *m = ((int *) addr) + (nr >> 5);
+
+       __asm__ __volatile__(
+       "1:     ldl_l %0,%4\n"
+       "       and %0,%3,%2\n"
+       "       bne %2,2f\n"
+       "       xor %0,%3,%0\n"
+       "       stl_c %0,%1\n"
+       "       beq %0,3f\n"
+       "2:\n"
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       ".subsection 2\n"
+       "3:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (*m), "=&r" (oldbit)
+       :"Ir" (1UL << (nr & 31)), "m" (*m) : "memory");
+
+       return oldbit != 0;
+}
+
+/*
+ * WARNING: non atomic version.
+ */
+static inline int
+__test_and_set_bit(unsigned long nr, volatile void * addr)
+{
+       unsigned long mask = 1 << (nr & 0x1f);
+       int *m = ((int *) addr) + (nr >> 5);
+       int old = *m;
+
+       *m = old | mask;
+       return (old & mask) != 0;
+}
+
+static inline int
+test_and_clear_bit(unsigned long nr, volatile void * addr)
+{
+       unsigned long oldbit;
+       unsigned long temp;
+       int *m = ((int *) addr) + (nr >> 5);
+
+       __asm__ __volatile__(
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       "1:     ldl_l %0,%4\n"
+       "       and %0,%3,%2\n"
+       "       beq %2,2f\n"
+       "       xor %0,%3,%0\n"
+       "       stl_c %0,%1\n"
+       "       beq %0,3f\n"
+       "2:\n"
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       ".subsection 2\n"
+       "3:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (*m), "=&r" (oldbit)
+       :"Ir" (1UL << (nr & 31)), "m" (*m) : "memory");
+
+       return oldbit != 0;
+}
+
+/*
+ * WARNING: non atomic version.
+ */
+static inline int
+__test_and_clear_bit(unsigned long nr, volatile void * addr)
+{
+       unsigned long mask = 1 << (nr & 0x1f);
+       int *m = ((int *) addr) + (nr >> 5);
+       int old = *m;
+
+       *m = old & ~mask;
+       return (old & mask) != 0;
+}
+
+static inline int
+test_and_change_bit(unsigned long nr, volatile void * addr)
+{
+       unsigned long oldbit;
+       unsigned long temp;
+       int *m = ((int *) addr) + (nr >> 5);
+
+       __asm__ __volatile__(
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       "1:     ldl_l %0,%4\n"
+       "       and %0,%3,%2\n"
+       "       xor %0,%3,%0\n"
+       "       stl_c %0,%1\n"
+       "       beq %0,3f\n"
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       ".subsection 2\n"
+       "3:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (*m), "=&r" (oldbit)
+       :"Ir" (1UL << (nr & 31)), "m" (*m) : "memory");
+
+       return oldbit != 0;
+}
+
+/*
+ * WARNING: non atomic version.
+ */
+static __inline__ int
+__test_and_change_bit(unsigned long nr, volatile void * addr)
+{
+       unsigned long mask = 1 << (nr & 0x1f);
+       int *m = ((int *) addr) + (nr >> 5);
+       int old = *m;
+
+       *m = old ^ mask;
+       return (old & mask) != 0;
+}
+
+static inline int
+test_bit(int nr, const volatile void * addr)
+{
+       return (1UL & (((const int *) addr)[nr >> 5] >> (nr & 31))) != 0UL;
+}
+
+/*
+ * ffz = Find First Zero in word. Undefined if no zero exists,
+ * so code should check against ~0UL first..
+ *
+ * Do a binary search on the bits.  Due to the nature of large
+ * constants on the alpha, it is worthwhile to split the search.
+ */
+static inline unsigned long ffz_b(unsigned long x)
+{
+       unsigned long sum, x1, x2, x4;
+
+       x = ~x & -~x;           /* set first 0 bit, clear others */
+       x1 = x & 0xAA;
+       x2 = x & 0xCC;
+       x4 = x & 0xF0;
+       sum = x2 ? 2 : 0;
+       sum += (x4 != 0) * 4;
+       sum += (x1 != 0);
+
+       return sum;
+}
+
+static inline unsigned long ffz(unsigned long word)
+{
+#if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67)
+       /* Whee.  EV67 can calculate it directly.  */
+       return __kernel_cttz(~word);
+#else
+       unsigned long bits, qofs, bofs;
+
+       bits = __kernel_cmpbge(word, ~0UL);
+       qofs = ffz_b(bits);
+       bits = __kernel_extbl(word, qofs);
+       bofs = ffz_b(bits);
+
+       return qofs*8 + bofs;
+#endif
+}
+
+/*
+ * __ffs = Find First set bit in word.  Undefined if no set bit exists.
+ */
+static inline unsigned long __ffs(unsigned long word)
+{
+#if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67)
+       /* Whee.  EV67 can calculate it directly.  */
+       return __kernel_cttz(word);
+#else
+       unsigned long bits, qofs, bofs;
+
+       bits = __kernel_cmpbge(0, word);
+       qofs = ffz_b(bits);
+       bits = __kernel_extbl(word, qofs);
+       bofs = ffz_b(~bits);
+
+       return qofs*8 + bofs;
+#endif
+}
+
+#ifdef __KERNEL__
+
+/*
+ * ffs: find first bit set. This is defined the same way as
+ * the libc and compiler builtin ffs routines, therefore
+ * differs in spirit from the above __ffs.
+ */
+
+static inline int ffs(int word)
+{
+       int result = __ffs(word) + 1;
+       return word ? result : 0;
+}
+
+/*
+ * fls: find last bit set.
+ */
+#if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67)
+static inline int fls64(unsigned long word)
+{
+       return 64 - __kernel_ctlz(word);
+}
+#else
+extern const unsigned char __flsm1_tab[256];
+
+static inline int fls64(unsigned long x)
+{
+       unsigned long t, a, r;
+
+       t = __kernel_cmpbge (x, 0x0101010101010101UL);
+       a = __flsm1_tab[t];
+       t = __kernel_extbl (x, a);
+       r = a*8 + __flsm1_tab[t] + (x != 0);
+
+       return r;
+}
+#endif
+
+static inline unsigned long __fls(unsigned long x)
+{
+       return fls64(x) - 1;
+}
+
+static inline int fls(int x)
+{
+       return fls64((unsigned int) x);
+}
+
+/*
+ * hweightN: returns the hamming weight (i.e. the number
+ * of bits set) of a N-bit word
+ */
+
+#if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67)
+/* Whee.  EV67 can calculate it directly.  */
+static inline unsigned long hweight64(unsigned long w)
+{
+       return __kernel_ctpop(w);
+}
+
+static inline unsigned int hweight32(unsigned int w)
+{
+       return hweight64(w);
+}
+
+static inline unsigned int hweight16(unsigned int w)
+{
+       return hweight64(w & 0xffff);
+}
+
+static inline unsigned int hweight8(unsigned int w)
+{
+       return hweight64(w & 0xff);
+}
+#else
+#include <asm-generic/bitops/hweight.h>
+#endif
+
+#endif /* __KERNEL__ */
+
+#include <asm-generic/bitops/find.h>
+
+#ifdef __KERNEL__
+
+/*
+ * Every architecture must define this function. It's the fastest
+ * way of searching a 140-bit bitmap where the first 100 bits are
+ * unlikely to be set. It's guaranteed that at least one of the 140
+ * bits is set.
+ */
+static inline unsigned long
+sched_find_first_bit(unsigned long b[3])
+{
+       unsigned long b0 = b[0], b1 = b[1], b2 = b[2];
+       unsigned long ofs;
+
+       ofs = (b1 ? 64 : 128);
+       b1 = (b1 ? b1 : b2);
+       ofs = (b0 ? 0 : ofs);
+       b0 = (b0 ? b0 : b1);
+
+       return __ffs(b0) + ofs;
+}
+
+#include <asm-generic/bitops/ext2-non-atomic.h>
+
+#define ext2_set_bit_atomic(l,n,a)   test_and_set_bit(n,a)
+#define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a)
+
+#include <asm-generic/bitops/minix.h>
+
+#endif /* __KERNEL__ */
+
+#endif /* _ALPHA_BITOPS_H */
diff --git a/arch/alpha/include/asm/bug.h b/arch/alpha/include/asm/bug.h
new file mode 100644 (file)
index 0000000..695a5ee
--- /dev/null
@@ -0,0 +1,28 @@
+#ifndef _ALPHA_BUG_H
+#define _ALPHA_BUG_H
+
+#include <linux/linkage.h>
+
+#ifdef CONFIG_BUG
+#include <asm/pal.h>
+
+/* ??? Would be nice to use .gprel32 here, but we can't be sure that the
+   function loaded the GP, so this could fail in modules.  */
+static inline void ATTRIB_NORET __BUG(const char *file, int line)
+{
+       __asm__ __volatile__(
+               "call_pal %0  # bugchk\n\t"
+               ".long %1\n\t.8byte %2"
+                      : : "i" (PAL_bugchk), "i"(line), "i"(file));
+       for ( ; ; )
+               ;
+}
+
+#define BUG() __BUG(__FILE__, __LINE__)
+
+#define HAVE_ARCH_BUG
+#endif
+
+#include <asm-generic/bug.h>
+
+#endif
diff --git a/arch/alpha/include/asm/bugs.h b/arch/alpha/include/asm/bugs.h
new file mode 100644 (file)
index 0000000..78030d1
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ *  include/asm-alpha/bugs.h
+ *
+ *  Copyright (C) 1994  Linus Torvalds
+ */
+
+/*
+ * This is included by init/main.c to check for architecture-dependent bugs.
+ *
+ * Needs:
+ *     void check_bugs(void);
+ */
+
+/*
+ * I don't know of any alpha bugs yet.. Nice chip
+ */
+
+static void check_bugs(void)
+{
+}
diff --git a/arch/alpha/include/asm/byteorder.h b/arch/alpha/include/asm/byteorder.h
new file mode 100644 (file)
index 0000000..58e958f
--- /dev/null
@@ -0,0 +1,47 @@
+#ifndef _ALPHA_BYTEORDER_H
+#define _ALPHA_BYTEORDER_H
+
+#include <asm/types.h>
+#include <linux/compiler.h>
+#include <asm/compiler.h>
+
+#ifdef __GNUC__
+
+static inline __attribute_const__ __u32 __arch__swab32(__u32 x)
+{
+       /*
+        * Unfortunately, we can't use the 6 instruction sequence
+        * on ev6 since the latency of the UNPKBW is 3, which is
+        * pretty hard to hide.  Just in case a future implementation
+        * has a lower latency, here's the sequence (also by Mike Burrows)
+        *
+        * UNPKBW a0, v0       v0: 00AA00BB00CC00DD
+        * SLL v0, 24, a0      a0: BB00CC00DD000000
+        * BIS v0, a0, a0      a0: BBAACCBBDDCC00DD
+        * EXTWL a0, 6, v0     v0: 000000000000BBAA
+        * ZAP a0, 0xf3, a0    a0: 00000000DDCC0000
+        * ADDL a0, v0, v0     v0: ssssssssDDCCBBAA
+        */
+
+       __u64 t0, t1, t2, t3;
+
+       t0 = __kernel_inslh(x, 7);      /* t0 : 0000000000AABBCC */
+       t1 = __kernel_inswl(x, 3);      /* t1 : 000000CCDD000000 */
+       t1 |= t0;                       /* t1 : 000000CCDDAABBCC */
+       t2 = t1 >> 16;                  /* t2 : 0000000000CCDDAA */
+       t0 = t1 & 0xFF00FF00;           /* t0 : 00000000DD00BB00 */
+       t3 = t2 & 0x00FF00FF;           /* t3 : 0000000000CC00AA */
+       t1 = t0 + t3;                   /* t1 : ssssssssDDCCBBAA */
+
+       return t1;
+}
+
+#define __arch__swab32 __arch__swab32
+
+#endif /* __GNUC__ */
+
+#define __BYTEORDER_HAS_U64__
+
+#include <linux/byteorder/little_endian.h>
+
+#endif /* _ALPHA_BYTEORDER_H */
diff --git a/arch/alpha/include/asm/cache.h b/arch/alpha/include/asm/cache.h
new file mode 100644 (file)
index 0000000..f199e69
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * include/asm-alpha/cache.h
+ */
+#ifndef __ARCH_ALPHA_CACHE_H
+#define __ARCH_ALPHA_CACHE_H
+
+
+/* Bytes per L1 (data) cache line. */
+#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_EV6)
+# define L1_CACHE_BYTES     64
+# define L1_CACHE_SHIFT     6
+#else
+/* Both EV4 and EV5 are write-through, read-allocate,
+   direct-mapped, physical.
+*/
+# define L1_CACHE_BYTES     32
+# define L1_CACHE_SHIFT     5
+#endif
+
+#define L1_CACHE_ALIGN(x)  (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1))
+#define SMP_CACHE_BYTES    L1_CACHE_BYTES
+
+#endif
diff --git a/arch/alpha/include/asm/cacheflush.h b/arch/alpha/include/asm/cacheflush.h
new file mode 100644 (file)
index 0000000..b686cc7
--- /dev/null
@@ -0,0 +1,74 @@
+#ifndef _ALPHA_CACHEFLUSH_H
+#define _ALPHA_CACHEFLUSH_H
+
+#include <linux/mm.h>
+
+/* Caches aren't brain-dead on the Alpha. */
+#define flush_cache_all()                      do { } while (0)
+#define flush_cache_mm(mm)                     do { } while (0)
+#define flush_cache_dup_mm(mm)                 do { } while (0)
+#define flush_cache_range(vma, start, end)     do { } while (0)
+#define flush_cache_page(vma, vmaddr, pfn)     do { } while (0)
+#define flush_dcache_page(page)                        do { } while (0)
+#define flush_dcache_mmap_lock(mapping)                do { } while (0)
+#define flush_dcache_mmap_unlock(mapping)      do { } while (0)
+#define flush_cache_vmap(start, end)           do { } while (0)
+#define flush_cache_vunmap(start, end)         do { } while (0)
+
+/* Note that the following two definitions are _highly_ dependent
+   on the contexts in which they are used in the kernel.  I personally
+   think it is criminal how loosely defined these macros are.  */
+
+/* We need to flush the kernel's icache after loading modules.  The
+   only other use of this macro is in load_aout_interp which is not
+   used on Alpha. 
+
+   Note that this definition should *not* be used for userspace
+   icache flushing.  While functional, it is _way_ overkill.  The
+   icache is tagged with ASNs and it suffices to allocate a new ASN
+   for the process.  */
+#ifndef CONFIG_SMP
+#define flush_icache_range(start, end)         imb()
+#else
+#define flush_icache_range(start, end)         smp_imb()
+extern void smp_imb(void);
+#endif
+
+/* We need to flush the userspace icache after setting breakpoints in
+   ptrace.
+
+   Instead of indiscriminately using imb, take advantage of the fact
+   that icache entries are tagged with the ASN and load a new mm context.  */
+/* ??? Ought to use this in arch/alpha/kernel/signal.c too.  */
+
+#ifndef CONFIG_SMP
+extern void __load_new_mm_context(struct mm_struct *);
+static inline void
+flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
+                       unsigned long addr, int len)
+{
+       if (vma->vm_flags & VM_EXEC) {
+               struct mm_struct *mm = vma->vm_mm;
+               if (current->active_mm == mm)
+                       __load_new_mm_context(mm);
+               else
+                       mm->context[smp_processor_id()] = 0;
+       }
+}
+#else
+extern void flush_icache_user_range(struct vm_area_struct *vma,
+               struct page *page, unsigned long addr, int len);
+#endif
+
+/* This is used only in do_no_page and do_swap_page.  */
+#define flush_icache_page(vma, page) \
+  flush_icache_user_range((vma), (page), 0, 0)
+
+#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
+do { memcpy(dst, src, len); \
+     flush_icache_user_range(vma, page, vaddr, len); \
+} while (0)
+#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
+       memcpy(dst, src, len)
+
+#endif /* _ALPHA_CACHEFLUSH_H */
diff --git a/arch/alpha/include/asm/checksum.h b/arch/alpha/include/asm/checksum.h
new file mode 100644 (file)
index 0000000..d3854bb
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef _ALPHA_CHECKSUM_H
+#define _ALPHA_CHECKSUM_H
+
+#include <linux/in6.h>
+
+/*
+ *     This is a version of ip_compute_csum() optimized for IP headers,
+ *     which always checksum on 4 octet boundaries.
+ */
+extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
+
+/*
+ * computes the checksum of the TCP/UDP pseudo-header
+ * returns a 16-bit checksum, already complemented
+ */
+extern __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,
+                                          unsigned short len,
+                                          unsigned short proto,
+                                          __wsum sum);
+
+__wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
+                               unsigned short len, unsigned short proto,
+                               __wsum sum);
+
+/*
+ * computes the checksum of a memory block at buff, length len,
+ * and adds in "sum" (32-bit)
+ *
+ * returns a 32-bit number suitable for feeding into itself
+ * or csum_tcpudp_magic
+ *
+ * this function must be called with even lengths, except
+ * for the last fragment, which may be odd
+ *
+ * it's best to have buff aligned on a 32-bit boundary
+ */
+extern __wsum csum_partial(const void *buff, int len, __wsum sum);
+
+/*
+ * the same as csum_partial, but copies from src while it
+ * checksums
+ *
+ * here even more important to align src and dst on a 32-bit (or even
+ * better 64-bit) boundary
+ */
+__wsum csum_partial_copy_from_user(const void __user *src, void *dst, int len, __wsum sum, int *errp);
+
+__wsum csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum);
+
+
+/*
+ * this routine is used for miscellaneous IP-like checksums, mainly
+ * in icmp.c
+ */
+
+extern __sum16 ip_compute_csum(const void *buff, int len);
+
+/*
+ *     Fold a partial checksum without adding pseudo headers
+ */
+
+static inline __sum16 csum_fold(__wsum csum)
+{
+       u32 sum = (__force u32)csum;
+       sum = (sum & 0xffff) + (sum >> 16);
+       sum = (sum & 0xffff) + (sum >> 16);
+       return (__force __sum16)~sum;
+}
+
+#define _HAVE_ARCH_IPV6_CSUM
+extern __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
+                              const struct in6_addr *daddr,
+                              __u32 len, unsigned short proto,
+                              __wsum sum);
+#endif
diff --git a/arch/alpha/include/asm/compiler.h b/arch/alpha/include/asm/compiler.h
new file mode 100644 (file)
index 0000000..da6bb19
--- /dev/null
@@ -0,0 +1,130 @@
+#ifndef __ALPHA_COMPILER_H
+#define __ALPHA_COMPILER_H
+
+/* 
+ * Herein are macros we use when describing various patterns we want to GCC.
+ * In all cases we can get better schedules out of the compiler if we hide
+ * as little as possible inside inline assembly.  However, we want to be
+ * able to know what we'll get out before giving up inline assembly.  Thus
+ * these tests and macros.
+ */
+
+#if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3
+# define __kernel_insbl(val, shift)    __builtin_alpha_insbl(val, shift)
+# define __kernel_inswl(val, shift)    __builtin_alpha_inswl(val, shift)
+# define __kernel_insql(val, shift)    __builtin_alpha_insql(val, shift)
+# define __kernel_inslh(val, shift)    __builtin_alpha_inslh(val, shift)
+# define __kernel_extbl(val, shift)    __builtin_alpha_extbl(val, shift)
+# define __kernel_extwl(val, shift)    __builtin_alpha_extwl(val, shift)
+# define __kernel_cmpbge(a, b)         __builtin_alpha_cmpbge(a, b)
+#else
+# define __kernel_insbl(val, shift)                                    \
+  ({ unsigned long __kir;                                              \
+     __asm__("insbl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));  \
+     __kir; })
+# define __kernel_inswl(val, shift)                                    \
+  ({ unsigned long __kir;                                              \
+     __asm__("inswl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));  \
+     __kir; })
+# define __kernel_insql(val, shift)                                    \
+  ({ unsigned long __kir;                                              \
+     __asm__("insql %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));  \
+     __kir; })
+# define __kernel_inslh(val, shift)                                    \
+  ({ unsigned long __kir;                                              \
+     __asm__("inslh %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));  \
+     __kir; })
+# define __kernel_extbl(val, shift)                                    \
+  ({ unsigned long __kir;                                              \
+     __asm__("extbl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));  \
+     __kir; })
+# define __kernel_extwl(val, shift)                                    \
+  ({ unsigned long __kir;                                              \
+     __asm__("extwl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));  \
+     __kir; })
+# define __kernel_cmpbge(a, b)                                         \
+  ({ unsigned long __kir;                                              \
+     __asm__("cmpbge %r2,%1,%0" : "=r"(__kir) : "rI"(b), "rJ"(a));     \
+     __kir; })
+#endif
+
+#ifdef __alpha_cix__
+# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3
+#  define __kernel_cttz(x)             __builtin_ctzl(x)
+#  define __kernel_ctlz(x)             __builtin_clzl(x)
+#  define __kernel_ctpop(x)            __builtin_popcountl(x)
+# else
+#  define __kernel_cttz(x)                                             \
+   ({ unsigned long __kir;                                             \
+      __asm__("cttz %1,%0" : "=r"(__kir) : "r"(x));                    \
+      __kir; })
+#  define __kernel_ctlz(x)                                             \
+   ({ unsigned long __kir;                                             \
+      __asm__("ctlz %1,%0" : "=r"(__kir) : "r"(x));                    \
+      __kir; })
+#  define __kernel_ctpop(x)                                            \
+   ({ unsigned long __kir;                                             \
+      __asm__("ctpop %1,%0" : "=r"(__kir) : "r"(x));                   \
+      __kir; })
+# endif
+#else
+# define __kernel_cttz(x)                                              \
+  ({ unsigned long __kir;                                              \
+     __asm__(".arch ev67; cttz %1,%0" : "=r"(__kir) : "r"(x));         \
+     __kir; })
+# define __kernel_ctlz(x)                                              \
+  ({ unsigned long __kir;                                              \
+     __asm__(".arch ev67; ctlz %1,%0" : "=r"(__kir) : "r"(x));         \
+     __kir; })
+# define __kernel_ctpop(x)                                             \
+  ({ unsigned long __kir;                                              \
+     __asm__(".arch ev67; ctpop %1,%0" : "=r"(__kir) : "r"(x));                \
+     __kir; })
+#endif
+
+
+/* 
+ * Beginning with EGCS 1.1, GCC defines __alpha_bwx__ when the BWX 
+ * extension is enabled.  Previous versions did not define anything
+ * we could test during compilation -- too bad, so sad.
+ */
+
+#if defined(__alpha_bwx__)
+#define __kernel_ldbu(mem)     (mem)
+#define __kernel_ldwu(mem)     (mem)
+#define __kernel_stb(val,mem)  ((mem) = (val))
+#define __kernel_stw(val,mem)  ((mem) = (val))
+#else
+#define __kernel_ldbu(mem)                             \
+  ({ unsigned char __kir;                              \
+     __asm__(".arch ev56;                              \
+             ldbu %0,%1" : "=r"(__kir) : "m"(mem));    \
+     __kir; })
+#define __kernel_ldwu(mem)                             \
+  ({ unsigned short __kir;                             \
+     __asm__(".arch ev56;                              \
+             ldwu %0,%1" : "=r"(__kir) : "m"(mem));    \
+     __kir; })
+#define __kernel_stb(val,mem)                          \
+  __asm__(".arch ev56;                                 \
+          stb %1,%0" : "=m"(mem) : "r"(val))
+#define __kernel_stw(val,mem)                          \
+  __asm__(".arch ev56;                                 \
+          stw %1,%0" : "=m"(mem) : "r"(val))
+#endif
+
+#ifdef __KERNEL__
+/* Some idiots over in <linux/compiler.h> thought inline should imply
+   always_inline.  This breaks stuff.  We'll include this file whenever
+   we run into such problems.  */
+
+#include <linux/compiler.h>
+#undef inline
+#undef __inline__
+#undef __inline
+#undef __always_inline
+#define __always_inline                inline __attribute__((always_inline))
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_COMPILER_H */
diff --git a/arch/alpha/include/asm/console.h b/arch/alpha/include/asm/console.h
new file mode 100644 (file)
index 0000000..a3ce4e6
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef __AXP_CONSOLE_H
+#define __AXP_CONSOLE_H
+
+/*
+ * Console callback routine numbers
+ */
+#define CCB_GETC               0x01
+#define CCB_PUTS               0x02
+#define CCB_RESET_TERM         0x03
+#define CCB_SET_TERM_INT       0x04
+#define CCB_SET_TERM_CTL       0x05
+#define CCB_PROCESS_KEYCODE    0x06
+#define CCB_OPEN_CONSOLE       0x07
+#define CCB_CLOSE_CONSOLE      0x08
+
+#define CCB_OPEN               0x10
+#define CCB_CLOSE              0x11
+#define CCB_IOCTL              0x12
+#define CCB_READ               0x13
+#define CCB_WRITE              0x14
+
+#define CCB_SET_ENV            0x20
+#define CCB_RESET_ENV          0x21
+#define CCB_GET_ENV            0x22
+#define CCB_SAVE_ENV           0x23
+
+#define CCB_PSWITCH            0x30
+#define CCB_BIOS_EMUL          0x32
+
+/*
+ * Environment variable numbers
+ */
+#define ENV_AUTO_ACTION                0x01
+#define ENV_BOOT_DEV           0x02
+#define ENV_BOOTDEF_DEV                0x03
+#define ENV_BOOTED_DEV         0x04
+#define ENV_BOOT_FILE          0x05
+#define ENV_BOOTED_FILE                0x06
+#define ENV_BOOT_OSFLAGS       0x07
+#define ENV_BOOTED_OSFLAGS     0x08
+#define ENV_BOOT_RESET         0x09
+#define ENV_DUMP_DEV           0x0A
+#define ENV_ENABLE_AUDIT       0x0B
+#define ENV_LICENSE            0x0C
+#define ENV_CHAR_SET           0x0D
+#define ENV_LANGUAGE           0x0E
+#define ENV_TTY_DEV            0x0F
+
+#ifdef __KERNEL__
+#ifndef __ASSEMBLY__
+extern long callback_puts(long unit, const char *s, long length);
+extern long callback_getc(long unit);
+extern long callback_open_console(void);
+extern long callback_close_console(void);
+extern long callback_open(const char *device, long length);
+extern long callback_close(long unit);
+extern long callback_read(long channel, long count, const char *buf, long lbn);
+extern long callback_getenv(long id, const char *buf, unsigned long buf_size);
+extern long callback_setenv(long id, const char *buf, unsigned long buf_size);
+extern long callback_save_env(void);
+
+extern int srm_fixup(unsigned long new_callback_addr,
+                    unsigned long new_hwrpb_addr);
+extern long srm_puts(const char *, long);
+extern long srm_printk(const char *, ...)
+       __attribute__ ((format (printf, 1, 2)));
+
+struct crb_struct;
+struct hwrpb_struct;
+extern int callback_init_done;
+extern void * callback_init(void *);
+#endif /* __ASSEMBLY__ */
+#endif /* __KERNEL__ */
+
+#endif /* __AXP_CONSOLE_H */
diff --git a/arch/alpha/include/asm/core_apecs.h b/arch/alpha/include/asm/core_apecs.h
new file mode 100644 (file)
index 0000000..6785ff7
--- /dev/null
@@ -0,0 +1,517 @@
+#ifndef __ALPHA_APECS__H__
+#define __ALPHA_APECS__H__
+
+#include <linux/types.h>
+#include <asm/compiler.h>
+
+/*
+ * APECS is the internal name for the 2107x chipset which provides
+ * memory controller and PCI access for the 21064 chip based systems.
+ *
+ * This file is based on:
+ *
+ * DECchip 21071-AA and DECchip 21072-AA Core Logic Chipsets
+ * Data Sheet
+ *
+ * EC-N0648-72
+ *
+ *
+ * david.rusling@reo.mts.dec.com Initial Version.
+ *
+ */
+
+/*
+   An AVANTI *might* be an XL, and an XL has only 27 bits of ISA address
+   that get passed through the PCI<->ISA bridge chip. So we've gotta use
+   both windows to max out the physical memory we can DMA to. Sigh...
+
+   If we try a window at 0 for 1GB as a work-around, we run into conflicts
+   with ISA/PCI bus memory which can't be relocated, like VGA aperture and
+   BIOS ROMs. So we must put the windows high enough to avoid these areas.
+
+   We put window 1 at BUS 64Mb for 64Mb, mapping physical 0 to 64Mb-1,
+   and window 2 at BUS 1Gb for 1Gb, mapping physical 0 to 1Gb-1.
+   Yes, this does map 0 to 64Mb-1 twice, but only window 1 will actually
+   be used for that range (via virt_to_bus()).
+
+   Note that we actually fudge the window 1 maximum as 48Mb instead of 64Mb,
+   to keep virt_to_bus() from returning an address in the first window, for
+   a data area that goes beyond the 64Mb first DMA window.  Sigh...
+   The fudge factor MUST match with <asm/dma.h> MAX_DMA_ADDRESS, but
+   we can't just use that here, because of header file looping... :-(
+
+   Window 1 will be used for all DMA from the ISA bus; yes, that does
+   limit what memory an ISA floppy or sound card or Ethernet can touch, but
+   it's also a known limitation on other platforms as well. We use the
+   same technique that is used on INTEL platforms with similar limitation:
+   set MAX_DMA_ADDRESS and clear some pages' DMAable flags during mem_init().
+   We trust that any ISA bus device drivers will *always* ask for DMAable
+   memory explicitly via kmalloc()/get_free_pages() flags arguments.
+
+   Note that most PCI bus devices' drivers do *not* explicitly ask for
+   DMAable memory; they count on being able to DMA to any memory they
+   get from kmalloc()/get_free_pages(). They will also use window 1 for
+   any physical memory accesses below 64Mb; the rest will be handled by
+   window 2, maxing out at 1Gb of memory. I trust this is enough... :-)
+
+   We hope that the area before the first window is large enough so that
+   there will be no overlap at the top end (64Mb). We *must* locate the
+   PCI cards' memory just below window 1, so that there's still the
+   possibility of being able to access it via SPARSE space. This is
+   important for cards such as the Matrox Millennium, whose Xserver
+   wants to access memory-mapped registers in byte and short lengths.
+
+   Note that the XL is treated differently from the AVANTI, even though
+   for most other things they are identical. It didn't seem reasonable to
+   make the AVANTI support pay for the limitations of the XL. It is true,
+   however, that an XL kernel will run on an AVANTI without problems.
+
+   %%% All of this should be obviated by the ability to route
+   everything through the iommu.
+*/
+
+/*
+ * 21071-DA Control and Status registers.
+ * These are used for PCI memory access.
+ */
+#define APECS_IOC_DCSR                  (IDENT_ADDR + 0x1A0000000UL)
+#define APECS_IOC_PEAR                  (IDENT_ADDR + 0x1A0000020UL)
+#define APECS_IOC_SEAR                  (IDENT_ADDR + 0x1A0000040UL)
+#define APECS_IOC_DR1                   (IDENT_ADDR + 0x1A0000060UL)
+#define APECS_IOC_DR2                   (IDENT_ADDR + 0x1A0000080UL)
+#define APECS_IOC_DR3                   (IDENT_ADDR + 0x1A00000A0UL)
+
+#define APECS_IOC_TB1R                  (IDENT_ADDR + 0x1A00000C0UL)
+#define APECS_IOC_TB2R                  (IDENT_ADDR + 0x1A00000E0UL)
+
+#define APECS_IOC_PB1R                  (IDENT_ADDR + 0x1A0000100UL)
+#define APECS_IOC_PB2R                  (IDENT_ADDR + 0x1A0000120UL)
+
+#define APECS_IOC_PM1R                  (IDENT_ADDR + 0x1A0000140UL)
+#define APECS_IOC_PM2R                  (IDENT_ADDR + 0x1A0000160UL)
+
+#define APECS_IOC_HAXR0                 (IDENT_ADDR + 0x1A0000180UL)
+#define APECS_IOC_HAXR1                 (IDENT_ADDR + 0x1A00001A0UL)
+#define APECS_IOC_HAXR2                 (IDENT_ADDR + 0x1A00001C0UL)
+
+#define APECS_IOC_PMLT                  (IDENT_ADDR + 0x1A00001E0UL)
+
+#define APECS_IOC_TLBTAG0               (IDENT_ADDR + 0x1A0000200UL)
+#define APECS_IOC_TLBTAG1               (IDENT_ADDR + 0x1A0000220UL)
+#define APECS_IOC_TLBTAG2               (IDENT_ADDR + 0x1A0000240UL)
+#define APECS_IOC_TLBTAG3               (IDENT_ADDR + 0x1A0000260UL)
+#define APECS_IOC_TLBTAG4               (IDENT_ADDR + 0x1A0000280UL)
+#define APECS_IOC_TLBTAG5               (IDENT_ADDR + 0x1A00002A0UL)
+#define APECS_IOC_TLBTAG6               (IDENT_ADDR + 0x1A00002C0UL)
+#define APECS_IOC_TLBTAG7               (IDENT_ADDR + 0x1A00002E0UL)
+
+#define APECS_IOC_TLBDATA0              (IDENT_ADDR + 0x1A0000300UL)
+#define APECS_IOC_TLBDATA1              (IDENT_ADDR + 0x1A0000320UL)
+#define APECS_IOC_TLBDATA2              (IDENT_ADDR + 0x1A0000340UL)
+#define APECS_IOC_TLBDATA3              (IDENT_ADDR + 0x1A0000360UL)
+#define APECS_IOC_TLBDATA4              (IDENT_ADDR + 0x1A0000380UL)
+#define APECS_IOC_TLBDATA5              (IDENT_ADDR + 0x1A00003A0UL)
+#define APECS_IOC_TLBDATA6              (IDENT_ADDR + 0x1A00003C0UL)
+#define APECS_IOC_TLBDATA7              (IDENT_ADDR + 0x1A00003E0UL)
+
+#define APECS_IOC_TBIA                  (IDENT_ADDR + 0x1A0000400UL)
+
+
+/*
+ * 21071-CA Control and Status registers.
+ * These are used to program memory timing,
+ *  configure memory and initialise the B-Cache.
+ */
+#define APECS_MEM_GCR                  (IDENT_ADDR + 0x180000000UL)
+#define APECS_MEM_EDSR                 (IDENT_ADDR + 0x180000040UL)
+#define APECS_MEM_TAR                          (IDENT_ADDR + 0x180000060UL)
+#define APECS_MEM_ELAR                 (IDENT_ADDR + 0x180000080UL)
+#define APECS_MEM_EHAR                 (IDENT_ADDR + 0x1800000a0UL)
+#define APECS_MEM_SFT_RST              (IDENT_ADDR + 0x1800000c0UL)
+#define APECS_MEM_LDxLAR               (IDENT_ADDR + 0x1800000e0UL)
+#define APECS_MEM_LDxHAR               (IDENT_ADDR + 0x180000100UL)
+#define APECS_MEM_GTR                  (IDENT_ADDR + 0x180000200UL)
+#define APECS_MEM_RTR                  (IDENT_ADDR + 0x180000220UL)
+#define APECS_MEM_VFPR                 (IDENT_ADDR + 0x180000240UL)
+#define APECS_MEM_PDLDR                (IDENT_ADDR + 0x180000260UL)
+#define APECS_MEM_PDhDR                (IDENT_ADDR + 0x180000280UL)
+
+/* Bank x Base Address Register */
+#define APECS_MEM_B0BAR                (IDENT_ADDR + 0x180000800UL)
+#define APECS_MEM_B1BAR                (IDENT_ADDR + 0x180000820UL)
+#define APECS_MEM_B2BAR                (IDENT_ADDR + 0x180000840UL)
+#define APECS_MEM_B3BAR                (IDENT_ADDR + 0x180000860UL)
+#define APECS_MEM_B4BAR                (IDENT_ADDR + 0x180000880UL)
+#define APECS_MEM_B5BAR                (IDENT_ADDR + 0x1800008A0UL)
+#define APECS_MEM_B6BAR                (IDENT_ADDR + 0x1800008C0UL)
+#define APECS_MEM_B7BAR                (IDENT_ADDR + 0x1800008E0UL)
+#define APECS_MEM_B8BAR                (IDENT_ADDR + 0x180000900UL)
+
+/* Bank x Configuration Register */
+#define APECS_MEM_B0BCR                (IDENT_ADDR + 0x180000A00UL)
+#define APECS_MEM_B1BCR                (IDENT_ADDR + 0x180000A20UL)
+#define APECS_MEM_B2BCR                (IDENT_ADDR + 0x180000A40UL)
+#define APECS_MEM_B3BCR                (IDENT_ADDR + 0x180000A60UL)
+#define APECS_MEM_B4BCR                (IDENT_ADDR + 0x180000A80UL)
+#define APECS_MEM_B5BCR                (IDENT_ADDR + 0x180000AA0UL)
+#define APECS_MEM_B6BCR                (IDENT_ADDR + 0x180000AC0UL)
+#define APECS_MEM_B7BCR                (IDENT_ADDR + 0x180000AE0UL)
+#define APECS_MEM_B8BCR                (IDENT_ADDR + 0x180000B00UL)
+
+/* Bank x Timing Register A */
+#define APECS_MEM_B0TRA                (IDENT_ADDR + 0x180000C00UL)
+#define APECS_MEM_B1TRA                (IDENT_ADDR + 0x180000C20UL)
+#define APECS_MEM_B2TRA                (IDENT_ADDR + 0x180000C40UL)
+#define APECS_MEM_B3TRA                (IDENT_ADDR + 0x180000C60UL)
+#define APECS_MEM_B4TRA                (IDENT_ADDR + 0x180000C80UL)
+#define APECS_MEM_B5TRA                (IDENT_ADDR + 0x180000CA0UL)
+#define APECS_MEM_B6TRA                (IDENT_ADDR + 0x180000CC0UL)
+#define APECS_MEM_B7TRA                (IDENT_ADDR + 0x180000CE0UL)
+#define APECS_MEM_B8TRA                (IDENT_ADDR + 0x180000D00UL)
+
+/* Bank x Timing Register B */
+#define APECS_MEM_B0TRB                 (IDENT_ADDR + 0x180000E00UL)
+#define APECS_MEM_B1TRB                (IDENT_ADDR + 0x180000E20UL)
+#define APECS_MEM_B2TRB                (IDENT_ADDR + 0x180000E40UL)
+#define APECS_MEM_B3TRB                (IDENT_ADDR + 0x180000E60UL)
+#define APECS_MEM_B4TRB                (IDENT_ADDR + 0x180000E80UL)
+#define APECS_MEM_B5TRB                (IDENT_ADDR + 0x180000EA0UL)
+#define APECS_MEM_B6TRB                (IDENT_ADDR + 0x180000EC0UL)
+#define APECS_MEM_B7TRB                (IDENT_ADDR + 0x180000EE0UL)
+#define APECS_MEM_B8TRB                (IDENT_ADDR + 0x180000F00UL)
+
+
+/*
+ * Memory spaces:
+ */
+#define APECS_IACK_SC                  (IDENT_ADDR + 0x1b0000000UL)
+#define APECS_CONF                     (IDENT_ADDR + 0x1e0000000UL)
+#define APECS_IO                       (IDENT_ADDR + 0x1c0000000UL)
+#define APECS_SPARSE_MEM               (IDENT_ADDR + 0x200000000UL)
+#define APECS_DENSE_MEM                        (IDENT_ADDR + 0x300000000UL)
+
+
+/*
+ * Bit definitions for I/O Controller status register 0:
+ */
+#define APECS_IOC_STAT0_CMD            0xf
+#define APECS_IOC_STAT0_ERR            (1<<4)
+#define APECS_IOC_STAT0_LOST           (1<<5)
+#define APECS_IOC_STAT0_THIT           (1<<6)
+#define APECS_IOC_STAT0_TREF           (1<<7)
+#define APECS_IOC_STAT0_CODE_SHIFT     8
+#define APECS_IOC_STAT0_CODE_MASK      0x7
+#define APECS_IOC_STAT0_P_NBR_SHIFT    13
+#define APECS_IOC_STAT0_P_NBR_MASK     0x7ffff
+
+#define APECS_HAE_ADDRESS              APECS_IOC_HAXR1
+
+
+/*
+ * Data structure for handling APECS machine checks:
+ */
+
+struct el_apecs_mikasa_sysdata_mcheck
+{
+       unsigned long coma_gcr;
+       unsigned long coma_edsr;
+       unsigned long coma_ter;
+       unsigned long coma_elar;
+       unsigned long coma_ehar;
+       unsigned long coma_ldlr;
+       unsigned long coma_ldhr;
+       unsigned long coma_base0;
+       unsigned long coma_base1;
+       unsigned long coma_base2;
+       unsigned long coma_base3;
+       unsigned long coma_cnfg0;
+       unsigned long coma_cnfg1;
+       unsigned long coma_cnfg2;
+       unsigned long coma_cnfg3;
+       unsigned long epic_dcsr;
+       unsigned long epic_pear;
+       unsigned long epic_sear;
+       unsigned long epic_tbr1;
+       unsigned long epic_tbr2;
+       unsigned long epic_pbr1;
+       unsigned long epic_pbr2;
+       unsigned long epic_pmr1;
+       unsigned long epic_pmr2;
+       unsigned long epic_harx1;
+       unsigned long epic_harx2;
+       unsigned long epic_pmlt;
+       unsigned long epic_tag0;
+       unsigned long epic_tag1;
+       unsigned long epic_tag2;
+       unsigned long epic_tag3;
+       unsigned long epic_tag4;
+       unsigned long epic_tag5;
+       unsigned long epic_tag6;
+       unsigned long epic_tag7;
+       unsigned long epic_data0;
+       unsigned long epic_data1;
+       unsigned long epic_data2;
+       unsigned long epic_data3;
+       unsigned long epic_data4;
+       unsigned long epic_data5;
+       unsigned long epic_data6;
+       unsigned long epic_data7;
+
+       unsigned long pceb_vid;
+       unsigned long pceb_did;
+       unsigned long pceb_revision;
+       unsigned long pceb_command;
+       unsigned long pceb_status;
+       unsigned long pceb_latency;
+       unsigned long pceb_control;
+       unsigned long pceb_arbcon;
+       unsigned long pceb_arbpri;
+
+       unsigned long esc_id;
+       unsigned long esc_revision;
+       unsigned long esc_int0;
+       unsigned long esc_int1;
+       unsigned long esc_elcr0;
+       unsigned long esc_elcr1;
+       unsigned long esc_last_eisa;
+       unsigned long esc_nmi_stat;
+
+       unsigned long pci_ir;
+       unsigned long pci_imr;
+       unsigned long svr_mgr;
+};
+
+/* This for the normal APECS machines.  */
+struct el_apecs_sysdata_mcheck
+{
+       unsigned long coma_gcr;
+       unsigned long coma_edsr;
+       unsigned long coma_ter;
+       unsigned long coma_elar;
+       unsigned long coma_ehar;
+       unsigned long coma_ldlr;
+       unsigned long coma_ldhr;
+       unsigned long coma_base0;
+       unsigned long coma_base1;
+       unsigned long coma_base2;
+       unsigned long coma_cnfg0;
+       unsigned long coma_cnfg1;
+       unsigned long coma_cnfg2;
+       unsigned long epic_dcsr;
+       unsigned long epic_pear;
+       unsigned long epic_sear;
+       unsigned long epic_tbr1;
+       unsigned long epic_tbr2;
+       unsigned long epic_pbr1;
+       unsigned long epic_pbr2;
+       unsigned long epic_pmr1;
+       unsigned long epic_pmr2;
+       unsigned long epic_harx1;
+       unsigned long epic_harx2;
+       unsigned long epic_pmlt;
+       unsigned long epic_tag0;
+       unsigned long epic_tag1;
+       unsigned long epic_tag2;
+       unsigned long epic_tag3;
+       unsigned long epic_tag4;
+       unsigned long epic_tag5;
+       unsigned long epic_tag6;
+       unsigned long epic_tag7;
+       unsigned long epic_data0;
+       unsigned long epic_data1;
+       unsigned long epic_data2;
+       unsigned long epic_data3;
+       unsigned long epic_data4;
+       unsigned long epic_data5;
+       unsigned long epic_data6;
+       unsigned long epic_data7;
+};
+
+struct el_apecs_procdata
+{
+       unsigned long paltemp[32];  /* PAL TEMP REGS. */
+       /* EV4-specific fields */
+       unsigned long exc_addr;     /* Address of excepting instruction. */
+       unsigned long exc_sum;      /* Summary of arithmetic traps. */
+       unsigned long exc_mask;     /* Exception mask (from exc_sum). */
+       unsigned long iccsr;        /* IBox hardware enables. */
+       unsigned long pal_base;     /* Base address for PALcode. */
+       unsigned long hier;         /* Hardware Interrupt Enable. */
+       unsigned long hirr;         /* Hardware Interrupt Request. */
+       unsigned long csr;          /* D-stream fault info. */
+       unsigned long dc_stat;      /* D-cache status (ECC/Parity Err). */
+       unsigned long dc_addr;      /* EV3 Phys Addr for ECC/DPERR. */
+       unsigned long abox_ctl;     /* ABox Control Register. */
+       unsigned long biu_stat;     /* BIU Status. */
+       unsigned long biu_addr;     /* BUI Address. */
+       unsigned long biu_ctl;      /* BIU Control. */
+       unsigned long fill_syndrome;/* For correcting ECC errors. */
+       unsigned long fill_addr;    /* Cache block which was being read */
+       unsigned long va;           /* Effective VA of fault or miss. */
+       unsigned long bc_tag;       /* Backup Cache Tag Probe Results.*/
+};
+
+
+#ifdef __KERNEL__
+
+#ifndef __EXTERN_INLINE
+#define __EXTERN_INLINE extern inline
+#define __IO_EXTERN_INLINE
+#endif
+
+/*
+ * I/O functions:
+ *
+ * Unlike Jensen, the APECS machines have no concept of local
+ * I/O---everything goes over the PCI bus.
+ *
+ * There is plenty room for optimization here.  In particular,
+ * the Alpha's insb/insw/extb/extw should be useful in moving
+ * data to/from the right byte-lanes.
+ */
+
+#define vip    volatile int __force *
+#define vuip   volatile unsigned int __force *
+#define vulp   volatile unsigned long __force *
+
+#define APECS_SET_HAE                                          \
+       do {                                                    \
+               if (addr >= (1UL << 24)) {                      \
+                       unsigned long msb = addr & 0xf8000000;  \
+                       addr -= msb;                            \
+                       set_hae(msb);                           \
+               }                                               \
+       } while (0)
+
+__EXTERN_INLINE unsigned int apecs_ioread8(void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       unsigned long result, base_and_type;
+
+       if (addr >= APECS_DENSE_MEM) {
+               addr -= APECS_DENSE_MEM;
+               APECS_SET_HAE;
+               base_and_type = APECS_SPARSE_MEM + 0x00;
+       } else {
+               addr -= APECS_IO;
+               base_and_type = APECS_IO + 0x00;
+       }
+
+       result = *(vip) ((addr << 5) + base_and_type);
+       return __kernel_extbl(result, addr & 3);
+}
+
+__EXTERN_INLINE void apecs_iowrite8(u8 b, void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       unsigned long w, base_and_type;
+
+       if (addr >= APECS_DENSE_MEM) {
+               addr -= APECS_DENSE_MEM;
+               APECS_SET_HAE;
+               base_and_type = APECS_SPARSE_MEM + 0x00;
+       } else {
+               addr -= APECS_IO;
+               base_and_type = APECS_IO + 0x00;
+       }
+
+       w = __kernel_insbl(b, addr & 3);
+       *(vuip) ((addr << 5) + base_and_type) = w;
+}
+
+__EXTERN_INLINE unsigned int apecs_ioread16(void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       unsigned long result, base_and_type;
+
+       if (addr >= APECS_DENSE_MEM) {
+               addr -= APECS_DENSE_MEM;
+               APECS_SET_HAE;
+               base_and_type = APECS_SPARSE_MEM + 0x08;
+       } else {
+               addr -= APECS_IO;
+               base_and_type = APECS_IO + 0x08;
+       }
+
+       result = *(vip) ((addr << 5) + base_and_type);
+       return __kernel_extwl(result, addr & 3);
+}
+
+__EXTERN_INLINE void apecs_iowrite16(u16 b, void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       unsigned long w, base_and_type;
+
+       if (addr >= APECS_DENSE_MEM) {
+               addr -= APECS_DENSE_MEM;
+               APECS_SET_HAE;
+               base_and_type = APECS_SPARSE_MEM + 0x08;
+       } else {
+               addr -= APECS_IO;
+               base_and_type = APECS_IO + 0x08;
+       }
+
+       w = __kernel_inswl(b, addr & 3);
+       *(vuip) ((addr << 5) + base_and_type) = w;
+}
+
+__EXTERN_INLINE unsigned int apecs_ioread32(void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       if (addr < APECS_DENSE_MEM)
+               addr = ((addr - APECS_IO) << 5) + APECS_IO + 0x18;
+       return *(vuip)addr;
+}
+
+__EXTERN_INLINE void apecs_iowrite32(u32 b, void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       if (addr < APECS_DENSE_MEM)
+               addr = ((addr - APECS_IO) << 5) + APECS_IO + 0x18;
+       *(vuip)addr = b;
+}
+
+__EXTERN_INLINE void __iomem *apecs_ioportmap(unsigned long addr)
+{
+       return (void __iomem *)(addr + APECS_IO);
+}
+
+__EXTERN_INLINE void __iomem *apecs_ioremap(unsigned long addr,
+                                           unsigned long size)
+{
+       return (void __iomem *)(addr + APECS_DENSE_MEM);
+}
+
+__EXTERN_INLINE int apecs_is_ioaddr(unsigned long addr)
+{
+       return addr >= IDENT_ADDR + 0x180000000UL;
+}
+
+__EXTERN_INLINE int apecs_is_mmio(const volatile void __iomem *addr)
+{
+       return (unsigned long)addr >= APECS_DENSE_MEM;
+}
+
+#undef APECS_SET_HAE
+
+#undef vip
+#undef vuip
+#undef vulp
+
+#undef __IO_PREFIX
+#define __IO_PREFIX            apecs
+#define apecs_trivial_io_bw    0
+#define apecs_trivial_io_lq    0
+#define apecs_trivial_rw_bw    2
+#define apecs_trivial_rw_lq    1
+#define apecs_trivial_iounmap  1
+#include <asm/io_trivial.h>
+
+#ifdef __IO_EXTERN_INLINE
+#undef __EXTERN_INLINE
+#undef __IO_EXTERN_INLINE
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_APECS__H__ */
diff --git a/arch/alpha/include/asm/core_cia.h b/arch/alpha/include/asm/core_cia.h
new file mode 100644 (file)
index 0000000..9e0516c
--- /dev/null
@@ -0,0 +1,500 @@
+#ifndef __ALPHA_CIA__H__
+#define __ALPHA_CIA__H__
+
+/* Define to experiment with fitting everything into one 512MB HAE window.  */
+#define CIA_ONE_HAE_WINDOW 1
+
+#include <linux/types.h>
+#include <asm/compiler.h>
+
+/*
+ * CIA is the internal name for the 21171 chipset which provides
+ * memory controller and PCI access for the 21164 chip based systems.
+ * Also supported here is the 21172 (CIA-2) and 21174 (PYXIS).
+ *
+ * The lineage is a bit confused, since the 21174 was reportedly started
+ * from the 21171 Pass 1 mask, and so is missing bug fixes that appear
+ * in 21171 Pass 2 and 21172, but it also contains additional features.
+ *
+ * This file is based on:
+ *
+ * DECchip 21171 Core Logic Chipset
+ * Technical Reference Manual
+ *
+ * EC-QE18B-TE
+ *
+ * david.rusling@reo.mts.dec.com Initial Version.
+ *
+ */
+
+/*
+ * CIA ADDRESS BIT DEFINITIONS
+ *
+ *  3333 3333 3322 2222 2222 1111 1111 11
+ *  9876 5432 1098 7654 3210 9876 5432 1098 7654 3210
+ *  ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
+ *  1                                             000
+ *  ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
+ *  |                                             |\|
+ *  |                               Byte Enable --+ |
+ *  |                             Transfer Length --+
+ *  +-- IO space, not cached
+ *
+ *   Byte      Transfer
+ *   Enable    Length    Transfer  Byte    Address
+ *   adr<6:5>  adr<4:3>  Length    Enable  Adder
+ *   ---------------------------------------------
+ *      00        00      Byte      1110   0x000
+ *      01        00      Byte      1101   0x020
+ *      10        00      Byte      1011   0x040
+ *      11        00      Byte      0111   0x060
+ *
+ *      00        01      Word      1100   0x008
+ *      01        01      Word      1001   0x028 <= Not supported in this code.
+ *      10        01      Word      0011   0x048
+ *
+ *      00        10      Tribyte   1000   0x010
+ *      01        10      Tribyte   0001   0x030
+ *
+ *      10        11      Longword  0000   0x058
+ *
+ *      Note that byte enables are asserted low.
+ *
+ */
+
+#define CIA_MEM_R1_MASK 0x1fffffff  /* SPARSE Mem region 1 mask is 29 bits */
+#define CIA_MEM_R2_MASK 0x07ffffff  /* SPARSE Mem region 2 mask is 27 bits */
+#define CIA_MEM_R3_MASK 0x03ffffff  /* SPARSE Mem region 3 mask is 26 bits */
+
+/*
+ * 21171-CA Control and Status Registers
+ */
+#define CIA_IOC_CIA_REV                        (IDENT_ADDR + 0x8740000080UL)
+#  define CIA_REV_MASK                 0xff
+#define CIA_IOC_PCI_LAT                        (IDENT_ADDR + 0x87400000C0UL)
+#define CIA_IOC_CIA_CTRL               (IDENT_ADDR + 0x8740000100UL)
+#  define CIA_CTRL_PCI_EN              (1 << 0)
+#  define CIA_CTRL_PCI_LOCK_EN         (1 << 1)
+#  define CIA_CTRL_PCI_LOOP_EN         (1 << 2)
+#  define CIA_CTRL_FST_BB_EN           (1 << 3)
+#  define CIA_CTRL_PCI_MST_EN          (1 << 4)
+#  define CIA_CTRL_PCI_MEM_EN          (1 << 5)
+#  define CIA_CTRL_PCI_REQ64_EN                (1 << 6)
+#  define CIA_CTRL_PCI_ACK64_EN                (1 << 7)
+#  define CIA_CTRL_ADDR_PE_EN          (1 << 8)
+#  define CIA_CTRL_PERR_EN             (1 << 9)
+#  define CIA_CTRL_FILL_ERR_EN         (1 << 10)
+#  define CIA_CTRL_MCHK_ERR_EN         (1 << 11)
+#  define CIA_CTRL_ECC_CHK_EN          (1 << 12)
+#  define CIA_CTRL_ASSERT_IDLE_BC      (1 << 13)
+#  define CIA_CTRL_COM_IDLE_BC         (1 << 14)
+#  define CIA_CTRL_CSR_IOA_BYPASS      (1 << 15)
+#  define CIA_CTRL_IO_FLUSHREQ_EN      (1 << 16)
+#  define CIA_CTRL_CPU_FLUSHREQ_EN     (1 << 17)
+#  define CIA_CTRL_ARB_CPU_EN          (1 << 18)
+#  define CIA_CTRL_EN_ARB_LINK         (1 << 19)
+#  define CIA_CTRL_RD_TYPE_SHIFT       20
+#  define CIA_CTRL_RL_TYPE_SHIFT       24
+#  define CIA_CTRL_RM_TYPE_SHIFT       28
+#  define CIA_CTRL_EN_DMA_RD_PERF      (1 << 31)
+#define CIA_IOC_CIA_CNFG               (IDENT_ADDR + 0x8740000140UL)
+#  define CIA_CNFG_IOA_BWEN            (1 << 0)
+#  define CIA_CNFG_PCI_MWEN            (1 << 4)
+#  define CIA_CNFG_PCI_DWEN            (1 << 5)
+#  define CIA_CNFG_PCI_WLEN            (1 << 8)
+#define CIA_IOC_FLASH_CTRL             (IDENT_ADDR + 0x8740000200UL)
+#define CIA_IOC_HAE_MEM                        (IDENT_ADDR + 0x8740000400UL)
+#define CIA_IOC_HAE_IO                 (IDENT_ADDR + 0x8740000440UL)
+#define CIA_IOC_CFG                    (IDENT_ADDR + 0x8740000480UL)
+#define CIA_IOC_CACK_EN                        (IDENT_ADDR + 0x8740000600UL)
+#  define CIA_CACK_EN_LOCK_EN          (1 << 0)
+#  define CIA_CACK_EN_MB_EN            (1 << 1)
+#  define CIA_CACK_EN_SET_DIRTY_EN     (1 << 2)
+#  define CIA_CACK_EN_BC_VICTIM_EN     (1 << 3)
+
+
+/*
+ * 21171-CA Diagnostic Registers
+ */
+#define CIA_IOC_CIA_DIAG               (IDENT_ADDR + 0x8740002000UL)
+#define CIA_IOC_DIAG_CHECK             (IDENT_ADDR + 0x8740003000UL)
+
+/*
+ * 21171-CA Performance Monitor registers
+ */
+#define CIA_IOC_PERF_MONITOR           (IDENT_ADDR + 0x8740004000UL)
+#define CIA_IOC_PERF_CONTROL           (IDENT_ADDR + 0x8740004040UL)
+
+/*
+ * 21171-CA Error registers
+ */
+#define CIA_IOC_CPU_ERR0               (IDENT_ADDR + 0x8740008000UL)
+#define CIA_IOC_CPU_ERR1               (IDENT_ADDR + 0x8740008040UL)
+#define CIA_IOC_CIA_ERR                        (IDENT_ADDR + 0x8740008200UL)
+#  define CIA_ERR_COR_ERR              (1 << 0)
+#  define CIA_ERR_UN_COR_ERR           (1 << 1)
+#  define CIA_ERR_CPU_PE               (1 << 2)
+#  define CIA_ERR_MEM_NEM              (1 << 3)
+#  define CIA_ERR_PCI_SERR             (1 << 4)
+#  define CIA_ERR_PERR                 (1 << 5)
+#  define CIA_ERR_PCI_ADDR_PE          (1 << 6)
+#  define CIA_ERR_RCVD_MAS_ABT         (1 << 7)
+#  define CIA_ERR_RCVD_TAR_ABT         (1 << 8)
+#  define CIA_ERR_PA_PTE_INV           (1 << 9)
+#  define CIA_ERR_FROM_WRT_ERR         (1 << 10)
+#  define CIA_ERR_IOA_TIMEOUT          (1 << 11)
+#  define CIA_ERR_LOST_CORR_ERR                (1 << 16)
+#  define CIA_ERR_LOST_UN_CORR_ERR     (1 << 17)
+#  define CIA_ERR_LOST_CPU_PE          (1 << 18)
+#  define CIA_ERR_LOST_MEM_NEM         (1 << 19)
+#  define CIA_ERR_LOST_PERR            (1 << 21)
+#  define CIA_ERR_LOST_PCI_ADDR_PE     (1 << 22)
+#  define CIA_ERR_LOST_RCVD_MAS_ABT    (1 << 23)
+#  define CIA_ERR_LOST_RCVD_TAR_ABT    (1 << 24)
+#  define CIA_ERR_LOST_PA_PTE_INV      (1 << 25)
+#  define CIA_ERR_LOST_FROM_WRT_ERR    (1 << 26)
+#  define CIA_ERR_LOST_IOA_TIMEOUT     (1 << 27)
+#  define CIA_ERR_VALID                        (1 << 31)
+#define CIA_IOC_CIA_STAT               (IDENT_ADDR + 0x8740008240UL)
+#define CIA_IOC_ERR_MASK               (IDENT_ADDR + 0x8740008280UL)
+#define CIA_IOC_CIA_SYN                        (IDENT_ADDR + 0x8740008300UL)
+#define CIA_IOC_MEM_ERR0               (IDENT_ADDR + 0x8740008400UL)
+#define CIA_IOC_MEM_ERR1               (IDENT_ADDR + 0x8740008440UL)
+#define CIA_IOC_PCI_ERR0               (IDENT_ADDR + 0x8740008800UL)
+#define CIA_IOC_PCI_ERR1               (IDENT_ADDR + 0x8740008840UL)
+#define CIA_IOC_PCI_ERR3               (IDENT_ADDR + 0x8740008880UL)
+
+/*
+ * 21171-CA System configuration registers
+ */
+#define CIA_IOC_MCR                    (IDENT_ADDR + 0x8750000000UL)
+#define CIA_IOC_MBA0                   (IDENT_ADDR + 0x8750000600UL)
+#define CIA_IOC_MBA2                   (IDENT_ADDR + 0x8750000680UL)
+#define CIA_IOC_MBA4                   (IDENT_ADDR + 0x8750000700UL)
+#define CIA_IOC_MBA6                   (IDENT_ADDR + 0x8750000780UL)
+#define CIA_IOC_MBA8                   (IDENT_ADDR + 0x8750000800UL)
+#define CIA_IOC_MBAA                   (IDENT_ADDR + 0x8750000880UL)
+#define CIA_IOC_MBAC                   (IDENT_ADDR + 0x8750000900UL)
+#define CIA_IOC_MBAE                   (IDENT_ADDR + 0x8750000980UL)
+#define CIA_IOC_TMG0                   (IDENT_ADDR + 0x8750000B00UL)
+#define CIA_IOC_TMG1                   (IDENT_ADDR + 0x8750000B40UL)
+#define CIA_IOC_TMG2                   (IDENT_ADDR + 0x8750000B80UL)
+
+/*
+ * 2117A-CA PCI Address and Scatter-Gather Registers.
+ */
+#define CIA_IOC_PCI_TBIA               (IDENT_ADDR + 0x8760000100UL)
+
+#define CIA_IOC_PCI_W0_BASE            (IDENT_ADDR + 0x8760000400UL)
+#define CIA_IOC_PCI_W0_MASK            (IDENT_ADDR + 0x8760000440UL)
+#define CIA_IOC_PCI_T0_BASE            (IDENT_ADDR + 0x8760000480UL)
+
+#define CIA_IOC_PCI_W1_BASE            (IDENT_ADDR + 0x8760000500UL)
+#define CIA_IOC_PCI_W1_MASK            (IDENT_ADDR + 0x8760000540UL)
+#define CIA_IOC_PCI_T1_BASE            (IDENT_ADDR + 0x8760000580UL)
+
+#define CIA_IOC_PCI_W2_BASE            (IDENT_ADDR + 0x8760000600UL)
+#define CIA_IOC_PCI_W2_MASK            (IDENT_ADDR + 0x8760000640UL)
+#define CIA_IOC_PCI_T2_BASE            (IDENT_ADDR + 0x8760000680UL)
+
+#define CIA_IOC_PCI_W3_BASE            (IDENT_ADDR + 0x8760000700UL)
+#define CIA_IOC_PCI_W3_MASK            (IDENT_ADDR + 0x8760000740UL)
+#define CIA_IOC_PCI_T3_BASE            (IDENT_ADDR + 0x8760000780UL)
+
+#define CIA_IOC_PCI_Wn_BASE(N) (IDENT_ADDR + 0x8760000400UL + (N)*0x100) 
+#define CIA_IOC_PCI_Wn_MASK(N) (IDENT_ADDR + 0x8760000440UL + (N)*0x100) 
+#define CIA_IOC_PCI_Tn_BASE(N) (IDENT_ADDR + 0x8760000480UL + (N)*0x100) 
+
+#define CIA_IOC_PCI_W_DAC              (IDENT_ADDR + 0x87600007C0UL)
+
+/*
+ * 2117A-CA Address Translation Registers.
+ */
+
+/* 8 tag registers, the first 4 of which are lockable.  */
+#define CIA_IOC_TB_TAGn(n) \
+       (IDENT_ADDR + 0x8760000800UL + (n)*0x40)
+
+/* 4 page registers per tag register.  */
+#define CIA_IOC_TBn_PAGEm(n,m) \
+       (IDENT_ADDR + 0x8760001000UL + (n)*0x100 + (m)*0x40)
+
+/*
+ * Memory spaces:
+ */
+#define CIA_IACK_SC                    (IDENT_ADDR + 0x8720000000UL)
+#define CIA_CONF                       (IDENT_ADDR + 0x8700000000UL)
+#define CIA_IO                         (IDENT_ADDR + 0x8580000000UL)
+#define CIA_SPARSE_MEM                 (IDENT_ADDR + 0x8000000000UL)
+#define CIA_SPARSE_MEM_R2              (IDENT_ADDR + 0x8400000000UL)
+#define CIA_SPARSE_MEM_R3              (IDENT_ADDR + 0x8500000000UL)
+#define CIA_DENSE_MEM                  (IDENT_ADDR + 0x8600000000UL)
+#define CIA_BW_MEM                     (IDENT_ADDR + 0x8800000000UL)
+#define CIA_BW_IO                      (IDENT_ADDR + 0x8900000000UL)
+#define CIA_BW_CFG_0                   (IDENT_ADDR + 0x8a00000000UL)
+#define CIA_BW_CFG_1                   (IDENT_ADDR + 0x8b00000000UL)
+
+/*
+ * ALCOR's GRU ASIC registers
+ */
+#define GRU_INT_REQ                    (IDENT_ADDR + 0x8780000000UL)
+#define GRU_INT_MASK                   (IDENT_ADDR + 0x8780000040UL)
+#define GRU_INT_EDGE                   (IDENT_ADDR + 0x8780000080UL)
+#define GRU_INT_HILO                   (IDENT_ADDR + 0x87800000C0UL)
+#define GRU_INT_CLEAR                  (IDENT_ADDR + 0x8780000100UL)
+
+#define GRU_CACHE_CNFG                 (IDENT_ADDR + 0x8780000200UL)
+#define GRU_SCR                                (IDENT_ADDR + 0x8780000300UL)
+#define GRU_LED                                (IDENT_ADDR + 0x8780000800UL)
+#define GRU_RESET                      (IDENT_ADDR + 0x8780000900UL)
+
+#define ALCOR_GRU_INT_REQ_BITS         0x800fffffUL
+#define XLT_GRU_INT_REQ_BITS           0x80003fffUL
+#define GRU_INT_REQ_BITS               (alpha_mv.sys.cia.gru_int_req_bits+0)
+
+/*
+ * PYXIS interrupt control registers
+ */
+#define PYXIS_INT_REQ                  (IDENT_ADDR + 0x87A0000000UL)
+#define PYXIS_INT_MASK                 (IDENT_ADDR + 0x87A0000040UL)
+#define PYXIS_INT_HILO                 (IDENT_ADDR + 0x87A00000C0UL)
+#define PYXIS_INT_ROUTE                        (IDENT_ADDR + 0x87A0000140UL)
+#define PYXIS_GPO                      (IDENT_ADDR + 0x87A0000180UL)
+#define PYXIS_INT_CNFG                 (IDENT_ADDR + 0x87A00001C0UL)
+#define PYXIS_RT_COUNT                 (IDENT_ADDR + 0x87A0000200UL)
+#define PYXIS_INT_TIME                 (IDENT_ADDR + 0x87A0000240UL)
+#define PYXIS_IIC_CTRL                 (IDENT_ADDR + 0x87A00002C0UL)
+#define PYXIS_RESET                    (IDENT_ADDR + 0x8780000900UL)
+
+/* Offset between ram physical addresses and pci64 DAC bus addresses.  */
+#define PYXIS_DAC_OFFSET               (1UL << 40)
+
+/*
+ * Data structure for handling CIA machine checks.
+ */
+
+/* System-specific info.  */
+struct el_CIA_sysdata_mcheck {
+       unsigned long   cpu_err0;
+       unsigned long   cpu_err1;
+       unsigned long   cia_err;
+       unsigned long   cia_stat;
+       unsigned long   err_mask;
+       unsigned long   cia_syn;
+       unsigned long   mem_err0;
+       unsigned long   mem_err1;
+       unsigned long   pci_err0;
+       unsigned long   pci_err1;
+       unsigned long   pci_err2;
+};
+
+
+#ifdef __KERNEL__
+
+#ifndef __EXTERN_INLINE
+/* Do not touch, this should *NOT* be static inline */
+#define __EXTERN_INLINE extern inline
+#define __IO_EXTERN_INLINE
+#endif
+
+/*
+ * I/O functions:
+ *
+ * CIA (the 2117x PCI/memory support chipset for the EV5 (21164)
+ * series of processors uses a sparse address mapping scheme to
+ * get at PCI memory and I/O.
+ */
+
+/*
+ * Memory functions.  64-bit and 32-bit accesses are done through
+ * dense memory space, everything else through sparse space.
+ *
+ * For reading and writing 8 and 16 bit quantities we need to
+ * go through one of the three sparse address mapping regions
+ * and use the HAE_MEM CSR to provide some bits of the address.
+ * The following few routines use only sparse address region 1
+ * which gives 1Gbyte of accessible space which relates exactly
+ * to the amount of PCI memory mapping *into* system address space.
+ * See p 6-17 of the specification but it looks something like this:
+ *
+ * 21164 Address:
+ *
+ *          3         2         1
+ * 9876543210987654321098765432109876543210
+ * 1ZZZZ0.PCI.QW.Address............BBLL
+ *
+ * ZZ = SBZ
+ * BB = Byte offset
+ * LL = Transfer length
+ *
+ * PCI Address:
+ *
+ * 3         2         1
+ * 10987654321098765432109876543210
+ * HHH....PCI.QW.Address........ 00
+ *
+ * HHH = 31:29 HAE_MEM CSR
+ *
+ */
+
+#define vip    volatile int __force *
+#define vuip   volatile unsigned int __force *
+#define vulp   volatile unsigned long __force *
+
+__EXTERN_INLINE unsigned int cia_ioread8(void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       unsigned long result, base_and_type;
+
+       if (addr >= CIA_DENSE_MEM)
+               base_and_type = CIA_SPARSE_MEM + 0x00;
+       else
+               base_and_type = CIA_IO + 0x00;
+
+       /* We can use CIA_MEM_R1_MASK for io ports too, since it is large
+          enough to cover all io ports, and smaller than CIA_IO.  */
+       addr &= CIA_MEM_R1_MASK;
+       result = *(vip) ((addr << 5) + base_and_type);
+       return __kernel_extbl(result, addr & 3);
+}
+
+__EXTERN_INLINE void cia_iowrite8(u8 b, void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       unsigned long w, base_and_type;
+
+       if (addr >= CIA_DENSE_MEM)
+               base_and_type = CIA_SPARSE_MEM + 0x00;
+       else
+               base_and_type = CIA_IO + 0x00;
+
+       addr &= CIA_MEM_R1_MASK;
+       w = __kernel_insbl(b, addr & 3);
+       *(vuip) ((addr << 5) + base_and_type) = w;
+}
+
+__EXTERN_INLINE unsigned int cia_ioread16(void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       unsigned long result, base_and_type;
+
+       if (addr >= CIA_DENSE_MEM)
+               base_and_type = CIA_SPARSE_MEM + 0x08;
+       else
+               base_and_type = CIA_IO + 0x08;
+
+       addr &= CIA_MEM_R1_MASK;
+       result = *(vip) ((addr << 5) + base_and_type);
+       return __kernel_extwl(result, addr & 3);
+}
+
+__EXTERN_INLINE void cia_iowrite16(u16 b, void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       unsigned long w, base_and_type;
+
+       if (addr >= CIA_DENSE_MEM)
+               base_and_type = CIA_SPARSE_MEM + 0x08;
+       else
+               base_and_type = CIA_IO + 0x08;
+
+       addr &= CIA_MEM_R1_MASK;
+       w = __kernel_inswl(b, addr & 3);
+       *(vuip) ((addr << 5) + base_and_type) = w;
+}
+
+__EXTERN_INLINE unsigned int cia_ioread32(void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       if (addr < CIA_DENSE_MEM)
+               addr = ((addr - CIA_IO) << 5) + CIA_IO + 0x18;
+       return *(vuip)addr;
+}
+
+__EXTERN_INLINE void cia_iowrite32(u32 b, void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       if (addr < CIA_DENSE_MEM)
+               addr = ((addr - CIA_IO) << 5) + CIA_IO + 0x18;
+       *(vuip)addr = b;
+}
+
+__EXTERN_INLINE void __iomem *cia_ioportmap(unsigned long addr)
+{
+       return (void __iomem *)(addr + CIA_IO);
+}
+
+__EXTERN_INLINE void __iomem *cia_ioremap(unsigned long addr,
+                                         unsigned long size)
+{
+       return (void __iomem *)(addr + CIA_DENSE_MEM);
+}
+
+__EXTERN_INLINE int cia_is_ioaddr(unsigned long addr)
+{
+       return addr >= IDENT_ADDR + 0x8000000000UL;
+}
+
+__EXTERN_INLINE int cia_is_mmio(const volatile void __iomem *addr)
+{
+       return (unsigned long)addr >= CIA_DENSE_MEM;
+}
+
+__EXTERN_INLINE void __iomem *cia_bwx_ioportmap(unsigned long addr)
+{
+       return (void __iomem *)(addr + CIA_BW_IO);
+}
+
+__EXTERN_INLINE void __iomem *cia_bwx_ioremap(unsigned long addr,
+                                             unsigned long size)
+{
+       return (void __iomem *)(addr + CIA_BW_MEM);
+}
+
+__EXTERN_INLINE int cia_bwx_is_ioaddr(unsigned long addr)
+{
+       return addr >= IDENT_ADDR + 0x8000000000UL;
+}
+
+__EXTERN_INLINE int cia_bwx_is_mmio(const volatile void __iomem *addr)
+{
+       return (unsigned long)addr < CIA_BW_IO;
+}
+
+#undef vip
+#undef vuip
+#undef vulp
+
+#undef __IO_PREFIX
+#define __IO_PREFIX            cia
+#define cia_trivial_rw_bw      2
+#define cia_trivial_rw_lq      1
+#define cia_trivial_io_bw      0
+#define cia_trivial_io_lq      0
+#define cia_trivial_iounmap    1
+#include <asm/io_trivial.h>
+
+#undef __IO_PREFIX
+#define __IO_PREFIX            cia_bwx
+#define cia_bwx_trivial_rw_bw  1
+#define cia_bwx_trivial_rw_lq  1
+#define cia_bwx_trivial_io_bw  1
+#define cia_bwx_trivial_io_lq  1
+#define cia_bwx_trivial_iounmap        1
+#include <asm/io_trivial.h>
+
+#undef __IO_PREFIX
+#ifdef CONFIG_ALPHA_PYXIS
+#define __IO_PREFIX            cia_bwx
+#else
+#define __IO_PREFIX            cia
+#endif
+
+#ifdef __IO_EXTERN_INLINE
+#undef __EXTERN_INLINE
+#undef __IO_EXTERN_INLINE
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_CIA__H__ */
diff --git a/arch/alpha/include/asm/core_irongate.h b/arch/alpha/include/asm/core_irongate.h
new file mode 100644 (file)
index 0000000..24b2db5
--- /dev/null
@@ -0,0 +1,232 @@
+#ifndef __ALPHA_IRONGATE__H__
+#define __ALPHA_IRONGATE__H__
+
+#include <linux/types.h>
+#include <asm/compiler.h>
+
+/*
+ * IRONGATE is the internal name for the AMD-751 K7 core logic chipset
+ * which provides memory controller and PCI access for NAUTILUS-based
+ * EV6 (21264) systems.
+ *
+ * This file is based on:
+ *
+ * IronGate management library, (c) 1999 Alpha Processor, Inc.
+ * Copyright (C) 1999 Alpha Processor, Inc.,
+ *     (David Daniel, Stig Telfer, Soohoon Lee)
+ */
+
+/*
+ * The 21264 supports, and internally recognizes, a 44-bit physical
+ * address space that is divided equally between memory address space
+ * and I/O address space. Memory address space resides in the lower
+ * half of the physical address space (PA[43]=0) and I/O address space
+ * resides in the upper half of the physical address space (PA[43]=1).
+ */
+
+/*
+ * Irongate CSR map.  Some of the CSRs are 8 or 16 bits, but all access
+ * through the routines given is 32-bit.
+ *
+ * The first 0x40 bytes are standard as per the PCI spec.
+ */
+
+typedef volatile __u32 igcsr32;
+
+typedef struct {
+       igcsr32 dev_vendor;             /* 0x00 - device ID, vendor ID */
+       igcsr32 stat_cmd;               /* 0x04 - status, command */
+       igcsr32 class;                  /* 0x08 - class code, rev ID */
+       igcsr32 latency;                /* 0x0C - header type, PCI latency */
+       igcsr32 bar0;                   /* 0x10 - BAR0 - AGP */
+       igcsr32 bar1;                   /* 0x14 - BAR1 - GART */
+       igcsr32 bar2;                   /* 0x18 - Power Management reg block */
+
+       igcsr32 rsrvd0[6];              /* 0x1C-0x33 reserved */
+
+       igcsr32 capptr;                 /* 0x34 - Capabilities pointer */
+
+       igcsr32 rsrvd1[2];              /* 0x38-0x3F reserved */
+
+       igcsr32 bacsr10;                /* 0x40 - base address chip selects */
+       igcsr32 bacsr32;                /* 0x44 - base address chip selects */
+       igcsr32 bacsr54_eccms761;       /* 0x48 - 751: base addr. chip selects
+                                                 761: ECC, mode/status */
+
+       igcsr32 rsrvd2[1];              /* 0x4C-0x4F reserved */
+
+       igcsr32 drammap;                /* 0x50 - address mapping control */
+       igcsr32 dramtm;                 /* 0x54 - timing, driver strength */
+       igcsr32 dramms;                 /* 0x58 - DRAM mode/status */
+
+       igcsr32 rsrvd3[1];              /* 0x5C-0x5F reserved */
+
+       igcsr32 biu0;                   /* 0x60 - bus interface unit */
+       igcsr32 biusip;                 /* 0x64 - Serial initialisation pkt */
+
+       igcsr32 rsrvd4[2];              /* 0x68-0x6F reserved */
+
+       igcsr32 mro;                    /* 0x70 - memory request optimiser */
+
+       igcsr32 rsrvd5[3];              /* 0x74-0x7F reserved */
+
+       igcsr32 whami;                  /* 0x80 - who am I */
+       igcsr32 pciarb;                 /* 0x84 - PCI arbitration control */
+       igcsr32 pcicfg;                 /* 0x88 - PCI config status */
+
+       igcsr32 rsrvd6[4];              /* 0x8C-0x9B reserved */
+
+       igcsr32 pci_mem;                /* 0x9C - PCI top of memory,
+                                                 761 only */
+
+       /* AGP (bus 1) control registers */
+       igcsr32 agpcap;                 /* 0xA0 - AGP Capability Identifier */
+       igcsr32 agpstat;                /* 0xA4 - AGP status register */
+       igcsr32 agpcmd;                 /* 0xA8 - AGP control register */
+       igcsr32 agpva;                  /* 0xAC - AGP Virtual Address Space */
+       igcsr32 agpmode;                /* 0xB0 - AGP/GART mode control */
+} Irongate0;
+
+
+typedef struct {
+
+       igcsr32 dev_vendor;             /* 0x00 - Device and Vendor IDs */
+       igcsr32 stat_cmd;               /* 0x04 - Status and Command regs */
+       igcsr32 class;                  /* 0x08 - subclass, baseclass etc */
+       igcsr32 htype;                  /* 0x0C - header type (at 0x0E) */
+       igcsr32 rsrvd0[2];              /* 0x10-0x17 reserved */
+       igcsr32 busnos;                 /* 0x18 - Primary, secondary bus nos */
+       igcsr32 io_baselim_regs;        /* 0x1C - IO base, IO lim, AGP status */
+       igcsr32 mem_baselim;            /* 0x20 - memory base, memory lim */
+       igcsr32 pfmem_baselim;          /* 0x24 - prefetchable base, lim */
+       igcsr32 rsrvd1[2];              /* 0x28-0x2F reserved */
+       igcsr32 io_baselim;             /* 0x30 - IO base, IO limit */
+       igcsr32 rsrvd2[2];              /* 0x34-0x3B - reserved */
+       igcsr32 interrupt;              /* 0x3C - interrupt, PCI bridge ctrl */
+
+} Irongate1;
+
+extern igcsr32 *IronECC;
+
+/*
+ * Memory spaces:
+ */
+
+/* Irongate is consistent with a subset of the Tsunami memory map */
+#ifdef USE_48_BIT_KSEG
+#define IRONGATE_BIAS 0x80000000000UL
+#else
+#define IRONGATE_BIAS 0x10000000000UL
+#endif
+
+
+#define IRONGATE_MEM           (IDENT_ADDR | IRONGATE_BIAS | 0x000000000UL)
+#define IRONGATE_IACK_SC       (IDENT_ADDR | IRONGATE_BIAS | 0x1F8000000UL)
+#define IRONGATE_IO            (IDENT_ADDR | IRONGATE_BIAS | 0x1FC000000UL)
+#define IRONGATE_CONF          (IDENT_ADDR | IRONGATE_BIAS | 0x1FE000000UL)
+
+/*
+ * PCI Configuration space accesses are formed like so:
+ *
+ * 0x1FE << 24 |  : 2 2 2 2 1 1 1 1 : 1 1 1 1 1 1 0 0 : 0 0 0 0 0 0 0 0 :
+ *                : 3 2 1 0 9 8 7 6 : 5 4 3 2 1 0 9 8 : 7 6 5 4 3 2 1 0 :
+ *                  ---bus numer---   -device-- -fun-   ---register----
+ */
+
+#define IGCSR(dev,fun,reg)     ( IRONGATE_CONF | \
+                               ((dev)<<11) | \
+                               ((fun)<<8) | \
+                               (reg) )
+
+#define IRONGATE0              ((Irongate0 *) IGCSR(0, 0, 0))
+#define IRONGATE1              ((Irongate1 *) IGCSR(1, 0, 0))
+
+/*
+ * Data structure for handling IRONGATE machine checks:
+ * This is the standard OSF logout frame
+ */
+
+#define SCB_Q_SYSERR   0x620                   /* OSF definitions */
+#define SCB_Q_PROCERR  0x630
+#define SCB_Q_SYSMCHK  0x660
+#define SCB_Q_PROCMCHK 0x670
+
+struct el_IRONGATE_sysdata_mcheck {
+       __u32 FrameSize;                 /* Bytes, including this field */
+       __u32 FrameFlags;                /* <31> = Retry, <30> = Second Error */
+       __u32 CpuOffset;                 /* Offset to CPU-specific into */
+       __u32 SystemOffset;              /* Offset to system-specific info */
+       __u32 MCHK_Code;
+       __u32 MCHK_Frame_Rev;
+       __u64 I_STAT;
+       __u64 DC_STAT;
+       __u64 C_ADDR;
+       __u64 DC1_SYNDROME;
+       __u64 DC0_SYNDROME;
+       __u64 C_STAT;
+       __u64 C_STS;
+       __u64 RESERVED0;
+       __u64 EXC_ADDR;
+       __u64 IER_CM;
+       __u64 ISUM;
+       __u64 MM_STAT;
+       __u64 PAL_BASE;
+       __u64 I_CTL;
+       __u64 PCTX;
+};
+
+
+#ifdef __KERNEL__
+
+#ifndef __EXTERN_INLINE
+#define __EXTERN_INLINE extern inline
+#define __IO_EXTERN_INLINE
+#endif
+
+/*
+ * I/O functions:
+ *
+ * IRONGATE (AMD-751) PCI/memory support chip for the EV6 (21264) and
+ * K7 can only use linear accesses to get at PCI memory and I/O spaces.
+ */
+
+/*
+ * Memory functions.  All accesses are done through linear space.
+ */
+
+__EXTERN_INLINE void __iomem *irongate_ioportmap(unsigned long addr)
+{
+       return (void __iomem *)(addr + IRONGATE_IO);
+}
+
+extern void __iomem *irongate_ioremap(unsigned long addr, unsigned long size);
+extern void irongate_iounmap(volatile void __iomem *addr);
+
+__EXTERN_INLINE int irongate_is_ioaddr(unsigned long addr)
+{
+       return addr >= IRONGATE_MEM;
+}
+
+__EXTERN_INLINE int irongate_is_mmio(const volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long)xaddr;
+       return addr < IRONGATE_IO || addr >= IRONGATE_CONF;
+}
+
+#undef __IO_PREFIX
+#define __IO_PREFIX                    irongate
+#define irongate_trivial_rw_bw         1
+#define irongate_trivial_rw_lq         1
+#define irongate_trivial_io_bw         1
+#define irongate_trivial_io_lq         1
+#define irongate_trivial_iounmap       0
+#include <asm/io_trivial.h>
+
+#ifdef __IO_EXTERN_INLINE
+#undef __EXTERN_INLINE
+#undef __IO_EXTERN_INLINE
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_IRONGATE__H__ */
diff --git a/arch/alpha/include/asm/core_lca.h b/arch/alpha/include/asm/core_lca.h
new file mode 100644 (file)
index 0000000..f7cb4b4
--- /dev/null
@@ -0,0 +1,361 @@
+#ifndef __ALPHA_LCA__H__
+#define __ALPHA_LCA__H__
+
+#include <asm/system.h>
+#include <asm/compiler.h>
+
+/*
+ * Low Cost Alpha (LCA) definitions (these apply to 21066 and 21068,
+ * for example).
+ *
+ * This file is based on:
+ *
+ *     DECchip 21066 and DECchip 21068 Alpha AXP Microprocessors
+ *     Hardware Reference Manual; Digital Equipment Corp.; May 1994;
+ *     Maynard, MA; Order Number: EC-N2681-71.
+ */
+
+/*
+ * NOTE: The LCA uses a Host Address Extension (HAE) register to access
+ *      PCI addresses that are beyond the first 27 bits of address
+ *      space.  Updating the HAE requires an external cycle (and
+ *      a memory barrier), which tends to be slow.  Instead of updating
+ *      it on each sparse memory access, we keep the current HAE value
+ *      cached in variable cache_hae.  Only if the cached HAE differs
+ *      from the desired HAE value do we actually updated HAE register.
+ *      The HAE register is preserved by the interrupt handler entry/exit
+ *      code, so this scheme works even in the presence of interrupts.
+ *
+ * Dense memory space doesn't require the HAE, but is restricted to
+ * aligned 32 and 64 bit accesses.  Special Cycle and Interrupt
+ * Acknowledge cycles may also require the use of the HAE.  The LCA
+ * limits I/O address space to the bottom 24 bits of address space,
+ * but this easily covers the 16 bit ISA I/O address space.
+ */
+
+/*
+ * NOTE 2! The memory operations do not set any memory barriers, as
+ * it's not needed for cases like a frame buffer that is essentially
+ * memory-like.  You need to do them by hand if the operations depend
+ * on ordering.
+ *
+ * Similarly, the port I/O operations do a "mb" only after a write
+ * operation: if an mb is needed before (as in the case of doing
+ * memory mapped I/O first, and then a port I/O operation to the same
+ * device), it needs to be done by hand.
+ *
+ * After the above has bitten me 100 times, I'll give up and just do
+ * the mb all the time, but right now I'm hoping this will work out.
+ * Avoiding mb's may potentially be a noticeable speed improvement,
+ * but I can't honestly say I've tested it.
+ *
+ * Handling interrupts that need to do mb's to synchronize to
+ * non-interrupts is another fun race area.  Don't do it (because if
+ * you do, I'll have to do *everything* with interrupts disabled,
+ * ugh).
+ */
+
+/*
+ * Memory Controller registers:
+ */
+#define LCA_MEM_BCR0           (IDENT_ADDR + 0x120000000UL)
+#define LCA_MEM_BCR1           (IDENT_ADDR + 0x120000008UL)
+#define LCA_MEM_BCR2           (IDENT_ADDR + 0x120000010UL)
+#define LCA_MEM_BCR3           (IDENT_ADDR + 0x120000018UL)
+#define LCA_MEM_BMR0           (IDENT_ADDR + 0x120000020UL)
+#define LCA_MEM_BMR1           (IDENT_ADDR + 0x120000028UL)
+#define LCA_MEM_BMR2           (IDENT_ADDR + 0x120000030UL)
+#define LCA_MEM_BMR3           (IDENT_ADDR + 0x120000038UL)
+#define LCA_MEM_BTR0           (IDENT_ADDR + 0x120000040UL)
+#define LCA_MEM_BTR1           (IDENT_ADDR + 0x120000048UL)
+#define LCA_MEM_BTR2           (IDENT_ADDR + 0x120000050UL)
+#define LCA_MEM_BTR3           (IDENT_ADDR + 0x120000058UL)
+#define LCA_MEM_GTR            (IDENT_ADDR + 0x120000060UL)
+#define LCA_MEM_ESR            (IDENT_ADDR + 0x120000068UL)
+#define LCA_MEM_EAR            (IDENT_ADDR + 0x120000070UL)
+#define LCA_MEM_CAR            (IDENT_ADDR + 0x120000078UL)
+#define LCA_MEM_VGR            (IDENT_ADDR + 0x120000080UL)
+#define LCA_MEM_PLM            (IDENT_ADDR + 0x120000088UL)
+#define LCA_MEM_FOR            (IDENT_ADDR + 0x120000090UL)
+
+/*
+ * I/O Controller registers:
+ */
+#define LCA_IOC_HAE            (IDENT_ADDR + 0x180000000UL)
+#define LCA_IOC_CONF           (IDENT_ADDR + 0x180000020UL)
+#define LCA_IOC_STAT0          (IDENT_ADDR + 0x180000040UL)
+#define LCA_IOC_STAT1          (IDENT_ADDR + 0x180000060UL)
+#define LCA_IOC_TBIA           (IDENT_ADDR + 0x180000080UL)
+#define LCA_IOC_TB_ENA         (IDENT_ADDR + 0x1800000a0UL)
+#define LCA_IOC_SFT_RST                (IDENT_ADDR + 0x1800000c0UL)
+#define LCA_IOC_PAR_DIS                (IDENT_ADDR + 0x1800000e0UL)
+#define LCA_IOC_W_BASE0                (IDENT_ADDR + 0x180000100UL)
+#define LCA_IOC_W_BASE1                (IDENT_ADDR + 0x180000120UL)
+#define LCA_IOC_W_MASK0                (IDENT_ADDR + 0x180000140UL)
+#define LCA_IOC_W_MASK1                (IDENT_ADDR + 0x180000160UL)
+#define LCA_IOC_T_BASE0                (IDENT_ADDR + 0x180000180UL)
+#define LCA_IOC_T_BASE1                (IDENT_ADDR + 0x1800001a0UL)
+#define LCA_IOC_TB_TAG0                (IDENT_ADDR + 0x188000000UL)
+#define LCA_IOC_TB_TAG1                (IDENT_ADDR + 0x188000020UL)
+#define LCA_IOC_TB_TAG2                (IDENT_ADDR + 0x188000040UL)
+#define LCA_IOC_TB_TAG3                (IDENT_ADDR + 0x188000060UL)
+#define LCA_IOC_TB_TAG4                (IDENT_ADDR + 0x188000070UL)
+#define LCA_IOC_TB_TAG5                (IDENT_ADDR + 0x1880000a0UL)
+#define LCA_IOC_TB_TAG6                (IDENT_ADDR + 0x1880000c0UL)
+#define LCA_IOC_TB_TAG7                (IDENT_ADDR + 0x1880000e0UL)
+
+/*
+ * Memory spaces:
+ */
+#define LCA_IACK_SC            (IDENT_ADDR + 0x1a0000000UL)
+#define LCA_CONF               (IDENT_ADDR + 0x1e0000000UL)
+#define LCA_IO                 (IDENT_ADDR + 0x1c0000000UL)
+#define LCA_SPARSE_MEM         (IDENT_ADDR + 0x200000000UL)
+#define LCA_DENSE_MEM          (IDENT_ADDR + 0x300000000UL)
+
+/*
+ * Bit definitions for I/O Controller status register 0:
+ */
+#define LCA_IOC_STAT0_CMD              0xf
+#define LCA_IOC_STAT0_ERR              (1<<4)
+#define LCA_IOC_STAT0_LOST             (1<<5)
+#define LCA_IOC_STAT0_THIT             (1<<6)
+#define LCA_IOC_STAT0_TREF             (1<<7)
+#define LCA_IOC_STAT0_CODE_SHIFT       8
+#define LCA_IOC_STAT0_CODE_MASK                0x7
+#define LCA_IOC_STAT0_P_NBR_SHIFT      13
+#define LCA_IOC_STAT0_P_NBR_MASK       0x7ffff
+
+#define LCA_HAE_ADDRESS                LCA_IOC_HAE
+
+/* LCA PMR Power Management register defines */
+#define LCA_PMR_ADDR   (IDENT_ADDR + 0x120000098UL)
+#define LCA_PMR_PDIV    0x7                     /* Primary clock divisor */
+#define LCA_PMR_ODIV    0x38                    /* Override clock divisor */
+#define LCA_PMR_INTO    0x40                    /* Interrupt override */
+#define LCA_PMR_DMAO    0x80                    /* DMA override */
+#define LCA_PMR_OCCEB   0xffff0000L             /* Override cycle counter - even bits */
+#define LCA_PMR_OCCOB   0xffff000000000000L     /* Override cycle counter - even bits */
+#define LCA_PMR_PRIMARY_MASK    0xfffffffffffffff8L
+
+/* LCA PMR Macros */
+
+#define LCA_READ_PMR        (*(volatile unsigned long *)LCA_PMR_ADDR)
+#define LCA_WRITE_PMR(d)    (*((volatile unsigned long *)LCA_PMR_ADDR) = (d))
+
+#define LCA_GET_PRIMARY(r)  ((r) & LCA_PMR_PDIV)
+#define LCA_GET_OVERRIDE(r) (((r) >> 3) & LCA_PMR_PDIV)
+#define LCA_SET_PRIMARY_CLOCK(r, c) ((r) = (((r) & LCA_PMR_PRIMARY_MASK)|(c)))
+
+/* LCA PMR Divisor values */
+#define LCA_PMR_DIV_1   0x0
+#define LCA_PMR_DIV_1_5 0x1
+#define LCA_PMR_DIV_2   0x2
+#define LCA_PMR_DIV_4   0x3
+#define LCA_PMR_DIV_8   0x4
+#define LCA_PMR_DIV_16  0x5
+#define LCA_PMR_DIV_MIN DIV_1
+#define LCA_PMR_DIV_MAX DIV_16
+
+
+/*
+ * Data structure for handling LCA machine checks.  Correctable errors
+ * result in a short logout frame, uncorrectable ones in a long one.
+ */
+struct el_lca_mcheck_short {
+       struct el_common        h;              /* common logout header */
+       unsigned long           esr;            /* error-status register */
+       unsigned long           ear;            /* error-address register */
+       unsigned long           dc_stat;        /* dcache status register */
+       unsigned long           ioc_stat0;      /* I/O controller status register 0 */
+       unsigned long           ioc_stat1;      /* I/O controller status register 1 */
+};
+
+struct el_lca_mcheck_long {
+       struct el_common        h;              /* common logout header */
+       unsigned long           pt[31];         /* PAL temps */
+       unsigned long           exc_addr;       /* exception address */
+       unsigned long           pad1[3];
+       unsigned long           pal_base;       /* PALcode base address */
+       unsigned long           hier;           /* hw interrupt enable */
+       unsigned long           hirr;           /* hw interrupt request */
+       unsigned long           mm_csr;         /* MMU control & status */
+       unsigned long           dc_stat;        /* data cache status */
+       unsigned long           dc_addr;        /* data cache addr register */
+       unsigned long           abox_ctl;       /* address box control register */
+       unsigned long           esr;            /* error status register */
+       unsigned long           ear;            /* error address register */
+       unsigned long           car;            /* cache control register */
+       unsigned long           ioc_stat0;      /* I/O controller status register 0 */
+       unsigned long           ioc_stat1;      /* I/O controller status register 1 */
+       unsigned long           va;             /* virtual address register */
+};
+
+union el_lca {
+       struct el_common *              c;
+       struct el_lca_mcheck_long *     l;
+       struct el_lca_mcheck_short *    s;
+};
+
+#ifdef __KERNEL__
+
+#ifndef __EXTERN_INLINE
+#define __EXTERN_INLINE extern inline
+#define __IO_EXTERN_INLINE
+#endif
+
+/*
+ * I/O functions:
+ *
+ * Unlike Jensen, the Noname machines have no concept of local
+ * I/O---everything goes over the PCI bus.
+ *
+ * There is plenty room for optimization here.  In particular,
+ * the Alpha's insb/insw/extb/extw should be useful in moving
+ * data to/from the right byte-lanes.
+ */
+
+#define vip    volatile int __force *
+#define vuip   volatile unsigned int __force *
+#define vulp   volatile unsigned long __force *
+
+#define LCA_SET_HAE                                            \
+       do {                                                    \
+               if (addr >= (1UL << 24)) {                      \
+                       unsigned long msb = addr & 0xf8000000;  \
+                       addr -= msb;                            \
+                       set_hae(msb);                           \
+               }                                               \
+       } while (0)
+
+
+__EXTERN_INLINE unsigned int lca_ioread8(void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       unsigned long result, base_and_type;
+
+       if (addr >= LCA_DENSE_MEM) {
+               addr -= LCA_DENSE_MEM;
+               LCA_SET_HAE;
+               base_and_type = LCA_SPARSE_MEM + 0x00;
+       } else {
+               addr -= LCA_IO;
+               base_and_type = LCA_IO + 0x00;
+       }
+
+       result = *(vip) ((addr << 5) + base_and_type);
+       return __kernel_extbl(result, addr & 3);
+}
+
+__EXTERN_INLINE void lca_iowrite8(u8 b, void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       unsigned long w, base_and_type;
+
+       if (addr >= LCA_DENSE_MEM) {
+               addr -= LCA_DENSE_MEM;
+               LCA_SET_HAE;
+               base_and_type = LCA_SPARSE_MEM + 0x00;
+       } else {
+               addr -= LCA_IO;
+               base_and_type = LCA_IO + 0x00;
+       }
+
+       w = __kernel_insbl(b, addr & 3);
+       *(vuip) ((addr << 5) + base_and_type) = w;
+}
+
+__EXTERN_INLINE unsigned int lca_ioread16(void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       unsigned long result, base_and_type;
+
+       if (addr >= LCA_DENSE_MEM) {
+               addr -= LCA_DENSE_MEM;
+               LCA_SET_HAE;
+               base_and_type = LCA_SPARSE_MEM + 0x08;
+       } else {
+               addr -= LCA_IO;
+               base_and_type = LCA_IO + 0x08;
+       }
+
+       result = *(vip) ((addr << 5) + base_and_type);
+       return __kernel_extwl(result, addr & 3);
+}
+
+__EXTERN_INLINE void lca_iowrite16(u16 b, void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       unsigned long w, base_and_type;
+
+       if (addr >= LCA_DENSE_MEM) {
+               addr -= LCA_DENSE_MEM;
+               LCA_SET_HAE;
+               base_and_type = LCA_SPARSE_MEM + 0x08;
+       } else {
+               addr -= LCA_IO;
+               base_and_type = LCA_IO + 0x08;
+       }
+
+       w = __kernel_inswl(b, addr & 3);
+       *(vuip) ((addr << 5) + base_and_type) = w;
+}
+
+__EXTERN_INLINE unsigned int lca_ioread32(void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       if (addr < LCA_DENSE_MEM)
+               addr = ((addr - LCA_IO) << 5) + LCA_IO + 0x18;
+       return *(vuip)addr;
+}
+
+__EXTERN_INLINE void lca_iowrite32(u32 b, void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       if (addr < LCA_DENSE_MEM)
+               addr = ((addr - LCA_IO) << 5) + LCA_IO + 0x18;
+       *(vuip)addr = b;
+}
+
+__EXTERN_INLINE void __iomem *lca_ioportmap(unsigned long addr)
+{
+       return (void __iomem *)(addr + LCA_IO);
+}
+
+__EXTERN_INLINE void __iomem *lca_ioremap(unsigned long addr,
+                                         unsigned long size)
+{
+       return (void __iomem *)(addr + LCA_DENSE_MEM);
+}
+
+__EXTERN_INLINE int lca_is_ioaddr(unsigned long addr)
+{
+       return addr >= IDENT_ADDR + 0x120000000UL;
+}
+
+__EXTERN_INLINE int lca_is_mmio(const volatile void __iomem *addr)
+{
+       return (unsigned long)addr >= LCA_DENSE_MEM;
+}
+
+#undef vip
+#undef vuip
+#undef vulp
+
+#undef __IO_PREFIX
+#define __IO_PREFIX            lca
+#define lca_trivial_rw_bw      2
+#define lca_trivial_rw_lq      1
+#define lca_trivial_io_bw      0
+#define lca_trivial_io_lq      0
+#define lca_trivial_iounmap    1
+#include <asm/io_trivial.h>
+
+#ifdef __IO_EXTERN_INLINE
+#undef __EXTERN_INLINE
+#undef __IO_EXTERN_INLINE
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_LCA__H__ */
diff --git a/arch/alpha/include/asm/core_marvel.h b/arch/alpha/include/asm/core_marvel.h
new file mode 100644 (file)
index 0000000..30d55fe
--- /dev/null
@@ -0,0 +1,378 @@
+/*
+ * Marvel systems use the IO7 I/O chip provides PCI/PCIX/AGP access
+ *
+ * This file is based on:
+ *
+ * Marvel / EV7 System Programmer's Manual
+ * Revision 1.00
+ * 14 May 2001
+ */
+
+#ifndef __ALPHA_MARVEL__H__
+#define __ALPHA_MARVEL__H__
+
+#include <linux/types.h>
+#include <linux/pci.h>
+#include <linux/spinlock.h>
+
+#include <asm/compiler.h>
+
+#define MARVEL_MAX_PIDS                 32 /* as long as we rely on 43-bit superpage */
+#define MARVEL_IRQ_VEC_PE_SHIFT        (10)
+#define MARVEL_IRQ_VEC_IRQ_MASK        ((1 << MARVEL_IRQ_VEC_PE_SHIFT) - 1)
+#define MARVEL_NR_IRQS         \
+       (16 + (MARVEL_MAX_PIDS * (1 << MARVEL_IRQ_VEC_PE_SHIFT)))
+
+/*
+ * EV7 RBOX Registers
+ */
+typedef struct {
+       volatile unsigned long csr __attribute__((aligned(16)));
+} ev7_csr;
+
+typedef struct {
+       ev7_csr RBOX_CFG;               /* 0x0000 */
+       ev7_csr RBOX_NSVC;
+       ev7_csr RBOX_EWVC;
+       ev7_csr RBOX_WHAMI;
+       ev7_csr RBOX_TCTL;              /* 0x0040 */
+       ev7_csr RBOX_INT;
+       ev7_csr RBOX_IMASK;
+       ev7_csr RBOX_IREQ;
+       ev7_csr RBOX_INTQ;              /* 0x0080 */
+       ev7_csr RBOX_INTA;
+       ev7_csr RBOX_IT;
+       ev7_csr RBOX_SCRATCH1;
+       ev7_csr RBOX_SCRATCH2;          /* 0x00c0 */
+       ev7_csr RBOX_L_ERR;
+} ev7_csrs;
+
+/*
+ * EV7 CSR addressing macros
+ */
+#define EV7_MASK40(addr)        ((addr) & ((1UL << 41) - 1))
+#define EV7_KERN_ADDR(addr)    ((void *)(IDENT_ADDR | EV7_MASK40(addr)))
+
+#define EV7_PE_MASK            0x1ffUL /* 9 bits ( 256 + mem/io ) */
+#define EV7_IPE(pe)            ((~((long)(pe)) & EV7_PE_MASK) << 35)
+
+#define EV7_CSR_PHYS(pe, off)  (EV7_IPE(pe) | (0x7FFCUL << 20) | (off))
+#define EV7_CSRS_PHYS(pe)      (EV7_CSR_PHYS(pe, 0UL))
+
+#define EV7_CSR_KERN(pe, off)  (EV7_KERN_ADDR(EV7_CSR_PHYS(pe, off)))
+#define EV7_CSRS_KERN(pe)      (EV7_KERN_ADDR(EV7_CSRS_PHYS(pe)))
+
+#define EV7_CSR_OFFSET(name)   ((unsigned long)&((ev7_csrs *)NULL)->name.csr)
+
+/*
+ * IO7 registers
+ */
+typedef struct {
+       volatile unsigned long csr __attribute__((aligned(64)));
+} io7_csr;
+
+typedef struct {
+       /* I/O Port Control Registers */
+       io7_csr POx_CTRL;               /* 0x0000 */
+       io7_csr POx_CACHE_CTL;
+       io7_csr POx_TIMER;
+       io7_csr POx_IO_ADR_EXT;
+       io7_csr POx_MEM_ADR_EXT;        /* 0x0100 */
+       io7_csr POx_XCAL_CTRL;
+       io7_csr rsvd1[2];       /* ?? spec doesn't show 0x180 */
+       io7_csr POx_DM_SOURCE;          /* 0x0200 */
+       io7_csr POx_DM_DEST;
+       io7_csr POx_DM_SIZE;
+       io7_csr POx_DM_CTRL;
+       io7_csr rsvd2[4];               /* 0x0300 */
+
+       /* AGP Control Registers -- port 3 only */
+       io7_csr AGP_CAP_ID;             /* 0x0400 */
+       io7_csr AGP_STAT;
+       io7_csr AGP_CMD;
+       io7_csr rsvd3;
+
+       /* I/O Port Monitor Registers */
+       io7_csr POx_MONCTL;             /* 0x0500 */
+       io7_csr POx_CTRA;
+       io7_csr POx_CTRB;
+       io7_csr POx_CTR56;
+       io7_csr POx_SCRATCH;            /* 0x0600 */
+       io7_csr POx_XTRA_A;
+       io7_csr POx_XTRA_TS;
+       io7_csr POx_XTRA_Z;
+       io7_csr rsvd4;                  /* 0x0700 */
+       io7_csr POx_THRESHA;
+       io7_csr POx_THRESHB;
+       io7_csr rsvd5[33];
+
+       /* System Address Space Window Control Registers */
+
+       io7_csr POx_WBASE[4];           /* 0x1000 */
+       io7_csr POx_WMASK[4];
+       io7_csr POx_TBASE[4];
+       io7_csr POx_SG_TBIA;
+       io7_csr POx_MSI_WBASE;
+       io7_csr rsvd6[50];
+
+       /* I/O Port Error Registers */
+       io7_csr POx_ERR_SUM;
+       io7_csr POx_FIRST_ERR;
+       io7_csr POx_MSK_HEI;
+       io7_csr POx_TLB_ERR;
+       io7_csr POx_SPL_COMPLT;
+       io7_csr POx_TRANS_SUM;
+       io7_csr POx_FRC_PCI_ERR;
+       io7_csr POx_MULT_ERR;
+       io7_csr rsvd7[8];
+
+       /* I/O Port End of Interrupt Registers */
+       io7_csr EOI_DAT;
+       io7_csr rsvd8[7];
+       io7_csr POx_IACK_SPECIAL;
+       io7_csr rsvd9[103];
+} io7_ioport_csrs;
+
+typedef struct {
+       io7_csr IO_ASIC_REV;            /* 0x30.0000 */
+       io7_csr IO_SYS_REV;
+       io7_csr SER_CHAIN3;
+       io7_csr PO7_RST1;
+       io7_csr PO7_RST2;               /* 0x30.0100 */
+       io7_csr POx_RST[4];
+       io7_csr IO7_DWNH;
+       io7_csr IO7_MAF;
+       io7_csr IO7_MAF_TO;
+       io7_csr IO7_ACC_CLUMP;          /* 0x30.0300 */
+       io7_csr IO7_PMASK;
+       io7_csr IO7_IOMASK;
+       io7_csr IO7_UPH;
+       io7_csr IO7_UPH_TO;             /* 0x30.0400 */
+       io7_csr RBX_IREQ_OFF;
+       io7_csr RBX_INTA_OFF;
+       io7_csr INT_RTY;
+       io7_csr PO7_MONCTL;             /* 0x30.0500 */
+       io7_csr PO7_CTRA;
+       io7_csr PO7_CTRB;
+       io7_csr PO7_CTR56;
+       io7_csr PO7_SCRATCH;            /* 0x30.0600 */
+       io7_csr PO7_XTRA_A;
+       io7_csr PO7_XTRA_TS;
+       io7_csr PO7_XTRA_Z;
+       io7_csr PO7_PMASK;              /* 0x30.0700 */
+       io7_csr PO7_THRESHA;
+       io7_csr PO7_THRESHB;
+       io7_csr rsvd1[97];
+       io7_csr PO7_ERROR_SUM;          /* 0x30.2000 */
+       io7_csr PO7_BHOLE_MASK;
+       io7_csr PO7_HEI_MSK;
+       io7_csr PO7_CRD_MSK;
+       io7_csr PO7_UNCRR_SYM;          /* 0x30.2100 */
+       io7_csr PO7_CRRCT_SYM;
+       io7_csr PO7_ERR_PKT[2];
+       io7_csr PO7_UGBGE_SYM;          /* 0x30.2200 */
+       io7_csr rsbv2[887];
+       io7_csr PO7_LSI_CTL[128];       /* 0x31.0000 */
+       io7_csr rsvd3[123];
+       io7_csr HLT_CTL;                /* 0x31.3ec0 */
+       io7_csr HPI_CTL;                /* 0x31.3f00 */
+       io7_csr CRD_CTL;
+       io7_csr STV_CTL;
+       io7_csr HEI_CTL;
+       io7_csr PO7_MSI_CTL[16];        /* 0x31.4000 */
+       io7_csr rsvd4[240];
+
+       /*
+        * Interrupt Diagnostic / Test
+        */
+       struct {
+               io7_csr INT_PND;
+               io7_csr INT_CLR;
+               io7_csr INT_EOI;
+               io7_csr rsvd[29];
+       } INT_DIAG[4];
+       io7_csr rsvd5[125];             /* 0x31.a000 */
+       io7_csr MISC_PND;               /* 0x31.b800 */
+       io7_csr rsvd6[31];
+       io7_csr MSI_PND[16];            /* 0x31.c000 */
+       io7_csr rsvd7[16];
+       io7_csr MSI_CLR[16];            /* 0x31.c800 */
+} io7_port7_csrs;
+
+/* 
+ * IO7 DMA Window Base register (POx_WBASEx)
+ */
+#define wbase_m_ena  0x1
+#define wbase_m_sg   0x2
+#define wbase_m_dac  0x4
+#define wbase_m_addr 0xFFF00000
+union IO7_POx_WBASE {
+       struct {
+               unsigned ena : 1;       /* <0>                  */
+               unsigned sg : 1;        /* <1>                  */
+               unsigned dac : 1;       /* <2> -- window 3 only */
+               unsigned rsvd1 : 17; 
+               unsigned addr : 12;     /* <31:20>              */
+               unsigned rsvd2 : 32;
+       } bits;
+       unsigned as_long[2];
+       unsigned as_quad;
+};
+
+/*
+ * IO7 IID (Interrupt IDentifier) format
+ *
+ * For level-sensative interrupts, int_num is encoded as:
+ *
+ *     bus/port        slot/device     INTx
+ *     <7:5>           <4:2>           <1:0>
+ */
+union IO7_IID {
+       struct {
+               unsigned int_num : 9;           /* <8:0>        */
+               unsigned tpu_mask : 4;          /* <12:9> rsvd  */
+               unsigned msi : 1;               /* 13           */
+               unsigned ipe : 10;              /* <23:14>      */
+               unsigned long rsvd : 40;                
+       } bits;
+       unsigned int as_long[2];
+       unsigned long as_quad;
+};
+
+/*
+ * IO7 addressing macros
+ */
+#define IO7_KERN_ADDR(addr)    (EV7_KERN_ADDR(addr))
+
+#define IO7_PORT_MASK          0x07UL  /* 3 bits of port          */
+
+#define IO7_IPE(pe)            (EV7_IPE(pe))
+#define IO7_IPORT(port)                ((~((long)(port)) & IO7_PORT_MASK) << 32)
+
+#define IO7_HOSE(pe, port)     (IO7_IPE(pe) | IO7_IPORT(port))
+
+#define IO7_MEM_PHYS(pe, port) (IO7_HOSE(pe, port) | 0x00000000UL)
+#define IO7_CONF_PHYS(pe, port)        (IO7_HOSE(pe, port) | 0xFE000000UL)
+#define IO7_IO_PHYS(pe, port)  (IO7_HOSE(pe, port) | 0xFF000000UL)
+#define IO7_CSR_PHYS(pe, port, off) \
+                                (IO7_HOSE(pe, port) | 0xFF800000UL | (off))
+#define IO7_CSRS_PHYS(pe, port)        (IO7_CSR_PHYS(pe, port, 0UL))
+#define IO7_PORT7_CSRS_PHYS(pe) (IO7_CSR_PHYS(pe, 7, 0x300000UL))
+
+#define IO7_MEM_KERN(pe, port)      (IO7_KERN_ADDR(IO7_MEM_PHYS(pe, port)))
+#define IO7_CONF_KERN(pe, port)     (IO7_KERN_ADDR(IO7_CONF_PHYS(pe, port)))
+#define IO7_IO_KERN(pe, port)       (IO7_KERN_ADDR(IO7_IO_PHYS(pe, port)))
+#define IO7_CSR_KERN(pe, port, off) (IO7_KERN_ADDR(IO7_CSR_PHYS(pe,port,off)))
+#define IO7_CSRS_KERN(pe, port)     (IO7_KERN_ADDR(IO7_CSRS_PHYS(pe, port)))
+#define IO7_PORT7_CSRS_KERN(pe)            (IO7_KERN_ADDR(IO7_PORT7_CSRS_PHYS(pe)))
+
+#define IO7_PLL_RNGA(pll)      (((pll) >> 3) & 0x7)
+#define IO7_PLL_RNGB(pll)      (((pll) >> 6) & 0x7)
+
+#define IO7_MEM_SPACE          (2UL * 1024 * 1024 * 1024)      /* 2GB MEM */
+#define IO7_IO_SPACE           (8UL * 1024 * 1024)             /* 8MB I/O */
+
+/* 
+ * Offset between ram physical addresses and pci64 DAC addresses
+ */
+#define IO7_DAC_OFFSET         (1UL << 49)
+
+/*
+ * This is needed to satisify the IO() macro used in initializing the machvec
+ */
+#define MARVEL_IACK_SC                                                         \
+        ((unsigned long)                                               \
+        (&(((io7_ioport_csrs *)IO7_CSRS_KERN(0, 0))->POx_IACK_SPECIAL)))
+
+#ifdef __KERNEL__
+
+/*
+ * IO7 structs
+ */
+#define IO7_NUM_PORTS 4
+#define IO7_AGP_PORT  3
+
+struct io7_port {
+       struct io7 *io7;
+       struct pci_controller *hose;
+
+       int enabled;
+       unsigned int port;
+       io7_ioport_csrs *csrs;
+
+       unsigned long saved_wbase[4];
+       unsigned long saved_wmask[4];
+       unsigned long saved_tbase[4];
+};
+
+struct io7 {
+       struct io7 *next;
+
+       unsigned int pe;
+       io7_port7_csrs *csrs;
+       struct io7_port ports[IO7_NUM_PORTS];
+
+       spinlock_t irq_lock;
+};
+
+#ifndef __EXTERN_INLINE
+# define __EXTERN_INLINE extern inline
+# define __IO_EXTERN_INLINE
+#endif
+
+/*
+ * I/O functions. All access through linear space.
+ */
+
+/*
+ * Memory functions.  All accesses through linear space.
+ */
+
+#define vucp   volatile unsigned char __force *
+#define vusp   volatile unsigned short __force *
+
+extern unsigned int marvel_ioread8(void __iomem *);
+extern void marvel_iowrite8(u8 b, void __iomem *);
+
+__EXTERN_INLINE unsigned int marvel_ioread16(void __iomem *addr)
+{
+       return __kernel_ldwu(*(vusp)addr);
+}
+
+__EXTERN_INLINE void marvel_iowrite16(u16 b, void __iomem *addr)
+{
+       __kernel_stw(b, *(vusp)addr);
+}
+
+extern void __iomem *marvel_ioremap(unsigned long addr, unsigned long size);
+extern void marvel_iounmap(volatile void __iomem *addr);
+extern void __iomem *marvel_ioportmap (unsigned long addr);
+
+__EXTERN_INLINE int marvel_is_ioaddr(unsigned long addr)
+{
+       return (addr >> 40) & 1;
+}
+
+extern int marvel_is_mmio(const volatile void __iomem *);
+
+#undef vucp
+#undef vusp
+
+#undef __IO_PREFIX
+#define __IO_PREFIX            marvel
+#define marvel_trivial_rw_bw   1
+#define marvel_trivial_rw_lq   1
+#define marvel_trivial_io_bw   0
+#define marvel_trivial_io_lq   1
+#define marvel_trivial_iounmap 0
+#include <asm/io_trivial.h>
+
+#ifdef __IO_EXTERN_INLINE
+# undef __EXTERN_INLINE
+# undef __IO_EXTERN_INLINE
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_MARVEL__H__ */
diff --git a/arch/alpha/include/asm/core_mcpcia.h b/arch/alpha/include/asm/core_mcpcia.h
new file mode 100644 (file)
index 0000000..acf55b4
--- /dev/null
@@ -0,0 +1,381 @@
+#ifndef __ALPHA_MCPCIA__H__
+#define __ALPHA_MCPCIA__H__
+
+/* Define to experiment with fitting everything into one 128MB HAE window.
+   One window per bus, that is.  */
+#define MCPCIA_ONE_HAE_WINDOW 1
+
+#include <linux/types.h>
+#include <linux/pci.h>
+#include <asm/compiler.h>
+
+/*
+ * MCPCIA is the internal name for a core logic chipset which provides
+ * PCI access for the RAWHIDE family of systems.
+ *
+ * This file is based on:
+ *
+ * RAWHIDE System Programmer's Manual
+ * 16-May-96
+ * Rev. 1.4
+ *
+ */
+
+/*------------------------------------------------------------------------**
+**                                                                        **
+**  I/O procedures                                                        **
+**                                                                        **
+**      inport[b|w|t|l], outport[b|w|t|l] 8:16:24:32 IO xfers             **
+**     inportbxt: 8 bits only                                            **
+**      inport:    alias of inportw                                       **
+**      outport:   alias of outportw                                      **
+**                                                                        **
+**      inmem[b|w|t|l], outmem[b|w|t|l] 8:16:24:32 ISA memory xfers       **
+**     inmembxt: 8 bits only                                             **
+**      inmem:    alias of inmemw                                         **
+**      outmem:   alias of outmemw                                        **
+**                                                                        **
+**------------------------------------------------------------------------*/
+
+
+/* MCPCIA ADDRESS BIT DEFINITIONS
+ *
+ *  3333 3333 3322 2222 2222 1111 1111 11
+ *  9876 5432 1098 7654 3210 9876 5432 1098 7654 3210
+ *  ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
+ *  1                                             000
+ *  ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
+ *  |                                             |\|
+ *  |                               Byte Enable --+ |
+ *  |                             Transfer Length --+
+ *  +-- IO space, not cached
+ *
+ *   Byte      Transfer
+ *   Enable    Length    Transfer  Byte    Address
+ *   adr<6:5>  adr<4:3>  Length    Enable  Adder
+ *   ---------------------------------------------
+ *      00        00      Byte      1110   0x000
+ *      01        00      Byte      1101   0x020
+ *      10        00      Byte      1011   0x040
+ *      11        00      Byte      0111   0x060
+ *
+ *      00        01      Word      1100   0x008
+ *      01        01      Word      1001   0x028 <= Not supported in this code.
+ *      10        01      Word      0011   0x048
+ *
+ *      00        10      Tribyte   1000   0x010
+ *      01        10      Tribyte   0001   0x030
+ *
+ *      10        11      Longword  0000   0x058
+ *
+ *      Note that byte enables are asserted low.
+ *
+ */
+
+#define MCPCIA_MAX_HOSES 4
+
+#define MCPCIA_MID(m)          ((unsigned long)(m) << 33)
+
+/* Dodge has PCI0 and PCI1 at MID 4 and 5 respectively. 
+   Durango adds PCI2 and PCI3 at MID 6 and 7 respectively.  */
+#define MCPCIA_HOSE2MID(h)     ((h) + 4)
+
+#define MCPCIA_MEM_MASK 0x07ffffff /* SPARSE Mem region mask is 27 bits */
+
+/*
+ * Memory spaces:
+ */
+#define MCPCIA_SPARSE(m)       (IDENT_ADDR + 0xf000000000UL + MCPCIA_MID(m))
+#define MCPCIA_DENSE(m)                (IDENT_ADDR + 0xf100000000UL + MCPCIA_MID(m))
+#define MCPCIA_IO(m)           (IDENT_ADDR + 0xf180000000UL + MCPCIA_MID(m))
+#define MCPCIA_CONF(m)         (IDENT_ADDR + 0xf1c0000000UL + MCPCIA_MID(m))
+#define MCPCIA_CSR(m)          (IDENT_ADDR + 0xf1e0000000UL + MCPCIA_MID(m))
+#define MCPCIA_IO_IACK(m)      (IDENT_ADDR + 0xf1f0000000UL + MCPCIA_MID(m))
+#define MCPCIA_DENSE_IO(m)     (IDENT_ADDR + 0xe1fc000000UL + MCPCIA_MID(m))
+#define MCPCIA_DENSE_CONF(m)   (IDENT_ADDR + 0xe1fe000000UL + MCPCIA_MID(m))
+
+/*
+ *  General Registers
+ */
+#define MCPCIA_REV(m)          (MCPCIA_CSR(m) + 0x000)
+#define MCPCIA_WHOAMI(m)       (MCPCIA_CSR(m) + 0x040)
+#define MCPCIA_PCI_LAT(m)      (MCPCIA_CSR(m) + 0x080)
+#define MCPCIA_CAP_CTRL(m)     (MCPCIA_CSR(m) + 0x100)
+#define MCPCIA_HAE_MEM(m)      (MCPCIA_CSR(m) + 0x400)
+#define MCPCIA_HAE_IO(m)       (MCPCIA_CSR(m) + 0x440)
+#define _MCPCIA_IACK_SC(m)     (MCPCIA_CSR(m) + 0x480)
+#define MCPCIA_HAE_DENSE(m)    (MCPCIA_CSR(m) + 0x4C0)
+
+/*
+ * Interrupt Control registers
+ */
+#define MCPCIA_INT_CTL(m)      (MCPCIA_CSR(m) + 0x500)
+#define MCPCIA_INT_REQ(m)      (MCPCIA_CSR(m) + 0x540)
+#define MCPCIA_INT_TARG(m)     (MCPCIA_CSR(m) + 0x580)
+#define MCPCIA_INT_ADR(m)      (MCPCIA_CSR(m) + 0x5C0)
+#define MCPCIA_INT_ADR_EXT(m)  (MCPCIA_CSR(m) + 0x600)
+#define MCPCIA_INT_MASK0(m)    (MCPCIA_CSR(m) + 0x640)
+#define MCPCIA_INT_MASK1(m)    (MCPCIA_CSR(m) + 0x680)
+#define MCPCIA_INT_ACK0(m)     (MCPCIA_CSR(m) + 0x10003f00)
+#define MCPCIA_INT_ACK1(m)     (MCPCIA_CSR(m) + 0x10003f40)
+
+/*
+ * Performance Monitor registers
+ */
+#define MCPCIA_PERF_MON(m)     (MCPCIA_CSR(m) + 0x300)
+#define MCPCIA_PERF_CONT(m)    (MCPCIA_CSR(m) + 0x340)
+
+/*
+ * Diagnostic Registers
+ */
+#define MCPCIA_CAP_DIAG(m)     (MCPCIA_CSR(m) + 0x700)
+#define MCPCIA_TOP_OF_MEM(m)   (MCPCIA_CSR(m) + 0x7C0)
+
+/*
+ * Error registers
+ */
+#define MCPCIA_MC_ERR0(m)      (MCPCIA_CSR(m) + 0x800)
+#define MCPCIA_MC_ERR1(m)      (MCPCIA_CSR(m) + 0x840)
+#define MCPCIA_CAP_ERR(m)      (MCPCIA_CSR(m) + 0x880)
+#define MCPCIA_PCI_ERR1(m)     (MCPCIA_CSR(m) + 0x1040)
+#define MCPCIA_MDPA_STAT(m)    (MCPCIA_CSR(m) + 0x4000)
+#define MCPCIA_MDPA_SYN(m)     (MCPCIA_CSR(m) + 0x4040)
+#define MCPCIA_MDPA_DIAG(m)    (MCPCIA_CSR(m) + 0x4080)
+#define MCPCIA_MDPB_STAT(m)    (MCPCIA_CSR(m) + 0x8000)
+#define MCPCIA_MDPB_SYN(m)     (MCPCIA_CSR(m) + 0x8040)
+#define MCPCIA_MDPB_DIAG(m)    (MCPCIA_CSR(m) + 0x8080)
+
+/*
+ * PCI Address Translation Registers.
+ */
+#define MCPCIA_SG_TBIA(m)      (MCPCIA_CSR(m) + 0x1300)
+#define MCPCIA_HBASE(m)                (MCPCIA_CSR(m) + 0x1340)
+
+#define MCPCIA_W0_BASE(m)      (MCPCIA_CSR(m) + 0x1400)
+#define MCPCIA_W0_MASK(m)      (MCPCIA_CSR(m) + 0x1440)
+#define MCPCIA_T0_BASE(m)      (MCPCIA_CSR(m) + 0x1480)
+
+#define MCPCIA_W1_BASE(m)      (MCPCIA_CSR(m) + 0x1500)
+#define MCPCIA_W1_MASK(m)      (MCPCIA_CSR(m) + 0x1540)
+#define MCPCIA_T1_BASE(m)      (MCPCIA_CSR(m) + 0x1580)
+
+#define MCPCIA_W2_BASE(m)      (MCPCIA_CSR(m) + 0x1600)
+#define MCPCIA_W2_MASK(m)      (MCPCIA_CSR(m) + 0x1640)
+#define MCPCIA_T2_BASE(m)      (MCPCIA_CSR(m) + 0x1680)
+
+#define MCPCIA_W3_BASE(m)      (MCPCIA_CSR(m) + 0x1700)
+#define MCPCIA_W3_MASK(m)      (MCPCIA_CSR(m) + 0x1740)
+#define MCPCIA_T3_BASE(m)      (MCPCIA_CSR(m) + 0x1780)
+
+/* Hack!  Only words for bus 0.  */
+
+#ifndef MCPCIA_ONE_HAE_WINDOW
+#define MCPCIA_HAE_ADDRESS     MCPCIA_HAE_MEM(4)
+#endif
+#define MCPCIA_IACK_SC         _MCPCIA_IACK_SC(4)
+
+/* 
+ * The canonical non-remaped I/O and MEM addresses have these values
+ * subtracted out.  This is arranged so that folks manipulating ISA
+ * devices can use their familiar numbers and have them map to bus 0.
+ */
+
+#define MCPCIA_IO_BIAS         MCPCIA_IO(4)
+#define MCPCIA_MEM_BIAS                MCPCIA_DENSE(4)
+
+/* Offset between ram physical addresses and pci64 DAC bus addresses.  */
+#define MCPCIA_DAC_OFFSET      (1UL << 40)
+
+/*
+ * Data structure for handling MCPCIA machine checks:
+ */
+struct el_MCPCIA_uncorrected_frame_mcheck {
+       struct el_common header;
+       struct el_common_EV5_uncorrectable_mcheck procdata;
+};
+
+
+#ifdef __KERNEL__
+
+#ifndef __EXTERN_INLINE
+#define __EXTERN_INLINE extern inline
+#define __IO_EXTERN_INLINE
+#endif
+
+/*
+ * I/O functions:
+ *
+ * MCPCIA, the RAWHIDE family PCI/memory support chipset for the EV5 (21164)
+ * and EV56 (21164a) processors, can use either a sparse address mapping
+ * scheme, or the so-called byte-word PCI address space, to get at PCI memory
+ * and I/O.
+ *
+ * Unfortunately, we can't use BWIO with EV5, so for now, we always use SPARSE.
+ */
+
+/*
+ * Memory functions.  64-bit and 32-bit accesses are done through
+ * dense memory space, everything else through sparse space.
+ *
+ * For reading and writing 8 and 16 bit quantities we need to
+ * go through one of the three sparse address mapping regions
+ * and use the HAE_MEM CSR to provide some bits of the address.
+ * The following few routines use only sparse address region 1
+ * which gives 1Gbyte of accessible space which relates exactly
+ * to the amount of PCI memory mapping *into* system address space.
+ * See p 6-17 of the specification but it looks something like this:
+ *
+ * 21164 Address:
+ *
+ *          3         2         1
+ * 9876543210987654321098765432109876543210
+ * 1ZZZZ0.PCI.QW.Address............BBLL
+ *
+ * ZZ = SBZ
+ * BB = Byte offset
+ * LL = Transfer length
+ *
+ * PCI Address:
+ *
+ * 3         2         1
+ * 10987654321098765432109876543210
+ * HHH....PCI.QW.Address........ 00
+ *
+ * HHH = 31:29 HAE_MEM CSR
+ *
+ */
+
+#define vip    volatile int __force *
+#define vuip   volatile unsigned int __force *
+
+#ifdef MCPCIA_ONE_HAE_WINDOW
+#define MCPCIA_FROB_MMIO                                               \
+       if (__mcpcia_is_mmio(hose)) {                                   \
+               set_hae(hose & 0xffffffff);                             \
+               hose = hose - MCPCIA_DENSE(4) + MCPCIA_SPARSE(4);       \
+       }
+#else
+#define MCPCIA_FROB_MMIO                                               \
+       if (__mcpcia_is_mmio(hose)) {                                   \
+               hose = hose - MCPCIA_DENSE(4) + MCPCIA_SPARSE(4);       \
+       }
+#endif
+
+extern inline int __mcpcia_is_mmio(unsigned long addr)
+{
+       return (addr & 0x80000000UL) == 0;
+}
+
+__EXTERN_INLINE unsigned int mcpcia_ioread8(void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long)xaddr & MCPCIA_MEM_MASK;
+       unsigned long hose = (unsigned long)xaddr & ~MCPCIA_MEM_MASK;
+       unsigned long result;
+
+       MCPCIA_FROB_MMIO;
+
+       result = *(vip) ((addr << 5) + hose + 0x00);
+       return __kernel_extbl(result, addr & 3);
+}
+
+__EXTERN_INLINE void mcpcia_iowrite8(u8 b, void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long)xaddr & MCPCIA_MEM_MASK;
+       unsigned long hose = (unsigned long)xaddr & ~MCPCIA_MEM_MASK;
+       unsigned long w;
+
+       MCPCIA_FROB_MMIO;
+
+       w = __kernel_insbl(b, addr & 3);
+       *(vuip) ((addr << 5) + hose + 0x00) = w;
+}
+
+__EXTERN_INLINE unsigned int mcpcia_ioread16(void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long)xaddr & MCPCIA_MEM_MASK;
+       unsigned long hose = (unsigned long)xaddr & ~MCPCIA_MEM_MASK;
+       unsigned long result;
+
+       MCPCIA_FROB_MMIO;
+
+       result = *(vip) ((addr << 5) + hose + 0x08);
+       return __kernel_extwl(result, addr & 3);
+}
+
+__EXTERN_INLINE void mcpcia_iowrite16(u16 b, void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long)xaddr & MCPCIA_MEM_MASK;
+       unsigned long hose = (unsigned long)xaddr & ~MCPCIA_MEM_MASK;
+       unsigned long w;
+
+       MCPCIA_FROB_MMIO;
+
+       w = __kernel_inswl(b, addr & 3);
+       *(vuip) ((addr << 5) + hose + 0x08) = w;
+}
+
+__EXTERN_INLINE unsigned int mcpcia_ioread32(void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long)xaddr;
+
+       if (!__mcpcia_is_mmio(addr))
+               addr = ((addr & 0xffff) << 5) + (addr & ~0xfffful) + 0x18;
+
+       return *(vuip)addr;
+}
+
+__EXTERN_INLINE void mcpcia_iowrite32(u32 b, void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long)xaddr;
+
+       if (!__mcpcia_is_mmio(addr))
+               addr = ((addr & 0xffff) << 5) + (addr & ~0xfffful) + 0x18;
+
+       *(vuip)addr = b;
+}
+
+
+__EXTERN_INLINE void __iomem *mcpcia_ioportmap(unsigned long addr)
+{
+       return (void __iomem *)(addr + MCPCIA_IO_BIAS);
+}
+
+__EXTERN_INLINE void __iomem *mcpcia_ioremap(unsigned long addr,
+                                            unsigned long size)
+{
+       return (void __iomem *)(addr + MCPCIA_MEM_BIAS);
+}
+
+__EXTERN_INLINE int mcpcia_is_ioaddr(unsigned long addr)
+{
+       return addr >= MCPCIA_SPARSE(0);
+}
+
+__EXTERN_INLINE int mcpcia_is_mmio(const volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       return __mcpcia_is_mmio(addr);
+}
+
+#undef MCPCIA_FROB_MMIO
+
+#undef vip
+#undef vuip
+
+#undef __IO_PREFIX
+#define __IO_PREFIX            mcpcia
+#define mcpcia_trivial_rw_bw   2
+#define mcpcia_trivial_rw_lq   1
+#define mcpcia_trivial_io_bw   0
+#define mcpcia_trivial_io_lq   0
+#define mcpcia_trivial_iounmap 1
+#include <asm/io_trivial.h>
+
+#ifdef __IO_EXTERN_INLINE
+#undef __EXTERN_INLINE
+#undef __IO_EXTERN_INLINE
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_MCPCIA__H__ */
diff --git a/arch/alpha/include/asm/core_polaris.h b/arch/alpha/include/asm/core_polaris.h
new file mode 100644 (file)
index 0000000..2f966b6
--- /dev/null
@@ -0,0 +1,110 @@
+#ifndef __ALPHA_POLARIS__H__
+#define __ALPHA_POLARIS__H__
+
+#include <linux/types.h>
+#include <asm/compiler.h>
+
+/*
+ * POLARIS is the internal name for a core logic chipset which provides
+ * memory controller and PCI access for the 21164PC chip based systems.
+ *
+ * This file is based on:
+ *
+ * Polaris System Controller
+ * Device Functional Specification
+ * 22-Jan-98
+ * Rev. 4.2
+ *
+ */
+
+/* Polaris memory regions */
+#define POLARIS_SPARSE_MEM_BASE                (IDENT_ADDR + 0xf800000000UL)
+#define POLARIS_DENSE_MEM_BASE         (IDENT_ADDR + 0xf900000000UL)
+#define POLARIS_SPARSE_IO_BASE         (IDENT_ADDR + 0xf980000000UL)
+#define POLARIS_SPARSE_CONFIG_BASE     (IDENT_ADDR + 0xf9c0000000UL)
+#define POLARIS_IACK_BASE              (IDENT_ADDR + 0xf9f8000000UL)
+#define POLARIS_DENSE_IO_BASE          (IDENT_ADDR + 0xf9fc000000UL)
+#define POLARIS_DENSE_CONFIG_BASE      (IDENT_ADDR + 0xf9fe000000UL)
+
+#define POLARIS_IACK_SC                        POLARIS_IACK_BASE
+
+/* The Polaris command/status registers live in PCI Config space for
+ * bus 0/device 0.  As such, they may be bytes, words, or doublewords.
+ */
+#define POLARIS_W_VENID                (POLARIS_DENSE_CONFIG_BASE)
+#define POLARIS_W_DEVID                (POLARIS_DENSE_CONFIG_BASE+2)
+#define POLARIS_W_CMD          (POLARIS_DENSE_CONFIG_BASE+4)
+#define POLARIS_W_STATUS       (POLARIS_DENSE_CONFIG_BASE+6)
+
+/*
+ * Data structure for handling POLARIS machine checks:
+ */
+struct el_POLARIS_sysdata_mcheck {
+    u_long      psc_status;
+    u_long     psc_pcictl0;
+    u_long     psc_pcictl1;
+    u_long     psc_pcictl2;
+};
+
+#ifdef __KERNEL__
+
+#ifndef __EXTERN_INLINE
+#define __EXTERN_INLINE extern inline
+#define __IO_EXTERN_INLINE
+#endif
+
+/*
+ * I/O functions:
+ *
+ * POLARIS, the PCI/memory support chipset for the PCA56 (21164PC)
+ * processors, can use either a sparse address  mapping scheme, or the 
+ * so-called byte-word PCI address space, to get at PCI memory and I/O.
+ *
+ * However, we will support only the BWX form.
+ */
+
+/*
+ * Memory functions.  Polaris allows all accesses (byte/word
+ * as well as long/quad) to be done through dense space.
+ *
+ * We will only support DENSE access via BWX insns.
+ */
+
+__EXTERN_INLINE void __iomem *polaris_ioportmap(unsigned long addr)
+{
+       return (void __iomem *)(addr + POLARIS_DENSE_IO_BASE);
+}
+
+__EXTERN_INLINE void __iomem *polaris_ioremap(unsigned long addr,
+                                             unsigned long size)
+{
+       return (void __iomem *)(addr + POLARIS_DENSE_MEM_BASE);
+}
+
+__EXTERN_INLINE int polaris_is_ioaddr(unsigned long addr)
+{
+       return addr >= POLARIS_SPARSE_MEM_BASE;
+}
+
+__EXTERN_INLINE int polaris_is_mmio(const volatile void __iomem *addr)
+{
+       return (unsigned long)addr < POLARIS_SPARSE_IO_BASE;
+}
+
+#undef __IO_PREFIX
+#define __IO_PREFIX            polaris
+#define polaris_trivial_rw_bw  1
+#define polaris_trivial_rw_lq  1
+#define polaris_trivial_io_bw  1
+#define polaris_trivial_io_lq  1
+#define polaris_trivial_iounmap        1
+#include <asm/io_trivial.h>
+
+#ifdef __IO_EXTERN_INLINE
+#undef __EXTERN_INLINE
+#undef __IO_EXTERN_INLINE
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_POLARIS__H__ */
diff --git a/arch/alpha/include/asm/core_t2.h b/arch/alpha/include/asm/core_t2.h
new file mode 100644 (file)
index 0000000..46bfff5
--- /dev/null
@@ -0,0 +1,633 @@
+#ifndef __ALPHA_T2__H__
+#define __ALPHA_T2__H__
+
+#include <linux/types.h>
+#include <linux/spinlock.h>
+#include <asm/compiler.h>
+#include <asm/system.h>
+
+/*
+ * T2 is the internal name for the core logic chipset which provides
+ * memory controller and PCI access for the SABLE-based systems.
+ *
+ * This file is based on:
+ *
+ * SABLE I/O Specification
+ * Revision/Update Information: 1.3
+ *
+ * jestabro@amt.tay1.dec.com Initial Version.
+ *
+ */
+
+#define T2_MEM_R1_MASK 0x07ffffff  /* Mem sparse region 1 mask is 26 bits */
+
+/* GAMMA-SABLE is a SABLE with EV5-based CPUs */
+/* All LYNX machines, EV4 or EV5, use the GAMMA bias also */
+#define _GAMMA_BIAS            0x8000000000UL
+
+#if defined(CONFIG_ALPHA_GENERIC)
+#define GAMMA_BIAS             alpha_mv.sys.t2.gamma_bias
+#elif defined(CONFIG_ALPHA_GAMMA)
+#define GAMMA_BIAS             _GAMMA_BIAS
+#else
+#define GAMMA_BIAS             0
+#endif
+
+/*
+ * Memory spaces:
+ */
+#define T2_CONF                        (IDENT_ADDR + GAMMA_BIAS + 0x390000000UL)
+#define T2_IO                  (IDENT_ADDR + GAMMA_BIAS + 0x3a0000000UL)
+#define T2_SPARSE_MEM          (IDENT_ADDR + GAMMA_BIAS + 0x200000000UL)
+#define T2_DENSE_MEM           (IDENT_ADDR + GAMMA_BIAS + 0x3c0000000UL)
+
+#define T2_IOCSR               (IDENT_ADDR + GAMMA_BIAS + 0x38e000000UL)
+#define T2_CERR1               (IDENT_ADDR + GAMMA_BIAS + 0x38e000020UL)
+#define T2_CERR2               (IDENT_ADDR + GAMMA_BIAS + 0x38e000040UL)
+#define T2_CERR3               (IDENT_ADDR + GAMMA_BIAS + 0x38e000060UL)
+#define T2_PERR1               (IDENT_ADDR + GAMMA_BIAS + 0x38e000080UL)
+#define T2_PERR2               (IDENT_ADDR + GAMMA_BIAS + 0x38e0000a0UL)
+#define T2_PSCR                        (IDENT_ADDR + GAMMA_BIAS + 0x38e0000c0UL)
+#define T2_HAE_1               (IDENT_ADDR + GAMMA_BIAS + 0x38e0000e0UL)
+#define T2_HAE_2               (IDENT_ADDR + GAMMA_BIAS + 0x38e000100UL)
+#define T2_HBASE               (IDENT_ADDR + GAMMA_BIAS + 0x38e000120UL)
+#define T2_WBASE1              (IDENT_ADDR + GAMMA_BIAS + 0x38e000140UL)
+#define T2_WMASK1              (IDENT_ADDR + GAMMA_BIAS + 0x38e000160UL)
+#define T2_TBASE1              (IDENT_ADDR + GAMMA_BIAS + 0x38e000180UL)
+#define T2_WBASE2              (IDENT_ADDR + GAMMA_BIAS + 0x38e0001a0UL)
+#define T2_WMASK2              (IDENT_ADDR + GAMMA_BIAS + 0x38e0001c0UL)
+#define T2_TBASE2              (IDENT_ADDR + GAMMA_BIAS + 0x38e0001e0UL)
+#define T2_TLBBR               (IDENT_ADDR + GAMMA_BIAS + 0x38e000200UL)
+#define T2_IVR                 (IDENT_ADDR + GAMMA_BIAS + 0x38e000220UL)
+#define T2_HAE_3               (IDENT_ADDR + GAMMA_BIAS + 0x38e000240UL)
+#define T2_HAE_4               (IDENT_ADDR + GAMMA_BIAS + 0x38e000260UL)
+
+/* The CSRs below are T3/T4 only */
+#define T2_WBASE3              (IDENT_ADDR + GAMMA_BIAS + 0x38e000280UL)
+#define T2_WMASK3              (IDENT_ADDR + GAMMA_BIAS + 0x38e0002a0UL)
+#define T2_TBASE3              (IDENT_ADDR + GAMMA_BIAS + 0x38e0002c0UL)
+
+#define T2_TDR0                        (IDENT_ADDR + GAMMA_BIAS + 0x38e000300UL)
+#define T2_TDR1                        (IDENT_ADDR + GAMMA_BIAS + 0x38e000320UL)
+#define T2_TDR2                        (IDENT_ADDR + GAMMA_BIAS + 0x38e000340UL)
+#define T2_TDR3                        (IDENT_ADDR + GAMMA_BIAS + 0x38e000360UL)
+#define T2_TDR4                        (IDENT_ADDR + GAMMA_BIAS + 0x38e000380UL)
+#define T2_TDR5                        (IDENT_ADDR + GAMMA_BIAS + 0x38e0003a0UL)
+#define T2_TDR6                        (IDENT_ADDR + GAMMA_BIAS + 0x38e0003c0UL)
+#define T2_TDR7                        (IDENT_ADDR + GAMMA_BIAS + 0x38e0003e0UL)
+
+#define T2_WBASE4              (IDENT_ADDR + GAMMA_BIAS + 0x38e000400UL)
+#define T2_WMASK4              (IDENT_ADDR + GAMMA_BIAS + 0x38e000420UL)
+#define T2_TBASE4              (IDENT_ADDR + GAMMA_BIAS + 0x38e000440UL)
+
+#define T2_AIR                 (IDENT_ADDR + GAMMA_BIAS + 0x38e000460UL)
+#define T2_VAR                 (IDENT_ADDR + GAMMA_BIAS + 0x38e000480UL)
+#define T2_DIR                 (IDENT_ADDR + GAMMA_BIAS + 0x38e0004a0UL)
+#define T2_ICE                 (IDENT_ADDR + GAMMA_BIAS + 0x38e0004c0UL)
+
+#define T2_HAE_ADDRESS         T2_HAE_1
+
+/*  T2 CSRs are in the non-cachable primary IO space from 3.8000.0000 to
+ 3.8fff.ffff
+ *
+ *  +--------------+ 3 8000 0000
+ *  | CPU 0 CSRs   |
+ *  +--------------+ 3 8100 0000
+ *  | CPU 1 CSRs   |
+ *  +--------------+ 3 8200 0000
+ *  | CPU 2 CSRs   |
+ *  +--------------+ 3 8300 0000
+ *  | CPU 3 CSRs   |
+ *  +--------------+ 3 8400 0000
+ *  | CPU Reserved |
+ *  +--------------+ 3 8700 0000
+ *  | Mem Reserved |
+ *  +--------------+ 3 8800 0000
+ *  | Mem 0 CSRs   |
+ *  +--------------+ 3 8900 0000
+ *  | Mem 1 CSRs   |
+ *  +--------------+ 3 8a00 0000
+ *  | Mem 2 CSRs   |
+ *  +--------------+ 3 8b00 0000
+ *  | Mem 3 CSRs   |
+ *  +--------------+ 3 8c00 0000
+ *  | Mem Reserved |
+ *  +--------------+ 3 8e00 0000
+ *  | PCI Bridge   |
+ *  +--------------+ 3 8f00 0000
+ *  | Expansion IO |
+ *  +--------------+ 3 9000 0000
+ *
+ *
+ */
+#define T2_CPU0_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x380000000L)
+#define T2_CPU1_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x381000000L)
+#define T2_CPU2_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x382000000L)
+#define T2_CPU3_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x383000000L)
+
+#define T2_CPUn_BASE(n)                (T2_CPU0_BASE + (((n)&3) * 0x001000000L))
+
+#define T2_MEM0_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x388000000L)
+#define T2_MEM1_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x389000000L)
+#define T2_MEM2_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x38a000000L)
+#define T2_MEM3_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x38b000000L)
+
+
+/*
+ * Sable CPU Module CSRS
+ *
+ * These are CSRs for hardware other than the CPU chip on the CPU module.
+ * The CPU module has Backup Cache control logic, Cbus control logic, and
+ * interrupt control logic on it.  There is a duplicate tag store to speed
+ * up maintaining cache coherency.
+ */
+
+struct sable_cpu_csr {
+  unsigned long bcc;     long fill_00[3]; /* Backup Cache Control */
+  unsigned long bcce;    long fill_01[3]; /* Backup Cache Correctable Error */
+  unsigned long bccea;   long fill_02[3]; /* B-Cache Corr Err Address Latch */
+  unsigned long bcue;    long fill_03[3]; /* B-Cache Uncorrectable Error */
+  unsigned long bcuea;   long fill_04[3]; /* B-Cache Uncorr Err Addr Latch */
+  unsigned long dter;    long fill_05[3]; /* Duplicate Tag Error */
+  unsigned long cbctl;   long fill_06[3]; /* CBus Control */
+  unsigned long cbe;     long fill_07[3]; /* CBus Error */
+  unsigned long cbeal;   long fill_08[3]; /* CBus Error Addr Latch low */
+  unsigned long cbeah;   long fill_09[3]; /* CBus Error Addr Latch high */
+  unsigned long pmbx;    long fill_10[3]; /* Processor Mailbox */
+  unsigned long ipir;    long fill_11[3]; /* Inter-Processor Int Request */
+  unsigned long sic;     long fill_12[3]; /* System Interrupt Clear */
+  unsigned long adlk;    long fill_13[3]; /* Address Lock (LDxL/STxC) */
+  unsigned long madrl;   long fill_14[3]; /* CBus Miss Address */
+  unsigned long rev;     long fill_15[3]; /* CMIC Revision */
+};
+
+/*
+ * Data structure for handling T2 machine checks:
+ */
+struct el_t2_frame_header {
+       unsigned int    elcf_fid;       /* Frame ID (from above) */
+       unsigned int    elcf_size;      /* Size of frame in bytes */
+};
+
+struct el_t2_procdata_mcheck {
+       unsigned long   elfmc_paltemp[32];      /* PAL TEMP REGS. */
+       /* EV4-specific fields */
+       unsigned long   elfmc_exc_addr; /* Addr of excepting insn. */
+       unsigned long   elfmc_exc_sum;  /* Summary of arith traps. */
+       unsigned long   elfmc_exc_mask; /* Exception mask (from exc_sum). */
+       unsigned long   elfmc_iccsr;    /* IBox hardware enables. */
+       unsigned long   elfmc_pal_base; /* Base address for PALcode. */
+       unsigned long   elfmc_hier;     /* Hardware Interrupt Enable. */
+       unsigned long   elfmc_hirr;     /* Hardware Interrupt Request. */
+       unsigned long   elfmc_mm_csr;   /* D-stream fault info. */
+       unsigned long   elfmc_dc_stat;  /* D-cache status (ECC/Parity Err). */
+       unsigned long   elfmc_dc_addr;  /* EV3 Phys Addr for ECC/DPERR. */
+       unsigned long   elfmc_abox_ctl; /* ABox Control Register. */
+       unsigned long   elfmc_biu_stat; /* BIU Status. */
+       unsigned long   elfmc_biu_addr; /* BUI Address. */
+       unsigned long   elfmc_biu_ctl;  /* BIU Control. */
+       unsigned long   elfmc_fill_syndrome; /* For correcting ECC errors. */
+       unsigned long   elfmc_fill_addr;/* Cache block which was being read. */
+       unsigned long   elfmc_va;       /* Effective VA of fault or miss. */
+       unsigned long   elfmc_bc_tag;   /* Backup Cache Tag Probe Results. */
+};
+
+/*
+ * Sable processor specific Machine Check Data segment.
+ */
+
+struct el_t2_logout_header {
+       unsigned int    elfl_size;      /* size in bytes of logout area. */
+       unsigned int    elfl_sbz1:31;   /* Should be zero. */
+       unsigned int    elfl_retry:1;   /* Retry flag. */
+       unsigned int    elfl_procoffset; /* Processor-specific offset. */
+       unsigned int    elfl_sysoffset;  /* Offset of system-specific. */
+       unsigned int    elfl_error_type;        /* PAL error type code. */
+       unsigned int    elfl_frame_rev;         /* PAL Frame revision. */
+};
+struct el_t2_sysdata_mcheck {
+       unsigned long    elcmc_bcc;           /* CSR 0 */
+       unsigned long    elcmc_bcce;          /* CSR 1 */
+       unsigned long    elcmc_bccea;      /* CSR 2 */
+       unsigned long    elcmc_bcue;          /* CSR 3 */
+       unsigned long    elcmc_bcuea;      /* CSR 4 */
+       unsigned long    elcmc_dter;          /* CSR 5 */
+       unsigned long    elcmc_cbctl;      /* CSR 6 */
+       unsigned long    elcmc_cbe;           /* CSR 7 */
+       unsigned long    elcmc_cbeal;      /* CSR 8 */
+       unsigned long    elcmc_cbeah;      /* CSR 9 */
+       unsigned long    elcmc_pmbx;          /* CSR 10 */
+       unsigned long    elcmc_ipir;          /* CSR 11 */
+       unsigned long    elcmc_sic;           /* CSR 12 */
+       unsigned long    elcmc_adlk;          /* CSR 13 */
+       unsigned long    elcmc_madrl;      /* CSR 14 */
+       unsigned long    elcmc_crrev4;     /* CSR 15 */
+};
+
+/*
+ * Sable memory error frame - sable pfms section 3.42
+ */
+struct el_t2_data_memory {
+       struct  el_t2_frame_header elcm_hdr;    /* ID$MEM-FERR = 0x08 */
+       unsigned int  elcm_module;      /* Module id. */
+       unsigned int  elcm_res04;       /* Reserved. */
+       unsigned long elcm_merr;        /* CSR0: Error Reg 1. */
+       unsigned long elcm_mcmd1;       /* CSR1: Command Trap 1. */
+       unsigned long elcm_mcmd2;       /* CSR2: Command Trap 2. */
+       unsigned long elcm_mconf;       /* CSR3: Configuration. */
+       unsigned long elcm_medc1;       /* CSR4: EDC Status 1. */
+       unsigned long elcm_medc2;       /* CSR5: EDC Status 2. */
+       unsigned long elcm_medcc;       /* CSR6: EDC Control. */
+       unsigned long elcm_msctl;       /* CSR7: Stream Buffer Control. */
+       unsigned long elcm_mref;        /* CSR8: Refresh Control. */
+       unsigned long elcm_filter;      /* CSR9: CRD Filter Control. */
+};
+
+
+/*
+ * Sable other CPU error frame - sable pfms section 3.43
+ */
+struct el_t2_data_other_cpu {
+       short         elco_cpuid;       /* CPU ID */
+       short         elco_res02[3];
+       unsigned long elco_bcc; /* CSR 0 */
+       unsigned long elco_bcce;        /* CSR 1 */
+       unsigned long elco_bccea;       /* CSR 2 */
+       unsigned long elco_bcue;        /* CSR 3 */
+       unsigned long elco_bcuea;       /* CSR 4 */
+       unsigned long elco_dter;        /* CSR 5 */
+       unsigned long elco_cbctl;       /* CSR 6 */
+       unsigned long elco_cbe; /* CSR 7 */
+       unsigned long elco_cbeal;       /* CSR 8 */
+       unsigned long elco_cbeah;       /* CSR 9 */
+       unsigned long elco_pmbx;        /* CSR 10 */
+       unsigned long elco_ipir;        /* CSR 11 */
+       unsigned long elco_sic; /* CSR 12 */
+       unsigned long elco_adlk;        /* CSR 13 */
+       unsigned long elco_madrl;       /* CSR 14 */
+       unsigned long elco_crrev4;      /* CSR 15 */
+};
+
+/*
+ * Sable other CPU error frame - sable pfms section 3.44
+ */
+struct el_t2_data_t2{
+       struct el_t2_frame_header elct_hdr;     /* ID$T2-FRAME */
+       unsigned long elct_iocsr;       /* IO Control and Status Register */
+       unsigned long elct_cerr1;       /* Cbus Error Register 1 */
+       unsigned long elct_cerr2;       /* Cbus Error Register 2 */
+       unsigned long elct_cerr3;       /* Cbus Error Register 3 */
+       unsigned long elct_perr1;       /* PCI Error Register 1 */
+       unsigned long elct_perr2;       /* PCI Error Register 2 */
+       unsigned long elct_hae0_1;      /* High Address Extension Register 1 */
+       unsigned long elct_hae0_2;      /* High Address Extension Register 2 */
+       unsigned long elct_hbase;       /* High Base Register */
+       unsigned long elct_wbase1;      /* Window Base Register 1 */
+       unsigned long elct_wmask1;      /* Window Mask Register 1 */
+       unsigned long elct_tbase1;      /* Translated Base Register 1 */
+       unsigned long elct_wbase2;      /* Window Base Register 2 */
+       unsigned long elct_wmask2;      /* Window Mask Register 2 */
+       unsigned long elct_tbase2;      /* Translated Base Register 2 */
+       unsigned long elct_tdr0;        /* TLB Data Register 0 */
+       unsigned long elct_tdr1;        /* TLB Data Register 1 */
+       unsigned long elct_tdr2;        /* TLB Data Register 2 */
+       unsigned long elct_tdr3;        /* TLB Data Register 3 */
+       unsigned long elct_tdr4;        /* TLB Data Register 4 */
+       unsigned long elct_tdr5;        /* TLB Data Register 5 */
+       unsigned long elct_tdr6;        /* TLB Data Register 6 */
+       unsigned long elct_tdr7;        /* TLB Data Register 7 */
+};
+
+/*
+ * Sable error log data structure - sable pfms section 3.40
+ */
+struct el_t2_data_corrected {
+       unsigned long elcpb_biu_stat;
+       unsigned long elcpb_biu_addr;
+       unsigned long elcpb_biu_ctl;
+       unsigned long elcpb_fill_syndrome;
+       unsigned long elcpb_fill_addr;
+       unsigned long elcpb_bc_tag;
+};
+
+/*
+ * Sable error log data structure
+ * Note there are 4 memory slots on sable (see t2.h)
+ */
+struct el_t2_frame_mcheck {
+       struct el_t2_frame_header elfmc_header; /* ID$P-FRAME_MCHECK */
+       struct el_t2_logout_header elfmc_hdr;
+       struct el_t2_procdata_mcheck elfmc_procdata;
+       struct el_t2_sysdata_mcheck elfmc_sysdata;
+       struct el_t2_data_t2 elfmc_t2data;
+       struct el_t2_data_memory elfmc_memdata[4];
+       struct el_t2_frame_header elfmc_footer; /* empty */
+};
+
+
+/*
+ * Sable error log data structures on memory errors
+ */
+struct el_t2_frame_corrected {
+       struct el_t2_frame_header elfcc_header; /* ID$P-BC-COR */
+       struct el_t2_logout_header elfcc_hdr;
+       struct el_t2_data_corrected elfcc_procdata;
+/*     struct el_t2_data_t2 elfcc_t2data;              */
+/*     struct el_t2_data_memory elfcc_memdata[4];      */
+       struct el_t2_frame_header elfcc_footer; /* empty */
+};
+
+
+#ifdef __KERNEL__
+
+#ifndef __EXTERN_INLINE
+#define __EXTERN_INLINE extern inline
+#define __IO_EXTERN_INLINE
+#endif
+
+/*
+ * I/O functions:
+ *
+ * T2 (the core logic PCI/memory support chipset for the SABLE
+ * series of processors uses a sparse address mapping scheme to
+ * get at PCI memory and I/O.
+ */
+
+#define vip    volatile int *
+#define vuip   volatile unsigned int *
+
+extern inline u8 t2_inb(unsigned long addr)
+{
+       long result = *(vip) ((addr << 5) + T2_IO + 0x00);
+       return __kernel_extbl(result, addr & 3);
+}
+
+extern inline void t2_outb(u8 b, unsigned long addr)
+{
+       unsigned long w;
+
+       w = __kernel_insbl(b, addr & 3);
+       *(vuip) ((addr << 5) + T2_IO + 0x00) = w;
+       mb();
+}
+
+extern inline u16 t2_inw(unsigned long addr)
+{
+       long result = *(vip) ((addr << 5) + T2_IO + 0x08);
+       return __kernel_extwl(result, addr & 3);
+}
+
+extern inline void t2_outw(u16 b, unsigned long addr)
+{
+       unsigned long w;
+
+       w = __kernel_inswl(b, addr & 3);
+       *(vuip) ((addr << 5) + T2_IO + 0x08) = w;
+       mb();
+}
+
+extern inline u32 t2_inl(unsigned long addr)
+{
+       return *(vuip) ((addr << 5) + T2_IO + 0x18);
+}
+
+extern inline void t2_outl(u32 b, unsigned long addr)
+{
+       *(vuip) ((addr << 5) + T2_IO + 0x18) = b;
+       mb();
+}
+
+
+/*
+ * Memory functions.
+ *
+ * For reading and writing 8 and 16 bit quantities we need to
+ * go through one of the three sparse address mapping regions
+ * and use the HAE_MEM CSR to provide some bits of the address.
+ * The following few routines use only sparse address region 1
+ * which gives 1Gbyte of accessible space which relates exactly
+ * to the amount of PCI memory mapping *into* system address space.
+ * See p 6-17 of the specification but it looks something like this:
+ *
+ * 21164 Address:
+ *
+ *          3         2         1
+ * 9876543210987654321098765432109876543210
+ * 1ZZZZ0.PCI.QW.Address............BBLL
+ *
+ * ZZ = SBZ
+ * BB = Byte offset
+ * LL = Transfer length
+ *
+ * PCI Address:
+ *
+ * 3         2         1
+ * 10987654321098765432109876543210
+ * HHH....PCI.QW.Address........ 00
+ *
+ * HHH = 31:29 HAE_MEM CSR
+ *
+ */
+
+#define t2_set_hae { \
+       msb = addr  >> 27; \
+       addr &= T2_MEM_R1_MASK; \
+       set_hae(msb); \
+}
+
+extern spinlock_t t2_hae_lock;
+
+/*
+ * NOTE: take T2_DENSE_MEM off in each readX/writeX routine, since
+ *       they may be called directly, rather than through the
+ *       ioreadNN/iowriteNN routines.
+ */
+
+__EXTERN_INLINE u8 t2_readb(const volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
+       unsigned long result, msb;
+       unsigned long flags;
+       spin_lock_irqsave(&t2_hae_lock, flags);
+
+       t2_set_hae;
+
+       result = *(vip) ((addr << 5) + T2_SPARSE_MEM + 0x00);
+       spin_unlock_irqrestore(&t2_hae_lock, flags);
+       return __kernel_extbl(result, addr & 3);
+}
+
+__EXTERN_INLINE u16 t2_readw(const volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
+       unsigned long result, msb;
+       unsigned long flags;
+       spin_lock_irqsave(&t2_hae_lock, flags);
+
+       t2_set_hae;
+
+       result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08);
+       spin_unlock_irqrestore(&t2_hae_lock, flags);
+       return __kernel_extwl(result, addr & 3);
+}
+
+/*
+ * On SABLE with T2, we must use SPARSE memory even for 32-bit access,
+ * because we cannot access all of DENSE without changing its HAE.
+ */
+__EXTERN_INLINE u32 t2_readl(const volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
+       unsigned long result, msb;
+       unsigned long flags;
+       spin_lock_irqsave(&t2_hae_lock, flags);
+
+       t2_set_hae;
+
+       result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18);
+       spin_unlock_irqrestore(&t2_hae_lock, flags);
+       return result & 0xffffffffUL;
+}
+
+__EXTERN_INLINE u64 t2_readq(const volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
+       unsigned long r0, r1, work, msb;
+       unsigned long flags;
+       spin_lock_irqsave(&t2_hae_lock, flags);
+
+       t2_set_hae;
+
+       work = (addr << 5) + T2_SPARSE_MEM + 0x18;
+       r0 = *(vuip)(work);
+       r1 = *(vuip)(work + (4 << 5));
+       spin_unlock_irqrestore(&t2_hae_lock, flags);
+       return r1 << 32 | r0;
+}
+
+__EXTERN_INLINE void t2_writeb(u8 b, volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
+       unsigned long msb, w;
+       unsigned long flags;
+       spin_lock_irqsave(&t2_hae_lock, flags);
+
+       t2_set_hae;
+
+       w = __kernel_insbl(b, addr & 3);
+       *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x00) = w;
+       spin_unlock_irqrestore(&t2_hae_lock, flags);
+}
+
+__EXTERN_INLINE void t2_writew(u16 b, volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
+       unsigned long msb, w;
+       unsigned long flags;
+       spin_lock_irqsave(&t2_hae_lock, flags);
+
+       t2_set_hae;
+
+       w = __kernel_inswl(b, addr & 3);
+       *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08) = w;
+       spin_unlock_irqrestore(&t2_hae_lock, flags);
+}
+
+/*
+ * On SABLE with T2, we must use SPARSE memory even for 32-bit access,
+ * because we cannot access all of DENSE without changing its HAE.
+ */
+__EXTERN_INLINE void t2_writel(u32 b, volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
+       unsigned long msb;
+       unsigned long flags;
+       spin_lock_irqsave(&t2_hae_lock, flags);
+
+       t2_set_hae;
+
+       *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18) = b;
+       spin_unlock_irqrestore(&t2_hae_lock, flags);
+}
+
+__EXTERN_INLINE void t2_writeq(u64 b, volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
+       unsigned long msb, work;
+       unsigned long flags;
+       spin_lock_irqsave(&t2_hae_lock, flags);
+
+       t2_set_hae;
+
+       work = (addr << 5) + T2_SPARSE_MEM + 0x18;
+       *(vuip)work = b;
+       *(vuip)(work + (4 << 5)) = b >> 32;
+       spin_unlock_irqrestore(&t2_hae_lock, flags);
+}
+
+__EXTERN_INLINE void __iomem *t2_ioportmap(unsigned long addr)
+{
+       return (void __iomem *)(addr + T2_IO);
+}
+
+__EXTERN_INLINE void __iomem *t2_ioremap(unsigned long addr, 
+                                        unsigned long size)
+{
+       return (void __iomem *)(addr + T2_DENSE_MEM);
+}
+
+__EXTERN_INLINE int t2_is_ioaddr(unsigned long addr)
+{
+       return (long)addr >= 0;
+}
+
+__EXTERN_INLINE int t2_is_mmio(const volatile void __iomem *addr)
+{
+       return (unsigned long)addr >= T2_DENSE_MEM;
+}
+
+/* New-style ioread interface.  The mmio routines are so ugly for T2 that
+   it doesn't make sense to merge the pio and mmio routines.  */
+
+#define IOPORT(OS, NS)                                                 \
+__EXTERN_INLINE unsigned int t2_ioread##NS(void __iomem *xaddr)                \
+{                                                                      \
+       if (t2_is_mmio(xaddr))                                          \
+               return t2_read##OS(xaddr);                              \
+       else                                                            \
+               return t2_in##OS((unsigned long)xaddr - T2_IO);         \
+}                                                                      \
+__EXTERN_INLINE void t2_iowrite##NS(u##NS b, void __iomem *xaddr)      \
+{                                                                      \
+       if (t2_is_mmio(xaddr))                                          \
+               t2_write##OS(b, xaddr);                                 \
+       else                                                            \
+               t2_out##OS(b, (unsigned long)xaddr - T2_IO);            \
+}
+
+IOPORT(b, 8)
+IOPORT(w, 16)
+IOPORT(l, 32)
+
+#undef IOPORT
+
+#undef vip
+#undef vuip
+
+#undef __IO_PREFIX
+#define __IO_PREFIX            t2
+#define t2_trivial_rw_bw       0
+#define t2_trivial_rw_lq       0
+#define t2_trivial_io_bw       0
+#define t2_trivial_io_lq       0
+#define t2_trivial_iounmap     1
+#include <asm/io_trivial.h>
+
+#ifdef __IO_EXTERN_INLINE
+#undef __EXTERN_INLINE
+#undef __IO_EXTERN_INLINE
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_T2__H__ */
diff --git a/arch/alpha/include/asm/core_titan.h b/arch/alpha/include/asm/core_titan.h
new file mode 100644 (file)
index 0000000..a17f6f3
--- /dev/null
@@ -0,0 +1,410 @@
+#ifndef __ALPHA_TITAN__H__
+#define __ALPHA_TITAN__H__
+
+#include <linux/types.h>
+#include <linux/pci.h>
+#include <asm/compiler.h>
+
+/*
+ * TITAN is the internal names for a core logic chipset which provides
+ * memory controller and PCI/AGP access for 21264 based systems.
+ *
+ * This file is based on:
+ *
+ * Titan Chipset Engineering Specification
+ * Revision 0.12
+ * 13 July 1999
+ *
+ */
+
+/* XXX: Do we need to conditionalize on this?  */
+#ifdef USE_48_BIT_KSEG
+#define TI_BIAS 0x80000000000UL
+#else
+#define TI_BIAS 0x10000000000UL
+#endif
+
+/*
+ * CChip, DChip, and PChip registers
+ */
+
+typedef struct {
+       volatile unsigned long csr __attribute__((aligned(64)));
+} titan_64;
+
+typedef struct {
+       titan_64        csc;
+       titan_64        mtr;
+       titan_64        misc;
+       titan_64        mpd;
+       titan_64        aar0;
+       titan_64        aar1;
+       titan_64        aar2;
+       titan_64        aar3;
+       titan_64        dim0;
+       titan_64        dim1;
+       titan_64        dir0;
+       titan_64        dir1;
+       titan_64        drir;
+       titan_64        prben;
+       titan_64        iic0;
+       titan_64        iic1;
+       titan_64        mpr0;
+       titan_64        mpr1;
+       titan_64        mpr2;
+       titan_64        mpr3;
+       titan_64        rsvd[2];
+       titan_64        ttr;
+       titan_64        tdr;
+       titan_64        dim2;
+       titan_64        dim3;
+       titan_64        dir2;
+       titan_64        dir3;
+       titan_64        iic2;
+       titan_64        iic3;
+       titan_64        pwr;
+       titan_64        reserved[17];
+       titan_64        cmonctla;
+       titan_64        cmonctlb;
+       titan_64        cmoncnt01;
+       titan_64        cmoncnt23;
+       titan_64        cpen;
+} titan_cchip;
+
+typedef struct {
+       titan_64        dsc;
+       titan_64        str;
+       titan_64        drev;
+       titan_64        dsc2;
+} titan_dchip;
+
+typedef struct {
+       titan_64        wsba[4];
+       titan_64        wsm[4];
+       titan_64        tba[4];
+       titan_64        pctl;
+       titan_64        plat;
+       titan_64        reserved0[2];
+       union {
+               struct {
+                       titan_64        serror;
+                       titan_64        serren;
+                       titan_64        serrset;
+                       titan_64        reserved0;
+                       titan_64        gperror;
+                       titan_64        gperren;
+                       titan_64        gperrset;
+                       titan_64        reserved1;
+                       titan_64        gtlbiv;
+                       titan_64        gtlbia;
+                       titan_64        reserved2[2];
+                       titan_64        sctl;
+                       titan_64        reserved3[3];
+               } g;
+               struct {
+                       titan_64        agperror;
+                       titan_64        agperren;
+                       titan_64        agperrset;
+                       titan_64        agplastwr;
+                       titan_64        aperror;
+                       titan_64        aperren;
+                       titan_64        aperrset;
+                       titan_64        reserved0;
+                       titan_64        atlbiv;
+                       titan_64        atlbia;
+                       titan_64        reserved1[6];
+               } a;
+       } port_specific;
+       titan_64        sprst;
+       titan_64        reserved1[31];
+} titan_pachip_port;
+
+typedef struct {
+       titan_pachip_port       g_port;
+       titan_pachip_port       a_port;
+} titan_pachip;
+
+#define TITAN_cchip    ((titan_cchip  *)(IDENT_ADDR+TI_BIAS+0x1A0000000UL))
+#define TITAN_dchip            ((titan_dchip  *)(IDENT_ADDR+TI_BIAS+0x1B0000800UL))
+#define TITAN_pachip0  ((titan_pachip *)(IDENT_ADDR+TI_BIAS+0x180000000UL))
+#define TITAN_pachip1  ((titan_pachip *)(IDENT_ADDR+TI_BIAS+0x380000000UL))
+extern unsigned TITAN_agp;
+extern int TITAN_bootcpu;
+
+/*
+ * TITAN PA-chip Window Space Base Address register.
+ * (WSBA[0-2])
+ */
+#define wsba_m_ena 0x1                
+#define wsba_m_sg 0x2
+#define wsba_m_addr 0xFFF00000  
+#define wmask_k_sz1gb 0x3FF00000                   
+union TPAchipWSBA {
+       struct  {
+               unsigned wsba_v_ena : 1;
+               unsigned wsba_v_sg : 1;
+               unsigned wsba_v_rsvd1 : 18;
+               unsigned wsba_v_addr : 12;
+               unsigned wsba_v_rsvd2 : 32;
+        } wsba_r_bits;
+       int wsba_q_whole [2];
+};
+
+/*
+ * TITAN PA-chip Control Register
+ * This definition covers both the G-Port GPCTL and the A-PORT APCTL.
+ * Bits <51:0> are the same in both cases. APCTL<63:52> are only 
+ * applicable to AGP.
+ */
+#define pctl_m_fbtb                    0x00000001
+#define pctl_m_thdis                   0x00000002
+#define pctl_m_chaindis                0x00000004
+#define pctl_m_tgtlat                  0x00000018
+#define pctl_m_hole                    0x00000020
+#define pctl_m_mwin                    0x00000040
+#define pctl_m_arbena                  0x00000080
+#define pctl_m_prigrp                  0x0000FF00
+#define pctl_m_ppri                    0x00010000
+#define pctl_m_pcispd66                0x00020000
+#define pctl_m_cngstlt                 0x003C0000
+#define pctl_m_ptpdesten               0x3FC00000
+#define pctl_m_dpcen                   0x40000000
+#define pctl_m_apcen           0x0000000080000000UL
+#define pctl_m_dcrtv           0x0000000300000000UL
+#define pctl_m_en_stepping     0x0000000400000000UL
+#define apctl_m_rsvd1          0x000FFFF800000000UL
+#define apctl_m_agp_rate       0x0030000000000000UL
+#define apctl_m_agp_sba_en     0x0040000000000000UL
+#define apctl_m_agp_en         0x0080000000000000UL
+#define apctl_m_rsvd2          0x0100000000000000UL
+#define apctl_m_agp_present    0x0200000000000000UL
+#define apctl_agp_hp_rd                0x1C00000000000000UL
+#define apctl_agp_lp_rd                0xE000000000000000UL
+#define gpctl_m_rsvd           0xFFFFFFF800000000UL
+union TPAchipPCTL {
+       struct {
+               unsigned pctl_v_fbtb : 1;               /* A/G [0]     */
+               unsigned pctl_v_thdis : 1;              /* A/G [1]     */
+               unsigned pctl_v_chaindis : 1;           /* A/G [2]     */
+               unsigned pctl_v_tgtlat : 2;             /* A/G [4:3]   */
+               unsigned pctl_v_hole : 1;               /* A/G [5]     */
+               unsigned pctl_v_mwin : 1;               /* A/G [6]     */
+               unsigned pctl_v_arbena : 1;             /* A/G [7]     */
+               unsigned pctl_v_prigrp : 8;             /* A/G [15:8]  */
+               unsigned pctl_v_ppri : 1;               /* A/G [16]    */
+               unsigned pctl_v_pcispd66 : 1;           /* A/G [17]    */
+               unsigned pctl_v_cngstlt : 4;            /* A/G [21:18] */
+               unsigned pctl_v_ptpdesten : 8;          /* A/G [29:22] */
+               unsigned pctl_v_dpcen : 1;              /* A/G [30]    */
+               unsigned pctl_v_apcen : 1;              /* A/G [31]    */
+               unsigned pctl_v_dcrtv : 2;              /* A/G [33:32] */
+               unsigned pctl_v_en_stepping :1;         /* A/G [34]    */
+               unsigned apctl_v_rsvd1 : 17;            /* A   [51:35] */
+               unsigned apctl_v_agp_rate : 2;          /* A   [53:52] */
+               unsigned apctl_v_agp_sba_en : 1;        /* A   [54]    */
+               unsigned apctl_v_agp_en : 1;            /* A   [55]    */
+               unsigned apctl_v_rsvd2 : 1;             /* A   [56]    */
+               unsigned apctl_v_agp_present : 1;       /* A   [57]    */
+               unsigned apctl_v_agp_hp_rd : 3;         /* A   [60:58] */
+               unsigned apctl_v_agp_lp_rd : 3;         /* A   [63:61] */
+       } pctl_r_bits;
+       unsigned int pctl_l_whole [2];
+       unsigned long pctl_q_whole;
+};
+
+/*
+ * SERROR / SERREN / SERRSET
+ */
+union TPAchipSERR {
+       struct {
+               unsigned serr_v_lost_uecc : 1;          /* [0]          */
+               unsigned serr_v_uecc : 1;               /* [1]          */
+               unsigned serr_v_cre : 1;                /* [2]          */
+               unsigned serr_v_nxio : 1;               /* [3]          */
+               unsigned serr_v_lost_cre : 1;           /* [4]          */
+               unsigned serr_v_rsvd0 : 10;             /* [14:5]       */
+               unsigned serr_v_addr : 32;              /* [46:15]      */
+               unsigned serr_v_rsvd1 : 5;              /* [51:47]      */
+               unsigned serr_v_source : 2;             /* [53:52]      */
+               unsigned serr_v_cmd : 2;                /* [55:54]      */
+               unsigned serr_v_syn : 8;                /* [63:56]      */
+       } serr_r_bits;
+       unsigned int serr_l_whole[2];
+       unsigned long serr_q_whole;
+};
+
+/*
+ * GPERROR / APERROR / GPERREN / APERREN / GPERRSET / APERRSET
+ */
+union TPAchipPERR {
+       struct {
+               unsigned long perr_v_lost : 1;          /* [0]          */
+               unsigned long perr_v_serr : 1;          /* [1]          */
+               unsigned long perr_v_perr : 1;          /* [2]          */
+               unsigned long perr_v_dcrto : 1;         /* [3]          */
+               unsigned long perr_v_sge : 1;           /* [4]          */
+               unsigned long perr_v_ape : 1;           /* [5]          */
+               unsigned long perr_v_ta : 1;            /* [6]          */
+               unsigned long perr_v_dpe : 1;           /* [7]          */
+               unsigned long perr_v_nds : 1;           /* [8]          */
+               unsigned long perr_v_iptpr : 1;         /* [9]          */
+               unsigned long perr_v_iptpw : 1;         /* [10]         */
+               unsigned long perr_v_rsvd0 : 3;         /* [13:11]      */
+               unsigned long perr_v_addr : 33;         /* [46:14]      */
+               unsigned long perr_v_dac : 1;           /* [47]         */
+               unsigned long perr_v_mwin : 1;          /* [48]         */
+               unsigned long perr_v_rsvd1 : 3;         /* [51:49]      */
+               unsigned long perr_v_cmd : 4;           /* [55:52]      */
+               unsigned long perr_v_rsvd2 : 8;         /* [63:56]      */
+       } perr_r_bits;
+       unsigned int perr_l_whole[2];
+       unsigned long perr_q_whole;
+};
+
+/*
+ * AGPERROR / AGPERREN / AGPERRSET
+ */
+union TPAchipAGPERR {
+       struct {
+               unsigned agperr_v_lost : 1;             /* [0]          */
+               unsigned agperr_v_lpqfull : 1;          /* [1]          */
+               unsigned apgerr_v_hpqfull : 1;          /* [2]          */
+               unsigned agperr_v_rescmd : 1;           /* [3]          */
+               unsigned agperr_v_ipte : 1;             /* [4]          */
+               unsigned agperr_v_ptp : 1;              /* [5]          */
+               unsigned agperr_v_nowindow : 1;         /* [6]          */
+               unsigned agperr_v_rsvd0 : 8;            /* [14:7]       */
+               unsigned agperr_v_addr : 32;            /* [46:15]      */
+               unsigned agperr_v_rsvd1 : 1;            /* [47]         */
+               unsigned agperr_v_dac : 1;              /* [48]         */
+               unsigned agperr_v_mwin : 1;             /* [49]         */
+               unsigned agperr_v_cmd : 3;              /* [52:50]      */
+               unsigned agperr_v_length : 6;           /* [58:53]      */
+               unsigned agperr_v_fence : 1;            /* [59]         */
+               unsigned agperr_v_rsvd2 : 4;            /* [63:60]      */
+       } agperr_r_bits;
+       unsigned int agperr_l_whole[2];
+       unsigned long agperr_q_whole;
+};
+/*
+ * Memory spaces:
+ * Hose numbers are assigned as follows:
+ *             0 - pachip 0 / G Port
+ *             1 - pachip 1 / G Port
+ *             2 - pachip 0 / A Port
+ *             3 - pachip 1 / A Port
+ */
+#define TITAN_HOSE_SHIFT       (33) 
+#define TITAN_HOSE(h)          (((unsigned long)(h)) << TITAN_HOSE_SHIFT)
+#define TITAN_BASE             (IDENT_ADDR + TI_BIAS)
+#define TITAN_MEM(h)           (TITAN_BASE+TITAN_HOSE(h)+0x000000000UL)
+#define _TITAN_IACK_SC(h)      (TITAN_BASE+TITAN_HOSE(h)+0x1F8000000UL)
+#define TITAN_IO(h)            (TITAN_BASE+TITAN_HOSE(h)+0x1FC000000UL)
+#define TITAN_CONF(h)          (TITAN_BASE+TITAN_HOSE(h)+0x1FE000000UL)
+
+#define TITAN_HOSE_MASK                TITAN_HOSE(3)
+#define TITAN_IACK_SC          _TITAN_IACK_SC(0) /* hack! */
+
+/* 
+ * The canonical non-remaped I/O and MEM addresses have these values
+ * subtracted out.  This is arranged so that folks manipulating ISA
+ * devices can use their familiar numbers and have them map to bus 0.
+ */
+
+#define TITAN_IO_BIAS          TITAN_IO(0)
+#define TITAN_MEM_BIAS         TITAN_MEM(0)
+
+/* The IO address space is larger than 0xffff */
+#define TITAN_IO_SPACE         (TITAN_CONF(0) - TITAN_IO(0))
+
+/* TIG Space */
+#define TITAN_TIG_SPACE                (TITAN_BASE + 0x100000000UL)
+
+/* Offset between ram physical addresses and pci64 DAC bus addresses.  */
+/* ??? Just a guess.  Ought to confirm it hasn't been moved.  */
+#define TITAN_DAC_OFFSET       (1UL << 40)
+
+/*
+ * Data structure for handling TITAN machine checks:
+ */
+#define SCB_Q_SYSERR   0x620
+#define SCB_Q_PROCERR  0x630
+#define SCB_Q_SYSMCHK  0x660
+#define SCB_Q_PROCMCHK 0x670
+#define SCB_Q_SYSEVENT 0x680   /* environmental / system management */
+struct el_TITAN_sysdata_mcheck {
+       u64 summary;    /* 0x00 */
+       u64 c_dirx;     /* 0x08 */
+       u64 c_misc;     /* 0x10 */
+       u64 p0_serror;  /* 0x18 */
+       u64 p0_gperror; /* 0x20 */
+       u64 p0_aperror; /* 0x28 */
+       u64 p0_agperror;/* 0x30 */
+       u64 p1_serror;  /* 0x38 */
+       u64 p1_gperror; /* 0x40 */
+       u64 p1_aperror; /* 0x48 */
+       u64 p1_agperror;/* 0x50 */
+};
+
+/*
+ * System area for a privateer 680 environmental/system management mcheck 
+ */
+struct el_PRIVATEER_envdata_mcheck {
+       u64 summary;    /* 0x00 */
+       u64 c_dirx;     /* 0x08 */
+       u64 smir;       /* 0x10 */
+       u64 cpuir;      /* 0x18 */
+       u64 psir;       /* 0x20 */
+       u64 fault;      /* 0x28 */
+       u64 sys_doors;  /* 0x30 */
+       u64 temp_warn;  /* 0x38 */
+       u64 fan_ctrl;   /* 0x40 */
+       u64 code;       /* 0x48 */
+       u64 reserved;   /* 0x50 */
+};
+
+#ifdef __KERNEL__
+
+#ifndef __EXTERN_INLINE
+#define __EXTERN_INLINE extern inline
+#define __IO_EXTERN_INLINE
+#endif
+
+/*
+ * I/O functions:
+ *
+ * TITAN, a 21??? PCI/memory support chipset for the EV6 (21264)
+ * can only use linear accesses to get at PCI/AGP memory and I/O spaces.
+ */
+
+/*
+ * Memory functions.  all accesses are done through linear space.
+ */
+extern void __iomem *titan_ioportmap(unsigned long addr);
+extern void __iomem *titan_ioremap(unsigned long addr, unsigned long size);
+extern void titan_iounmap(volatile void __iomem *addr);
+
+__EXTERN_INLINE int titan_is_ioaddr(unsigned long addr)
+{
+       return addr >= TITAN_BASE;
+}
+
+extern int titan_is_mmio(const volatile void __iomem *addr);
+
+#undef __IO_PREFIX
+#define __IO_PREFIX            titan
+#define titan_trivial_rw_bw    1
+#define titan_trivial_rw_lq    1
+#define titan_trivial_io_bw    1
+#define titan_trivial_io_lq    1
+#define titan_trivial_iounmap  0
+#include <asm/io_trivial.h>
+
+#ifdef __IO_EXTERN_INLINE
+#undef __EXTERN_INLINE
+#undef __IO_EXTERN_INLINE
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_TITAN__H__ */
diff --git a/arch/alpha/include/asm/core_tsunami.h b/arch/alpha/include/asm/core_tsunami.h
new file mode 100644 (file)
index 0000000..58d4fe4
--- /dev/null
@@ -0,0 +1,335 @@
+#ifndef __ALPHA_TSUNAMI__H__
+#define __ALPHA_TSUNAMI__H__
+
+#include <linux/types.h>
+#include <linux/pci.h>
+#include <asm/compiler.h>
+
+/*
+ * TSUNAMI/TYPHOON are the internal names for the core logic chipset which
+ * provides memory controller and PCI access for the 21264 based systems.
+ *
+ * This file is based on:
+ *
+ * Tsunami System Programmers Manual
+ * Preliminary, Chapters 2-5
+ *
+ */
+
+/* XXX: Do we need to conditionalize on this?  */
+#ifdef USE_48_BIT_KSEG
+#define TS_BIAS 0x80000000000UL
+#else
+#define TS_BIAS 0x10000000000UL
+#endif
+
+/*
+ * CChip, DChip, and PChip registers
+ */
+
+typedef struct {
+       volatile unsigned long csr __attribute__((aligned(64)));
+} tsunami_64;
+
+typedef struct {
+       tsunami_64      csc;
+       tsunami_64      mtr;
+       tsunami_64      misc;
+       tsunami_64      mpd;
+       tsunami_64      aar0;
+       tsunami_64      aar1;
+       tsunami_64      aar2;
+       tsunami_64      aar3;
+       tsunami_64      dim0;
+       tsunami_64      dim1;
+       tsunami_64      dir0;
+       tsunami_64      dir1;
+       tsunami_64      drir;
+       tsunami_64      prben;
+       tsunami_64      iic;    /* a.k.a. iic0 */
+       tsunami_64      wdr;    /* a.k.a. iic1 */
+       tsunami_64      mpr0;
+       tsunami_64      mpr1;
+       tsunami_64      mpr2;
+       tsunami_64      mpr3;
+       tsunami_64      mctl;
+       tsunami_64      __pad1;
+       tsunami_64      ttr;
+       tsunami_64      tdr;
+       tsunami_64      dim2;
+       tsunami_64      dim3;
+       tsunami_64      dir2;
+       tsunami_64      dir3;
+       tsunami_64      iic2;
+       tsunami_64      iic3;
+} tsunami_cchip;
+
+typedef struct {
+       tsunami_64      dsc;
+       tsunami_64      str;
+       tsunami_64      drev;
+} tsunami_dchip;
+
+typedef struct {
+       tsunami_64      wsba[4];
+       tsunami_64      wsm[4];
+       tsunami_64      tba[4];
+       tsunami_64      pctl;
+       tsunami_64      plat;
+       tsunami_64      reserved;
+       tsunami_64      perror;
+       tsunami_64      perrmask;
+       tsunami_64      perrset;
+       tsunami_64      tlbiv;
+       tsunami_64      tlbia;
+       tsunami_64      pmonctl;
+       tsunami_64      pmoncnt;
+} tsunami_pchip;
+
+#define TSUNAMI_cchip  ((tsunami_cchip *)(IDENT_ADDR+TS_BIAS+0x1A0000000UL))
+#define TSUNAMI_dchip  ((tsunami_dchip *)(IDENT_ADDR+TS_BIAS+0x1B0000800UL))
+#define TSUNAMI_pchip0 ((tsunami_pchip *)(IDENT_ADDR+TS_BIAS+0x180000000UL))
+#define TSUNAMI_pchip1 ((tsunami_pchip *)(IDENT_ADDR+TS_BIAS+0x380000000UL))
+extern int TSUNAMI_bootcpu;
+
+/*
+ * TSUNAMI Pchip Error register.
+ */
+
+#define perror_m_lost 0x1
+#define perror_m_serr 0x2
+#define perror_m_perr 0x4
+#define perror_m_dcrto 0x8
+#define perror_m_sge 0x10
+#define perror_m_ape 0x20
+#define perror_m_ta 0x40
+#define perror_m_rdpe 0x80
+#define perror_m_nds 0x100
+#define perror_m_rto 0x200
+#define perror_m_uecc 0x400
+#define perror_m_cre 0x800
+#define perror_m_addrl 0xFFFFFFFF0000UL
+#define perror_m_addrh 0x7000000000000UL
+#define perror_m_cmd 0xF0000000000000UL
+#define perror_m_syn 0xFF00000000000000UL
+union TPchipPERROR {   
+       struct  {
+               unsigned int perror_v_lost : 1;
+               unsigned perror_v_serr : 1;
+               unsigned perror_v_perr : 1;
+               unsigned perror_v_dcrto : 1;
+               unsigned perror_v_sge : 1;
+               unsigned perror_v_ape : 1;
+               unsigned perror_v_ta : 1;
+               unsigned perror_v_rdpe : 1;
+               unsigned perror_v_nds : 1;
+               unsigned perror_v_rto : 1;
+               unsigned perror_v_uecc : 1;
+               unsigned perror_v_cre : 1;                 
+               unsigned perror_v_rsvd1 : 4;
+               unsigned perror_v_addrl : 32;
+               unsigned perror_v_addrh : 3;
+               unsigned perror_v_rsvd2 : 1;
+               unsigned perror_v_cmd : 4;
+               unsigned perror_v_syn : 8;
+       } perror_r_bits;
+       int perror_q_whole [2];
+};                       
+
+/*
+ * TSUNAMI Pchip Window Space Base Address register.
+ */
+#define wsba_m_ena 0x1                
+#define wsba_m_sg 0x2
+#define wsba_m_ptp 0x4
+#define wsba_m_addr 0xFFF00000  
+#define wmask_k_sz1gb 0x3FF00000                   
+union TPchipWSBA {
+       struct  {
+               unsigned wsba_v_ena : 1;
+               unsigned wsba_v_sg : 1;
+               unsigned wsba_v_ptp : 1;
+               unsigned wsba_v_rsvd1 : 17;
+               unsigned wsba_v_addr : 12;
+               unsigned wsba_v_rsvd2 : 32;
+       } wsba_r_bits;
+       int wsba_q_whole [2];
+};
+
+/*
+ * TSUNAMI Pchip Control Register
+ */
+#define pctl_m_fdsc 0x1
+#define pctl_m_fbtb 0x2
+#define pctl_m_thdis 0x4
+#define pctl_m_chaindis 0x8
+#define pctl_m_tgtlat 0x10
+#define pctl_m_hole 0x20
+#define pctl_m_mwin 0x40
+#define pctl_m_arbena 0x80
+#define pctl_m_prigrp 0x7F00
+#define pctl_m_ppri 0x8000
+#define pctl_m_rsvd1 0x30000
+#define pctl_m_eccen 0x40000
+#define pctl_m_padm 0x80000
+#define pctl_m_cdqmax 0xF00000
+#define pctl_m_rev 0xFF000000
+#define pctl_m_crqmax 0xF00000000UL
+#define pctl_m_ptpmax 0xF000000000UL
+#define pctl_m_pclkx 0x30000000000UL
+#define pctl_m_fdsdis 0x40000000000UL
+#define pctl_m_fdwdis 0x80000000000UL
+#define pctl_m_ptevrfy 0x100000000000UL
+#define pctl_m_rpp 0x200000000000UL
+#define pctl_m_pid 0xC00000000000UL
+#define pctl_m_rsvd2 0xFFFF000000000000UL
+
+union TPchipPCTL {
+       struct {
+               unsigned pctl_v_fdsc : 1;
+               unsigned pctl_v_fbtb : 1;
+               unsigned pctl_v_thdis : 1;
+               unsigned pctl_v_chaindis : 1;
+               unsigned pctl_v_tgtlat : 1;
+               unsigned pctl_v_hole : 1;
+               unsigned pctl_v_mwin : 1;
+               unsigned pctl_v_arbena : 1;
+               unsigned pctl_v_prigrp : 7;
+               unsigned pctl_v_ppri : 1;
+               unsigned pctl_v_rsvd1 : 2;
+               unsigned pctl_v_eccen : 1;
+               unsigned pctl_v_padm : 1;
+               unsigned pctl_v_cdqmax : 4;
+               unsigned pctl_v_rev : 8;
+               unsigned pctl_v_crqmax : 4;
+               unsigned pctl_v_ptpmax : 4;
+               unsigned pctl_v_pclkx : 2;
+               unsigned pctl_v_fdsdis : 1;
+               unsigned pctl_v_fdwdis : 1;
+               unsigned pctl_v_ptevrfy : 1;
+               unsigned pctl_v_rpp : 1;
+               unsigned pctl_v_pid : 2;
+               unsigned pctl_v_rsvd2 : 16;
+       } pctl_r_bits;
+       int pctl_q_whole [2];
+};
+
+/*
+ * TSUNAMI Pchip Error Mask Register.
+ */
+#define perrmask_m_lost 0x1
+#define perrmask_m_serr 0x2
+#define perrmask_m_perr 0x4
+#define perrmask_m_dcrto 0x8
+#define perrmask_m_sge 0x10
+#define perrmask_m_ape 0x20
+#define perrmask_m_ta 0x40
+#define perrmask_m_rdpe 0x80
+#define perrmask_m_nds 0x100
+#define perrmask_m_rto 0x200
+#define perrmask_m_uecc 0x400
+#define perrmask_m_cre 0x800
+#define perrmask_m_rsvd 0xFFFFFFFFFFFFF000UL
+union TPchipPERRMASK {   
+       struct  {
+               unsigned int perrmask_v_lost : 1;
+               unsigned perrmask_v_serr : 1;
+               unsigned perrmask_v_perr : 1;
+               unsigned perrmask_v_dcrto : 1;
+               unsigned perrmask_v_sge : 1;
+               unsigned perrmask_v_ape : 1;
+               unsigned perrmask_v_ta : 1;
+               unsigned perrmask_v_rdpe : 1;
+               unsigned perrmask_v_nds : 1;
+               unsigned perrmask_v_rto : 1;
+               unsigned perrmask_v_uecc : 1;
+               unsigned perrmask_v_cre : 1;                 
+               unsigned perrmask_v_rsvd1 : 20;
+               unsigned perrmask_v_rsvd2 : 32;
+       } perrmask_r_bits;
+       int perrmask_q_whole [2];
+};                       
+
+/*
+ * Memory spaces:
+ */
+#define TSUNAMI_HOSE(h)                (((unsigned long)(h)) << 33)
+#define TSUNAMI_BASE           (IDENT_ADDR + TS_BIAS)
+
+#define TSUNAMI_MEM(h)         (TSUNAMI_BASE+TSUNAMI_HOSE(h) + 0x000000000UL)
+#define _TSUNAMI_IACK_SC(h)    (TSUNAMI_BASE+TSUNAMI_HOSE(h) + 0x1F8000000UL)
+#define TSUNAMI_IO(h)          (TSUNAMI_BASE+TSUNAMI_HOSE(h) + 0x1FC000000UL)
+#define TSUNAMI_CONF(h)                (TSUNAMI_BASE+TSUNAMI_HOSE(h) + 0x1FE000000UL)
+
+#define TSUNAMI_IACK_SC                _TSUNAMI_IACK_SC(0) /* hack! */
+
+
+/* 
+ * The canonical non-remaped I/O and MEM addresses have these values
+ * subtracted out.  This is arranged so that folks manipulating ISA
+ * devices can use their familiar numbers and have them map to bus 0.
+ */
+
+#define TSUNAMI_IO_BIAS          TSUNAMI_IO(0)
+#define TSUNAMI_MEM_BIAS         TSUNAMI_MEM(0)
+
+/* The IO address space is larger than 0xffff */
+#define TSUNAMI_IO_SPACE       (TSUNAMI_CONF(0) - TSUNAMI_IO(0))
+
+/* Offset between ram physical addresses and pci64 DAC bus addresses.  */
+#define TSUNAMI_DAC_OFFSET     (1UL << 40)
+
+/*
+ * Data structure for handling TSUNAMI machine checks:
+ */
+struct el_TSUNAMI_sysdata_mcheck {
+};
+
+
+#ifdef __KERNEL__
+
+#ifndef __EXTERN_INLINE
+#define __EXTERN_INLINE extern inline
+#define __IO_EXTERN_INLINE
+#endif
+
+/*
+ * I/O functions:
+ *
+ * TSUNAMI, the 21??? PCI/memory support chipset for the EV6 (21264)
+ * can only use linear accesses to get at PCI memory and I/O spaces.
+ */
+
+/*
+ * Memory functions.  all accesses are done through linear space.
+ */
+extern void __iomem *tsunami_ioportmap(unsigned long addr);
+extern void __iomem *tsunami_ioremap(unsigned long addr, unsigned long size);
+__EXTERN_INLINE int tsunami_is_ioaddr(unsigned long addr)
+{
+       return addr >= TSUNAMI_BASE;
+}
+
+__EXTERN_INLINE int tsunami_is_mmio(const volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       return (addr & 0x100000000UL) == 0;
+}
+
+#undef __IO_PREFIX
+#define __IO_PREFIX            tsunami
+#define tsunami_trivial_rw_bw  1
+#define tsunami_trivial_rw_lq  1
+#define tsunami_trivial_io_bw  1
+#define tsunami_trivial_io_lq  1
+#define tsunami_trivial_iounmap        1
+#include <asm/io_trivial.h>
+
+#ifdef __IO_EXTERN_INLINE
+#undef __EXTERN_INLINE
+#undef __IO_EXTERN_INLINE
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_TSUNAMI__H__ */
diff --git a/arch/alpha/include/asm/core_wildfire.h b/arch/alpha/include/asm/core_wildfire.h
new file mode 100644 (file)
index 0000000..cd562f5
--- /dev/null
@@ -0,0 +1,318 @@
+#ifndef __ALPHA_WILDFIRE__H__
+#define __ALPHA_WILDFIRE__H__
+
+#include <linux/types.h>
+#include <asm/compiler.h>
+
+#define WILDFIRE_MAX_QBB       8       /* more than 8 requires other mods */
+#define WILDFIRE_PCA_PER_QBB   4
+#define WILDFIRE_IRQ_PER_PCA   64
+
+#define WILDFIRE_NR_IRQS \
+  (WILDFIRE_MAX_QBB * WILDFIRE_PCA_PER_QBB * WILDFIRE_IRQ_PER_PCA)
+
+extern unsigned char wildfire_hard_qbb_map[WILDFIRE_MAX_QBB];
+extern unsigned char wildfire_soft_qbb_map[WILDFIRE_MAX_QBB];
+#define QBB_MAP_EMPTY  0xff
+
+extern unsigned long wildfire_hard_qbb_mask;
+extern unsigned long wildfire_soft_qbb_mask;
+extern unsigned long wildfire_gp_mask;
+extern unsigned long wildfire_hs_mask;
+extern unsigned long wildfire_iop_mask;
+extern unsigned long wildfire_ior_mask;
+extern unsigned long wildfire_pca_mask;
+extern unsigned long wildfire_cpu_mask;
+extern unsigned long wildfire_mem_mask;
+
+#define WILDFIRE_QBB_EXISTS(qbbno) (wildfire_soft_qbb_mask & (1 << (qbbno)))
+
+#define WILDFIRE_MEM_EXISTS(qbbno) (wildfire_mem_mask & (0xf << ((qbbno) << 2)))
+
+#define WILDFIRE_PCA_EXISTS(qbbno, pcano) \
+               (wildfire_pca_mask & (1 << (((qbbno) << 2) + (pcano))))
+
+typedef struct {
+       volatile unsigned long csr __attribute__((aligned(64)));
+} wildfire_64;
+
+typedef struct {
+       volatile unsigned long csr __attribute__((aligned(256)));
+} wildfire_256;
+
+typedef struct {
+       volatile unsigned long csr __attribute__((aligned(2048)));
+} wildfire_2k;
+
+typedef struct {
+       wildfire_64     qsd_whami;
+       wildfire_64     qsd_rev;
+       wildfire_64     qsd_port_present;
+       wildfire_64     qsd_port_active;
+       wildfire_64     qsd_fault_ena;
+       wildfire_64     qsd_cpu_int_ena;
+       wildfire_64     qsd_mem_config;
+       wildfire_64     qsd_err_sum;
+       wildfire_64     ce_sum[4];
+       wildfire_64     dev_init[4];
+       wildfire_64     it_int[4];
+       wildfire_64     ip_int[4];
+       wildfire_64     uce_sum[4];
+       wildfire_64     se_sum__non_dev_int[4];
+       wildfire_64     scratch[4];
+       wildfire_64     qsd_timer;
+       wildfire_64     qsd_diag;
+} wildfire_qsd;
+
+typedef struct {
+       wildfire_256    qsd_whami;
+       wildfire_256    __pad1;
+       wildfire_256    ce_sum;
+       wildfire_256    dev_init;
+       wildfire_256    it_int;
+       wildfire_256    ip_int;
+       wildfire_256    uce_sum;
+       wildfire_256    se_sum;
+} wildfire_fast_qsd;
+
+typedef struct {
+       wildfire_2k     qsa_qbb_id;
+       wildfire_2k     __pad1;
+       wildfire_2k     qsa_port_ena;
+       wildfire_2k     qsa_scratch;
+       wildfire_2k     qsa_config[5];
+       wildfire_2k     qsa_ref_int;
+       wildfire_2k     qsa_qbb_pop[2];
+       wildfire_2k     qsa_dtag_fc;
+       wildfire_2k     __pad2[3];
+       wildfire_2k     qsa_diag;
+       wildfire_2k     qsa_diag_lock[4];
+       wildfire_2k     __pad3[11];
+       wildfire_2k     qsa_cpu_err_sum;
+       wildfire_2k     qsa_misc_err_sum;
+       wildfire_2k     qsa_tmo_err_sum;
+       wildfire_2k     qsa_err_ena;
+       wildfire_2k     qsa_tmo_config;
+       wildfire_2k     qsa_ill_cmd_err_sum;
+       wildfire_2k     __pad4[26];
+       wildfire_2k     qsa_busy_mask;
+       wildfire_2k     qsa_arr_valid;
+       wildfire_2k     __pad5[2];
+       wildfire_2k     qsa_port_map[4];
+       wildfire_2k     qsa_arr_addr[8];
+       wildfire_2k     qsa_arr_mask[8];
+} wildfire_qsa;
+
+typedef struct {
+       wildfire_64     ioa_config;
+       wildfire_64     iod_config;
+       wildfire_64     iop_switch_credits;
+       wildfire_64     __pad1;
+       wildfire_64     iop_hose_credits;
+       wildfire_64     __pad2[11];
+       struct {
+               wildfire_64     __pad3;
+               wildfire_64     init;
+       } iop_hose[4];
+       wildfire_64     ioa_hose_0_ctrl;
+       wildfire_64     iod_hose_0_ctrl;
+       wildfire_64     ioa_hose_1_ctrl;
+       wildfire_64     iod_hose_1_ctrl;
+       wildfire_64     ioa_hose_2_ctrl;
+       wildfire_64     iod_hose_2_ctrl;
+       wildfire_64     ioa_hose_3_ctrl;
+       wildfire_64     iod_hose_3_ctrl;
+       struct {
+               wildfire_64     target;
+               wildfire_64     __pad4;
+       } iop_dev_int[4];
+
+       wildfire_64     iop_err_int_target;
+       wildfire_64     __pad5[7];
+       wildfire_64     iop_qbb_err_sum;
+       wildfire_64     __pad6;
+       wildfire_64     iop_qbb_se_sum;
+       wildfire_64     __pad7;
+       wildfire_64     ioa_err_sum;
+       wildfire_64     iod_err_sum;
+       wildfire_64     __pad8[4];
+       wildfire_64     ioa_diag_force_err;
+       wildfire_64     iod_diag_force_err;
+       wildfire_64     __pad9[4];
+       wildfire_64     iop_diag_send_err_int;
+       wildfire_64     __pad10[15];
+       wildfire_64     ioa_scratch;
+       wildfire_64     iod_scratch;
+} wildfire_iop;
+
+typedef struct {
+       wildfire_2k     gpa_qbb_map[4];
+       wildfire_2k     gpa_mem_pop_map;
+       wildfire_2k     gpa_scratch;
+       wildfire_2k     gpa_diag;
+       wildfire_2k     gpa_config_0;
+       wildfire_2k     __pad1;
+       wildfire_2k     gpa_init_id;
+       wildfire_2k     gpa_config_2;
+       /* not complete */
+} wildfire_gp;
+
+typedef struct {
+       wildfire_64     pca_what_am_i;
+       wildfire_64     pca_err_sum;
+       wildfire_64     pca_diag_force_err;
+       wildfire_64     pca_diag_send_err_int;
+       wildfire_64     pca_hose_credits;
+       wildfire_64     pca_scratch;
+       wildfire_64     pca_micro_addr;
+       wildfire_64     pca_micro_data;
+       wildfire_64     pca_pend_int;
+       wildfire_64     pca_sent_int;
+       wildfire_64     __pad1;
+       wildfire_64     pca_stdio_edge_level;
+       wildfire_64     __pad2[52];
+       struct {
+               wildfire_64     target;
+               wildfire_64     enable;
+       } pca_int[4];
+       wildfire_64     __pad3[56];
+       wildfire_64     pca_alt_sent_int[32];
+} wildfire_pca;
+
+typedef struct {
+       wildfire_64     ne_what_am_i;
+       /* not complete */
+} wildfire_ne;
+
+typedef struct {
+       wildfire_64     fe_what_am_i;
+       /* not complete */
+} wildfire_fe;
+
+typedef struct {
+       wildfire_64     pci_io_addr_ext;
+       wildfire_64     pci_ctrl;
+       wildfire_64     pci_err_sum;
+       wildfire_64     pci_err_addr;
+       wildfire_64     pci_stall_cnt;
+       wildfire_64     pci_iack_special;
+       wildfire_64     __pad1[2];
+       wildfire_64     pci_pend_int;
+       wildfire_64     pci_sent_int;
+       wildfire_64     __pad2[54];
+       struct {
+               wildfire_64     wbase;
+               wildfire_64     wmask;
+               wildfire_64     tbase;
+       } pci_window[4];
+       wildfire_64     pci_flush_tlb;
+       wildfire_64     pci_perf_mon;
+} wildfire_pci;
+
+#define WILDFIRE_ENTITY_SHIFT          18
+
+#define WILDFIRE_GP_ENTITY             (0x10UL << WILDFIRE_ENTITY_SHIFT)
+#define WILDFIRE_IOP_ENTITY            (0x08UL << WILDFIRE_ENTITY_SHIFT)
+#define WILDFIRE_QSA_ENTITY            (0x04UL << WILDFIRE_ENTITY_SHIFT)
+#define WILDFIRE_QSD_ENTITY_SLOW       (0x05UL << WILDFIRE_ENTITY_SHIFT)
+#define WILDFIRE_QSD_ENTITY_FAST       (0x01UL << WILDFIRE_ENTITY_SHIFT)
+
+#define WILDFIRE_PCA_ENTITY(pca)       ((0xc|(pca))<<WILDFIRE_ENTITY_SHIFT)
+
+#define WILDFIRE_BASE          (IDENT_ADDR | (1UL << 40))
+
+#define WILDFIRE_QBB_MASK      0x0fUL  /* for now, only 4 bits/16 QBBs */
+
+#define WILDFIRE_QBB(q)                ((~((long)(q)) & WILDFIRE_QBB_MASK) << 36)
+#define WILDFIRE_HOSE(h)       ((long)(h) << 33)
+
+#define WILDFIRE_QBB_IO(q)     (WILDFIRE_BASE | WILDFIRE_QBB(q))
+#define WILDFIRE_QBB_HOSE(q,h) (WILDFIRE_QBB_IO(q) | WILDFIRE_HOSE(h))
+
+#define WILDFIRE_MEM(q,h)      (WILDFIRE_QBB_HOSE(q,h) | 0x000000000UL)
+#define WILDFIRE_CONF(q,h)     (WILDFIRE_QBB_HOSE(q,h) | 0x1FE000000UL)
+#define WILDFIRE_IO(q,h)       (WILDFIRE_QBB_HOSE(q,h) | 0x1FF000000UL)
+
+#define WILDFIRE_qsd(q) \
+ ((wildfire_qsd *)(WILDFIRE_QBB_IO(q)|WILDFIRE_QSD_ENTITY_SLOW|(((1UL<<13)-1)<<23)))
+
+#define WILDFIRE_fast_qsd() \
+ ((wildfire_fast_qsd *)(WILDFIRE_QBB_IO(0)|WILDFIRE_QSD_ENTITY_FAST|(((1UL<<13)-1)<<23)))
+
+#define WILDFIRE_qsa(q) \
+ ((wildfire_qsa *)(WILDFIRE_QBB_IO(q)|WILDFIRE_QSA_ENTITY|(((1UL<<13)-1)<<23)))
+
+#define WILDFIRE_iop(q) \
+ ((wildfire_iop *)(WILDFIRE_QBB_IO(q)|WILDFIRE_IOP_ENTITY|(((1UL<<13)-1)<<23)))
+
+#define WILDFIRE_gp(q) \
+ ((wildfire_gp *)(WILDFIRE_QBB_IO(q)|WILDFIRE_GP_ENTITY|(((1UL<<13)-1)<<23)))
+
+#define WILDFIRE_pca(q,pca) \
+ ((wildfire_pca *)(WILDFIRE_QBB_IO(q)|WILDFIRE_PCA_ENTITY(pca)|(((1UL<<13)-1)<<23)))
+
+#define WILDFIRE_ne(q,pca) \
+ ((wildfire_ne *)(WILDFIRE_QBB_IO(q)|WILDFIRE_PCA_ENTITY(pca)|(((1UL<<13)-1)<<23)|(1UL<<16)))
+
+#define WILDFIRE_fe(q,pca) \
+ ((wildfire_fe *)(WILDFIRE_QBB_IO(q)|WILDFIRE_PCA_ENTITY(pca)|(((1UL<<13)-1)<<23)|(3UL<<15)))
+
+#define WILDFIRE_pci(q,h) \
+ ((wildfire_pci *)(WILDFIRE_QBB_IO(q)|WILDFIRE_PCA_ENTITY(((h)&6)>>1)|((((h)&1)|2)<<16)|(((1UL<<13)-1)<<23)))
+
+#define WILDFIRE_IO_BIAS        WILDFIRE_IO(0,0)
+#define WILDFIRE_MEM_BIAS       WILDFIRE_MEM(0,0) /* ??? */
+
+/* The IO address space is larger than 0xffff */
+#define WILDFIRE_IO_SPACE      (8UL*1024*1024)
+
+#ifdef __KERNEL__
+
+#ifndef __EXTERN_INLINE
+#define __EXTERN_INLINE extern inline
+#define __IO_EXTERN_INLINE
+#endif
+
+/*
+ * Memory functions.  all accesses are done through linear space.
+ */
+
+__EXTERN_INLINE void __iomem *wildfire_ioportmap(unsigned long addr)
+{
+       return (void __iomem *)(addr + WILDFIRE_IO_BIAS);
+}
+
+__EXTERN_INLINE void __iomem *wildfire_ioremap(unsigned long addr, 
+                                              unsigned long size)
+{
+       return (void __iomem *)(addr + WILDFIRE_MEM_BIAS);
+}
+
+__EXTERN_INLINE int wildfire_is_ioaddr(unsigned long addr)
+{
+       return addr >= WILDFIRE_BASE;
+}
+
+__EXTERN_INLINE int wildfire_is_mmio(const volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long)xaddr;
+       return (addr & 0x100000000UL) == 0;
+}
+
+#undef __IO_PREFIX
+#define __IO_PREFIX                    wildfire
+#define wildfire_trivial_rw_bw         1
+#define wildfire_trivial_rw_lq         1
+#define wildfire_trivial_io_bw         1
+#define wildfire_trivial_io_lq         1
+#define wildfire_trivial_iounmap       1
+#include <asm/io_trivial.h>
+
+#ifdef __IO_EXTERN_INLINE
+#undef __EXTERN_INLINE
+#undef __IO_EXTERN_INLINE
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_WILDFIRE__H__ */
diff --git a/arch/alpha/include/asm/cputime.h b/arch/alpha/include/asm/cputime.h
new file mode 100644 (file)
index 0000000..19577fd
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_CPUTIME_H
+#define __ALPHA_CPUTIME_H
+
+#include <asm-generic/cputime.h>
+
+#endif /* __ALPHA_CPUTIME_H */
diff --git a/arch/alpha/include/asm/current.h b/arch/alpha/include/asm/current.h
new file mode 100644 (file)
index 0000000..094d285
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef _ALPHA_CURRENT_H
+#define _ALPHA_CURRENT_H
+
+#include <linux/thread_info.h>
+
+#define get_current()  (current_thread_info()->task)
+#define current                get_current()
+
+#endif /* _ALPHA_CURRENT_H */
diff --git a/arch/alpha/include/asm/delay.h b/arch/alpha/include/asm/delay.h
new file mode 100644 (file)
index 0000000..2aa3f41
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef __ALPHA_DELAY_H
+#define __ALPHA_DELAY_H
+
+extern void __delay(int loops);
+extern void udelay(unsigned long usecs);
+
+extern void ndelay(unsigned long nsecs);
+#define ndelay ndelay
+
+#endif /* defined(__ALPHA_DELAY_H) */
diff --git a/arch/alpha/include/asm/device.h b/arch/alpha/include/asm/device.h
new file mode 100644 (file)
index 0000000..d8f9872
--- /dev/null
@@ -0,0 +1,7 @@
+/*
+ * Arch specific extensions to struct device
+ *
+ * This file is released under the GPLv2
+ */
+#include <asm-generic/device.h>
+
diff --git a/arch/alpha/include/asm/div64.h b/arch/alpha/include/asm/div64.h
new file mode 100644 (file)
index 0000000..6cd978c
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/div64.h>
diff --git a/arch/alpha/include/asm/dma-mapping.h b/arch/alpha/include/asm/dma-mapping.h
new file mode 100644 (file)
index 0000000..a5801ae
--- /dev/null
@@ -0,0 +1,69 @@
+#ifndef _ALPHA_DMA_MAPPING_H
+#define _ALPHA_DMA_MAPPING_H
+
+
+#ifdef CONFIG_PCI
+
+#include <linux/pci.h>
+
+#define dma_map_single(dev, va, size, dir)             \
+               pci_map_single(alpha_gendev_to_pci(dev), va, size, dir)
+#define dma_unmap_single(dev, addr, size, dir)         \
+               pci_unmap_single(alpha_gendev_to_pci(dev), addr, size, dir)
+#define dma_alloc_coherent(dev, size, addr, gfp)       \
+             __pci_alloc_consistent(alpha_gendev_to_pci(dev), size, addr, gfp)
+#define dma_free_coherent(dev, size, va, addr)         \
+               pci_free_consistent(alpha_gendev_to_pci(dev), size, va, addr)
+#define dma_map_page(dev, page, off, size, dir)                \
+               pci_map_page(alpha_gendev_to_pci(dev), page, off, size, dir)
+#define dma_unmap_page(dev, addr, size, dir)           \
+               pci_unmap_page(alpha_gendev_to_pci(dev), addr, size, dir)
+#define dma_map_sg(dev, sg, nents, dir)                        \
+               pci_map_sg(alpha_gendev_to_pci(dev), sg, nents, dir)
+#define dma_unmap_sg(dev, sg, nents, dir)              \
+               pci_unmap_sg(alpha_gendev_to_pci(dev), sg, nents, dir)
+#define dma_supported(dev, mask)                       \
+               pci_dma_supported(alpha_gendev_to_pci(dev), mask)
+#define dma_mapping_error(dev, addr)                           \
+               pci_dma_mapping_error(alpha_gendev_to_pci(dev), addr)
+
+#else  /* no PCI - no IOMMU. */
+
+struct scatterlist;
+void *dma_alloc_coherent(struct device *dev, size_t size,
+                        dma_addr_t *dma_handle, gfp_t gfp);
+int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
+              enum dma_data_direction direction);
+
+#define dma_free_coherent(dev, size, va, addr)         \
+               free_pages((unsigned long)va, get_order(size))
+#define dma_supported(dev, mask)               (mask < 0x00ffffffUL ? 0 : 1)
+#define dma_map_single(dev, va, size, dir)     virt_to_phys(va)
+#define dma_map_page(dev, page, off, size, dir)        (page_to_pa(page) + off)
+
+#define dma_unmap_single(dev, addr, size, dir) ((void)0)
+#define dma_unmap_page(dev, addr, size, dir)   ((void)0)
+#define dma_unmap_sg(dev, sg, nents, dir)      ((void)0)
+
+#define dma_mapping_error(dev, addr)  (0)
+
+#endif /* !CONFIG_PCI */
+
+#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)
+
+int dma_set_mask(struct device *dev, u64 mask);
+
+#define dma_sync_single_for_cpu(dev, addr, size, dir)    ((void)0)
+#define dma_sync_single_for_device(dev, addr, size, dir)  ((void)0)
+#define dma_sync_single_range(dev, addr, off, size, dir)  ((void)0)
+#define dma_sync_sg_for_cpu(dev, sg, nents, dir)         ((void)0)
+#define dma_sync_sg_for_device(dev, sg, nents, dir)      ((void)0)
+#define dma_cache_sync(dev, va, size, dir)               ((void)0)
+#define dma_sync_single_range_for_cpu(dev, addr, offset, size, dir)    ((void)0)
+#define dma_sync_single_range_for_device(dev, addr, offset, size, dir) ((void)0)
+
+#define dma_get_cache_alignment()                        L1_CACHE_BYTES
+
+#endif /* _ALPHA_DMA_MAPPING_H */
diff --git a/arch/alpha/include/asm/dma.h b/arch/alpha/include/asm/dma.h
new file mode 100644 (file)
index 0000000..87cfdbd
--- /dev/null
@@ -0,0 +1,376 @@
+/*
+ * include/asm-alpha/dma.h
+ *
+ * This is essentially the same as the i386 DMA stuff, as the AlphaPCs
+ * use ISA-compatible dma.  The only extension is support for high-page
+ * registers that allow to set the top 8 bits of a 32-bit DMA address.
+ * This register should be written last when setting up a DMA address
+ * as this will also enable DMA across 64 KB boundaries.
+ */
+
+/* $Id: dma.h,v 1.7 1992/12/14 00:29:34 root Exp root $
+ * linux/include/asm/dma.h: Defines for using and allocating dma channels.
+ * Written by Hennus Bergman, 1992.
+ * High DMA channel support & info by Hannu Savolainen
+ * and John Boyd, Nov. 1992.
+ */
+
+#ifndef _ASM_DMA_H
+#define _ASM_DMA_H
+
+#include <linux/spinlock.h>
+#include <asm/io.h>
+
+#define dma_outb       outb
+#define dma_inb                inb
+
+/*
+ * NOTES about DMA transfers:
+ *
+ *  controller 1: channels 0-3, byte operations, ports 00-1F
+ *  controller 2: channels 4-7, word operations, ports C0-DF
+ *
+ *  - ALL registers are 8 bits only, regardless of transfer size
+ *  - channel 4 is not used - cascades 1 into 2.
+ *  - channels 0-3 are byte - addresses/counts are for physical bytes
+ *  - channels 5-7 are word - addresses/counts are for physical words
+ *  - transfers must not cross physical 64K (0-3) or 128K (5-7) boundaries
+ *  - transfer count loaded to registers is 1 less than actual count
+ *  - controller 2 offsets are all even (2x offsets for controller 1)
+ *  - page registers for 5-7 don't use data bit 0, represent 128K pages
+ *  - page registers for 0-3 use bit 0, represent 64K pages
+ *
+ * DMA transfers are limited to the lower 16MB of _physical_ memory.  
+ * Note that addresses loaded into registers must be _physical_ addresses,
+ * not logical addresses (which may differ if paging is active).
+ *
+ *  Address mapping for channels 0-3:
+ *
+ *   A23 ... A16 A15 ... A8  A7 ... A0    (Physical addresses)
+ *    |  ...  |   |  ... |   |  ... |
+ *    |  ...  |   |  ... |   |  ... |
+ *    |  ...  |   |  ... |   |  ... |
+ *   P7  ...  P0  A7 ... A0  A7 ... A0   
+ * |    Page    | Addr MSB | Addr LSB |   (DMA registers)
+ *
+ *  Address mapping for channels 5-7:
+ *
+ *   A23 ... A17 A16 A15 ... A9 A8 A7 ... A1 A0    (Physical addresses)
+ *    |  ...  |   \   \   ... \  \  \  ... \  \
+ *    |  ...  |    \   \   ... \  \  \  ... \  (not used)
+ *    |  ...  |     \   \   ... \  \  \  ... \
+ *   P7  ...  P1 (0) A7 A6  ... A0 A7 A6 ... A0   
+ * |      Page      |  Addr MSB   |  Addr LSB  |   (DMA registers)
+ *
+ * Again, channels 5-7 transfer _physical_ words (16 bits), so addresses
+ * and counts _must_ be word-aligned (the lowest address bit is _ignored_ at
+ * the hardware level, so odd-byte transfers aren't possible).
+ *
+ * Transfer count (_not # bytes_) is limited to 64K, represented as actual
+ * count - 1 : 64K => 0xFFFF, 1 => 0x0000.  Thus, count is always 1 or more,
+ * and up to 128K bytes may be transferred on channels 5-7 in one operation. 
+ *
+ */
+
+#define MAX_DMA_CHANNELS       8
+
+/*
+  ISA DMA limitations on Alpha platforms,
+
+  These may be due to SIO (PCI<->ISA bridge) chipset limitation, or
+  just a wiring limit.
+*/
+
+/* The maximum address for ISA DMA transfer on Alpha XL, due to an
+   hardware SIO limitation, is 64MB.
+*/
+#define ALPHA_XL_MAX_ISA_DMA_ADDRESS           0x04000000UL
+
+/* The maximum address for ISA DMA transfer on RUFFIAN,
+   due to an hardware SIO limitation, is 16MB.
+*/
+#define ALPHA_RUFFIAN_MAX_ISA_DMA_ADDRESS      0x01000000UL
+
+/* The maximum address for ISA DMA transfer on SABLE, and some ALCORs,
+   due to an hardware SIO chip limitation, is 2GB.
+*/
+#define ALPHA_SABLE_MAX_ISA_DMA_ADDRESS                0x80000000UL
+#define ALPHA_ALCOR_MAX_ISA_DMA_ADDRESS                0x80000000UL
+
+/*
+  Maximum address for all the others is the complete 32-bit bus
+  address space.
+*/
+#define ALPHA_MAX_ISA_DMA_ADDRESS              0x100000000UL
+
+#ifdef CONFIG_ALPHA_GENERIC
+# define MAX_ISA_DMA_ADDRESS           (alpha_mv.max_isa_dma_address)
+#else
+# if defined(CONFIG_ALPHA_XL)
+#  define MAX_ISA_DMA_ADDRESS          ALPHA_XL_MAX_ISA_DMA_ADDRESS
+# elif defined(CONFIG_ALPHA_RUFFIAN)
+#  define MAX_ISA_DMA_ADDRESS          ALPHA_RUFFIAN_MAX_ISA_DMA_ADDRESS
+# elif defined(CONFIG_ALPHA_SABLE)
+#  define MAX_ISA_DMA_ADDRESS          ALPHA_SABLE_MAX_ISA_DMA_ADDRESS
+# elif defined(CONFIG_ALPHA_ALCOR)
+#  define MAX_ISA_DMA_ADDRESS          ALPHA_ALCOR_MAX_ISA_DMA_ADDRESS
+# else
+#  define MAX_ISA_DMA_ADDRESS          ALPHA_MAX_ISA_DMA_ADDRESS
+# endif
+#endif
+
+/* If we have the iommu, we don't have any address limitations on DMA.
+   Otherwise (Nautilus, RX164), we have to have 0-16 Mb DMA zone
+   like i386. */
+#define MAX_DMA_ADDRESS                (alpha_mv.mv_pci_tbi ?  \
+                                ~0UL : IDENT_ADDR + 0x01000000)
+
+/* 8237 DMA controllers */
+#define IO_DMA1_BASE   0x00    /* 8 bit slave DMA, channels 0..3 */
+#define IO_DMA2_BASE   0xC0    /* 16 bit master DMA, ch 4(=slave input)..7 */
+
+/* DMA controller registers */
+#define DMA1_CMD_REG           0x08    /* command register (w) */
+#define DMA1_STAT_REG          0x08    /* status register (r) */
+#define DMA1_REQ_REG            0x09    /* request register (w) */
+#define DMA1_MASK_REG          0x0A    /* single-channel mask (w) */
+#define DMA1_MODE_REG          0x0B    /* mode register (w) */
+#define DMA1_CLEAR_FF_REG      0x0C    /* clear pointer flip-flop (w) */
+#define DMA1_TEMP_REG           0x0D    /* Temporary Register (r) */
+#define DMA1_RESET_REG         0x0D    /* Master Clear (w) */
+#define DMA1_CLR_MASK_REG       0x0E    /* Clear Mask */
+#define DMA1_MASK_ALL_REG       0x0F    /* all-channels mask (w) */
+#define DMA1_EXT_MODE_REG      (0x400 | DMA1_MODE_REG)
+
+#define DMA2_CMD_REG           0xD0    /* command register (w) */
+#define DMA2_STAT_REG          0xD0    /* status register (r) */
+#define DMA2_REQ_REG            0xD2    /* request register (w) */
+#define DMA2_MASK_REG          0xD4    /* single-channel mask (w) */
+#define DMA2_MODE_REG          0xD6    /* mode register (w) */
+#define DMA2_CLEAR_FF_REG      0xD8    /* clear pointer flip-flop (w) */
+#define DMA2_TEMP_REG           0xDA    /* Temporary Register (r) */
+#define DMA2_RESET_REG         0xDA    /* Master Clear (w) */
+#define DMA2_CLR_MASK_REG       0xDC    /* Clear Mask */
+#define DMA2_MASK_ALL_REG       0xDE    /* all-channels mask (w) */
+#define DMA2_EXT_MODE_REG      (0x400 | DMA2_MODE_REG)
+
+#define DMA_ADDR_0              0x00    /* DMA address registers */
+#define DMA_ADDR_1              0x02
+#define DMA_ADDR_2              0x04
+#define DMA_ADDR_3              0x06
+#define DMA_ADDR_4              0xC0
+#define DMA_ADDR_5              0xC4
+#define DMA_ADDR_6              0xC8
+#define DMA_ADDR_7              0xCC
+
+#define DMA_CNT_0               0x01    /* DMA count registers */
+#define DMA_CNT_1               0x03
+#define DMA_CNT_2               0x05
+#define DMA_CNT_3               0x07
+#define DMA_CNT_4               0xC2
+#define DMA_CNT_5               0xC6
+#define DMA_CNT_6               0xCA
+#define DMA_CNT_7               0xCE
+
+#define DMA_PAGE_0              0x87    /* DMA page registers */
+#define DMA_PAGE_1              0x83
+#define DMA_PAGE_2              0x81
+#define DMA_PAGE_3              0x82
+#define DMA_PAGE_5              0x8B
+#define DMA_PAGE_6              0x89
+#define DMA_PAGE_7              0x8A
+
+#define DMA_HIPAGE_0           (0x400 | DMA_PAGE_0)
+#define DMA_HIPAGE_1           (0x400 | DMA_PAGE_1)
+#define DMA_HIPAGE_2           (0x400 | DMA_PAGE_2)
+#define DMA_HIPAGE_3           (0x400 | DMA_PAGE_3)
+#define DMA_HIPAGE_4           (0x400 | DMA_PAGE_4)
+#define DMA_HIPAGE_5           (0x400 | DMA_PAGE_5)
+#define DMA_HIPAGE_6           (0x400 | DMA_PAGE_6)
+#define DMA_HIPAGE_7           (0x400 | DMA_PAGE_7)
+
+#define DMA_MODE_READ  0x44    /* I/O to memory, no autoinit, increment, single mode */
+#define DMA_MODE_WRITE 0x48    /* memory to I/O, no autoinit, increment, single mode */
+#define DMA_MODE_CASCADE 0xC0   /* pass thru DREQ->HRQ, DACK<-HLDA only */
+
+#define DMA_AUTOINIT   0x10
+
+extern spinlock_t  dma_spin_lock;
+
+static __inline__ unsigned long claim_dma_lock(void)
+{
+       unsigned long flags;
+       spin_lock_irqsave(&dma_spin_lock, flags);
+       return flags;
+}
+
+static __inline__ void release_dma_lock(unsigned long flags)
+{
+       spin_unlock_irqrestore(&dma_spin_lock, flags);
+}
+
+/* enable/disable a specific DMA channel */
+static __inline__ void enable_dma(unsigned int dmanr)
+{
+       if (dmanr<=3)
+               dma_outb(dmanr,  DMA1_MASK_REG);
+       else
+               dma_outb(dmanr & 3,  DMA2_MASK_REG);
+}
+
+static __inline__ void disable_dma(unsigned int dmanr)
+{
+       if (dmanr<=3)
+               dma_outb(dmanr | 4,  DMA1_MASK_REG);
+       else
+               dma_outb((dmanr & 3) | 4,  DMA2_MASK_REG);
+}
+
+/* Clear the 'DMA Pointer Flip Flop'.
+ * Write 0 for LSB/MSB, 1 for MSB/LSB access.
+ * Use this once to initialize the FF to a known state.
+ * After that, keep track of it. :-)
+ * --- In order to do that, the DMA routines below should ---
+ * --- only be used while interrupts are disabled! ---
+ */
+static __inline__ void clear_dma_ff(unsigned int dmanr)
+{
+       if (dmanr<=3)
+               dma_outb(0,  DMA1_CLEAR_FF_REG);
+       else
+               dma_outb(0,  DMA2_CLEAR_FF_REG);
+}
+
+/* set mode (above) for a specific DMA channel */
+static __inline__ void set_dma_mode(unsigned int dmanr, char mode)
+{
+       if (dmanr<=3)
+               dma_outb(mode | dmanr,  DMA1_MODE_REG);
+       else
+               dma_outb(mode | (dmanr&3),  DMA2_MODE_REG);
+}
+
+/* set extended mode for a specific DMA channel */
+static __inline__ void set_dma_ext_mode(unsigned int dmanr, char ext_mode)
+{
+       if (dmanr<=3)
+               dma_outb(ext_mode | dmanr,  DMA1_EXT_MODE_REG);
+       else
+               dma_outb(ext_mode | (dmanr&3),  DMA2_EXT_MODE_REG);
+}
+
+/* Set only the page register bits of the transfer address.
+ * This is used for successive transfers when we know the contents of
+ * the lower 16 bits of the DMA current address register.
+ */
+static __inline__ void set_dma_page(unsigned int dmanr, unsigned int pagenr)
+{
+       switch(dmanr) {
+               case 0:
+                       dma_outb(pagenr, DMA_PAGE_0);
+                       dma_outb((pagenr >> 8), DMA_HIPAGE_0);
+                       break;
+               case 1:
+                       dma_outb(pagenr, DMA_PAGE_1);
+                       dma_outb((pagenr >> 8), DMA_HIPAGE_1);
+                       break;
+               case 2:
+                       dma_outb(pagenr, DMA_PAGE_2);
+                       dma_outb((pagenr >> 8), DMA_HIPAGE_2);
+                       break;
+               case 3:
+                       dma_outb(pagenr, DMA_PAGE_3);
+                       dma_outb((pagenr >> 8), DMA_HIPAGE_3);
+                       break;
+               case 5:
+                       dma_outb(pagenr & 0xfe, DMA_PAGE_5);
+                       dma_outb((pagenr >> 8), DMA_HIPAGE_5);
+                       break;
+               case 6:
+                       dma_outb(pagenr & 0xfe, DMA_PAGE_6);
+                       dma_outb((pagenr >> 8), DMA_HIPAGE_6);
+                       break;
+               case 7:
+                       dma_outb(pagenr & 0xfe, DMA_PAGE_7);
+                       dma_outb((pagenr >> 8), DMA_HIPAGE_7);
+                       break;
+       }
+}
+
+
+/* Set transfer address & page bits for specific DMA channel.
+ * Assumes dma flipflop is clear.
+ */
+static __inline__ void set_dma_addr(unsigned int dmanr, unsigned int a)
+{
+       if (dmanr <= 3)  {
+           dma_outb( a & 0xff, ((dmanr&3)<<1) + IO_DMA1_BASE );
+            dma_outb( (a>>8) & 0xff, ((dmanr&3)<<1) + IO_DMA1_BASE );
+       }  else  {
+           dma_outb( (a>>1) & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE );
+           dma_outb( (a>>9) & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE );
+       }
+       set_dma_page(dmanr, a>>16);     /* set hipage last to enable 32-bit mode */
+}
+
+
+/* Set transfer size (max 64k for DMA1..3, 128k for DMA5..7) for
+ * a specific DMA channel.
+ * You must ensure the parameters are valid.
+ * NOTE: from a manual: "the number of transfers is one more
+ * than the initial word count"! This is taken into account.
+ * Assumes dma flip-flop is clear.
+ * NOTE 2: "count" represents _bytes_ and must be even for channels 5-7.
+ */
+static __inline__ void set_dma_count(unsigned int dmanr, unsigned int count)
+{
+        count--;
+       if (dmanr <= 3)  {
+           dma_outb( count & 0xff, ((dmanr&3)<<1) + 1 + IO_DMA1_BASE );
+           dma_outb( (count>>8) & 0xff, ((dmanr&3)<<1) + 1 + IO_DMA1_BASE );
+        } else {
+           dma_outb( (count>>1) & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE );
+           dma_outb( (count>>9) & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE );
+        }
+}
+
+
+/* Get DMA residue count. After a DMA transfer, this
+ * should return zero. Reading this while a DMA transfer is
+ * still in progress will return unpredictable results.
+ * If called before the channel has been used, it may return 1.
+ * Otherwise, it returns the number of _bytes_ left to transfer.
+ *
+ * Assumes DMA flip-flop is clear.
+ */
+static __inline__ int get_dma_residue(unsigned int dmanr)
+{
+       unsigned int io_port = (dmanr<=3)? ((dmanr&3)<<1) + 1 + IO_DMA1_BASE
+                                        : ((dmanr&3)<<2) + 2 + IO_DMA2_BASE;
+
+       /* using short to get 16-bit wrap around */
+       unsigned short count;
+
+       count = 1 + dma_inb(io_port);
+       count += dma_inb(io_port) << 8;
+       
+       return (dmanr<=3)? count : (count<<1);
+}
+
+
+/* These are in kernel/dma.c: */
+extern int request_dma(unsigned int dmanr, const char * device_id);    /* reserve a DMA channel */
+extern void free_dma(unsigned int dmanr);      /* release it again */
+#define KERNEL_HAVE_CHECK_DMA
+extern int check_dma(unsigned int dmanr);
+
+/* From PCI */
+
+#ifdef CONFIG_PCI
+extern int isa_dma_bridge_buggy;
+#else
+#define isa_dma_bridge_buggy   (0)
+#endif
+
+
+#endif /* _ASM_DMA_H */
diff --git a/arch/alpha/include/asm/elf.h b/arch/alpha/include/asm/elf.h
new file mode 100644 (file)
index 0000000..fc1002e
--- /dev/null
@@ -0,0 +1,165 @@
+#ifndef __ASM_ALPHA_ELF_H
+#define __ASM_ALPHA_ELF_H
+
+#include <asm/auxvec.h>
+
+/* Special values for the st_other field in the symbol table.  */
+
+#define STO_ALPHA_NOPV         0x80
+#define STO_ALPHA_STD_GPLOAD   0x88
+
+/*
+ * Alpha ELF relocation types
+ */
+#define R_ALPHA_NONE            0       /* No reloc */
+#define R_ALPHA_REFLONG         1       /* Direct 32 bit */
+#define R_ALPHA_REFQUAD         2       /* Direct 64 bit */
+#define R_ALPHA_GPREL32         3       /* GP relative 32 bit */
+#define R_ALPHA_LITERAL         4       /* GP relative 16 bit w/optimization */
+#define R_ALPHA_LITUSE          5       /* Optimization hint for LITERAL */
+#define R_ALPHA_GPDISP          6       /* Add displacement to GP */
+#define R_ALPHA_BRADDR          7       /* PC+4 relative 23 bit shifted */
+#define R_ALPHA_HINT            8       /* PC+4 relative 16 bit shifted */
+#define R_ALPHA_SREL16          9       /* PC relative 16 bit */
+#define R_ALPHA_SREL32          10      /* PC relative 32 bit */
+#define R_ALPHA_SREL64          11      /* PC relative 64 bit */
+#define R_ALPHA_GPRELHIGH       17      /* GP relative 32 bit, high 16 bits */
+#define R_ALPHA_GPRELLOW        18      /* GP relative 32 bit, low 16 bits */
+#define R_ALPHA_GPREL16         19      /* GP relative 16 bit */
+#define R_ALPHA_COPY            24      /* Copy symbol at runtime */
+#define R_ALPHA_GLOB_DAT        25      /* Create GOT entry */
+#define R_ALPHA_JMP_SLOT        26      /* Create PLT entry */
+#define R_ALPHA_RELATIVE        27      /* Adjust by program base */
+#define R_ALPHA_BRSGP          28
+#define R_ALPHA_TLSGD           29
+#define R_ALPHA_TLS_LDM         30
+#define R_ALPHA_DTPMOD64        31
+#define R_ALPHA_GOTDTPREL       32
+#define R_ALPHA_DTPREL64        33
+#define R_ALPHA_DTPRELHI        34
+#define R_ALPHA_DTPRELLO        35
+#define R_ALPHA_DTPREL16        36
+#define R_ALPHA_GOTTPREL        37
+#define R_ALPHA_TPREL64         38
+#define R_ALPHA_TPRELHI         39
+#define R_ALPHA_TPRELLO         40
+#define R_ALPHA_TPREL16         41
+
+#define SHF_ALPHA_GPREL                0x10000000
+
+/* Legal values for e_flags field of Elf64_Ehdr.  */
+
+#define EF_ALPHA_32BIT         1       /* All addresses are below 2GB */
+
+/*
+ * ELF register definitions..
+ */
+
+/*
+ * The OSF/1 version of <sys/procfs.h> makes gregset_t 46 entries long.
+ * I have no idea why that is so.  For now, we just leave it at 33
+ * (32 general regs + processor status word). 
+ */
+#define ELF_NGREG      33
+#define ELF_NFPREG     32
+
+typedef unsigned long elf_greg_t;
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+typedef double elf_fpreg_t;
+typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+
+/*
+ * This is used to ensure we don't load something for the wrong architecture.
+ */
+#define elf_check_arch(x) ((x)->e_machine == EM_ALPHA)
+
+/*
+ * These are used to set parameters in the core dumps.
+ */
+#define ELF_CLASS      ELFCLASS64
+#define ELF_DATA       ELFDATA2LSB
+#define ELF_ARCH       EM_ALPHA
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE      8192
+
+/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
+   use of this is to invoke "./ld.so someprog" to test out a new version of
+   the loader.  We need to make sure that it is out of the way of the program
+   that it will "exec", and that there is sufficient room for the brk.  */
+
+#define ELF_ET_DYN_BASE                (TASK_UNMAPPED_BASE + 0x1000000)
+
+/* $0 is set by ld.so to a pointer to a function which might be 
+   registered using atexit.  This provides a mean for the dynamic
+   linker to call DT_FINI functions for shared libraries that have
+   been loaded before the code runs.
+
+   So that we can use the same startup file with static executables,
+   we start programs with a value of 0 to indicate that there is no
+   such function.  */
+
+#define ELF_PLAT_INIT(_r, load_addr)   _r->r0 = 0
+
+/* The registers are layed out in pt_regs for PAL and syscall
+   convenience.  Re-order them for the linear elf_gregset_t.  */
+
+struct pt_regs;
+struct thread_info;
+struct task_struct;
+extern void dump_elf_thread(elf_greg_t *dest, struct pt_regs *pt,
+                           struct thread_info *ti);
+#define ELF_CORE_COPY_REGS(DEST, REGS) \
+       dump_elf_thread(DEST, REGS, current_thread_info());
+
+/* Similar, but for a thread other than current.  */
+
+extern int dump_elf_task(elf_greg_t *dest, struct task_struct *task);
+#define ELF_CORE_COPY_TASK_REGS(TASK, DEST) \
+       dump_elf_task(*(DEST), TASK)
+
+/* Similar, but for the FP registers.  */
+
+extern int dump_elf_task_fp(elf_fpreg_t *dest, struct task_struct *task);
+#define ELF_CORE_COPY_FPREGS(TASK, DEST) \
+       dump_elf_task_fp(*(DEST), TASK)
+
+/* This yields a mask that user programs can use to figure out what
+   instruction set this CPU supports.  This is trivial on Alpha, 
+   but not so on other machines. */
+
+#define ELF_HWCAP  (~amask(-1))
+
+/* This yields a string that ld.so will use to load implementation
+   specific libraries for optimization.  This is more specific in
+   intent than poking at uname or /proc/cpuinfo.  */
+
+#define ELF_PLATFORM                           \
+({                                             \
+       enum implver_enum i_ = implver();       \
+       ( i_ == IMPLVER_EV4 ? "ev4"             \
+       : i_ == IMPLVER_EV5                     \
+         ? (amask(AMASK_BWX) ? "ev5" : "ev56") \
+       : amask (AMASK_CIX) ? "ev6" : "ev67");  \
+})
+
+#define SET_PERSONALITY(EX, IBCS2)                             \
+       set_personality(((EX).e_flags & EF_ALPHA_32BIT)         \
+          ? PER_LINUX_32BIT : (IBCS2) ? PER_SVR4 : PER_LINUX)
+
+extern int alpha_l1i_cacheshape;
+extern int alpha_l1d_cacheshape;
+extern int alpha_l2_cacheshape;
+extern int alpha_l3_cacheshape;
+
+/* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */
+#define ARCH_DLINFO                                            \
+  do {                                                         \
+    NEW_AUX_ENT(AT_L1I_CACHESHAPE, alpha_l1i_cacheshape);      \
+    NEW_AUX_ENT(AT_L1D_CACHESHAPE, alpha_l1d_cacheshape);      \
+    NEW_AUX_ENT(AT_L2_CACHESHAPE, alpha_l2_cacheshape);                \
+    NEW_AUX_ENT(AT_L3_CACHESHAPE, alpha_l3_cacheshape);                \
+  } while (0)
+
+#endif /* __ASM_ALPHA_ELF_H */
diff --git a/arch/alpha/include/asm/emergency-restart.h b/arch/alpha/include/asm/emergency-restart.h
new file mode 100644 (file)
index 0000000..108d8c4
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _ASM_EMERGENCY_RESTART_H
+#define _ASM_EMERGENCY_RESTART_H
+
+#include <asm-generic/emergency-restart.h>
+
+#endif /* _ASM_EMERGENCY_RESTART_H */
diff --git a/arch/alpha/include/asm/err_common.h b/arch/alpha/include/asm/err_common.h
new file mode 100644 (file)
index 0000000..c250959
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ *     linux/include/asm-alpha/err_common.h
+ *
+ *     Copyright (C) 2000 Jeff Wiedemeier (Compaq Computer Corporation)
+ *
+ *     Contains declarations and macros to support Alpha error handling
+ *     implementations.
+ */
+
+#ifndef __ALPHA_ERR_COMMON_H
+#define __ALPHA_ERR_COMMON_H 1
+
+/*
+ * SCB Vector definitions
+ */
+#define SCB_Q_SYSERR   0x620
+#define SCB_Q_PROCERR  0x630
+#define SCB_Q_SYSMCHK  0x660
+#define SCB_Q_PROCMCHK 0x670
+#define SCB_Q_SYSEVENT 0x680
+
+/*
+ * Disposition definitions for logout frame parser
+ */
+#define MCHK_DISPOSITION_UNKNOWN_ERROR         0x00
+#define MCHK_DISPOSITION_REPORT                        0x01
+#define MCHK_DISPOSITION_DISMISS               0x02
+
+/*
+ * Error Log definitions
+ */
+/*
+ * Types
+ */
+
+#define EL_CLASS__TERMINATION          (0)
+#  define EL_TYPE__TERMINATION__TERMINATION            (0)
+#define EL_CLASS__HEADER               (5)
+#  define EL_TYPE__HEADER__SYSTEM_ERROR_FRAME          (1)
+#  define EL_TYPE__HEADER__SYSTEM_EVENT_FRAME          (2)
+#  define EL_TYPE__HEADER__HALT_FRAME                  (3)
+#  define EL_TYPE__HEADER__LOGOUT_FRAME                        (19)
+#define EL_CLASS__GENERAL_NOTIFICATION (9)
+#define EL_CLASS__PCI_ERROR_FRAME      (11)
+#define EL_CLASS__REGATTA_FAMILY       (12)
+#  define EL_TYPE__REGATTA__PROCESSOR_ERROR_FRAME      (1)
+#  define EL_TYPE__REGATTA__SYSTEM_ERROR_FRAME         (2)
+#  define EL_TYPE__REGATTA__ENVIRONMENTAL_FRAME                (3)
+#  define EL_TYPE__REGATTA__TITAN_PCHIP0_EXTENDED      (8)
+#  define EL_TYPE__REGATTA__TITAN_PCHIP1_EXTENDED      (9)
+#  define EL_TYPE__REGATTA__TITAN_MEMORY_EXTENDED      (10)
+#  define EL_TYPE__REGATTA__PROCESSOR_DBL_ERROR_HALT   (11)
+#  define EL_TYPE__REGATTA__SYSTEM_DBL_ERROR_HALT      (12)
+#define EL_CLASS__PAL                   (14)
+#  define EL_TYPE__PAL__LOGOUT_FRAME                    (1)
+#  define EL_TYPE__PAL__EV7_PROCESSOR                  (4)
+#  define EL_TYPE__PAL__EV7_ZBOX                       (5)
+#  define EL_TYPE__PAL__EV7_RBOX                       (6)
+#  define EL_TYPE__PAL__EV7_IO                         (7)
+#  define EL_TYPE__PAL__ENV__AMBIENT_TEMPERATURE       (10)
+#  define EL_TYPE__PAL__ENV__AIRMOVER_FAN              (11)
+#  define EL_TYPE__PAL__ENV__VOLTAGE                   (12)
+#  define EL_TYPE__PAL__ENV__INTRUSION                 (13)
+#  define EL_TYPE__PAL__ENV__POWER_SUPPLY              (14)
+#  define EL_TYPE__PAL__ENV__LAN                       (15)
+#  define EL_TYPE__PAL__ENV__HOT_PLUG                  (16)
+
+union el_timestamp {
+       struct {
+               u8 second;
+               u8 minute;
+               u8 hour;
+               u8 day;
+               u8 month;
+               u8 year;
+       } b;
+       u64 as_int;
+};
+
+struct el_subpacket {
+       u16 length;             /* length of header (in bytes)  */
+       u16 class;              /* header class and type...     */
+       u16 type;               /* ...determine content         */
+       u16 revision;           /* header revision              */
+       union {
+               struct {        /* Class 5, Type 1 - System Error       */
+                       u32 frame_length;
+                       u32 frame_packet_count;                 
+               } sys_err;                      
+               struct {        /* Class 5, Type 2 - System Event       */
+                       union el_timestamp timestamp;
+                       u32 frame_length;
+                       u32 frame_packet_count;                 
+               } sys_event;
+               struct {        /* Class 5, Type 3 - Double Error Halt  */
+                       u16 halt_code;
+                       u16 reserved;
+                       union el_timestamp timestamp;
+                       u32 frame_length;
+                       u32 frame_packet_count;
+               } err_halt;
+               struct {        /* Clasee 5, Type 19 - Logout Frame Header */
+                       u32 frame_length;
+                       u32 frame_flags;
+                       u32 cpu_offset; 
+                       u32 system_offset;
+               } logout_header;
+               struct {        /* Class 12 - Regatta                   */
+                       u64 cpuid;
+                       u64 data_start[1];
+               } regatta_frame;
+               struct {        /* Raw                                  */
+                       u64 data_start[1];
+               } raw;
+       } by_type;
+};
+
+#endif /* __ALPHA_ERR_COMMON_H */
diff --git a/arch/alpha/include/asm/err_ev6.h b/arch/alpha/include/asm/err_ev6.h
new file mode 100644 (file)
index 0000000..ea63779
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_ERR_EV6_H
+#define __ALPHA_ERR_EV6_H 1
+
+/* Dummy include for now. */
+
+#endif /* __ALPHA_ERR_EV6_H */
diff --git a/arch/alpha/include/asm/err_ev7.h b/arch/alpha/include/asm/err_ev7.h
new file mode 100644 (file)
index 0000000..87f9977
--- /dev/null
@@ -0,0 +1,202 @@
+#ifndef __ALPHA_ERR_EV7_H
+#define __ALPHA_ERR_EV7_H 1
+
+/*
+ * Data for el packet class PAL (14), type LOGOUT_FRAME (1)
+ */
+struct ev7_pal_logout_subpacket {
+       u32 mchk_code;
+       u32 subpacket_count;
+       u64 whami;
+       u64 rbox_whami;
+       u64 rbox_int;
+       u64 exc_addr;
+       union el_timestamp timestamp;
+       u64 halt_code;
+       u64 reserved;
+};
+
+/*
+ * Data for el packet class PAL (14), type EV7_PROCESSOR (4)
+ */
+struct ev7_pal_processor_subpacket {
+       u64 i_stat;
+       u64 dc_stat;
+       u64 c_addr;
+       u64 c_syndrome_1;
+       u64 c_syndrome_0;
+       u64 c_stat;
+       u64 c_sts;
+       u64 mm_stat;
+       u64 exc_addr;
+       u64 ier_cm;
+       u64 isum;
+       u64 pal_base;
+       u64 i_ctl;
+       u64 process_context;
+       u64 cbox_ctl;
+       u64 cbox_stp_ctl;
+       u64 cbox_acc_ctl;
+       u64 cbox_lcl_set;
+       u64 cbox_gbl_set;
+       u64 bbox_ctl;
+       u64 bbox_err_sts;
+       u64 bbox_err_idx;
+       u64 cbox_ddp_err_sts;
+       u64 bbox_dat_rmp;
+       u64 reserved[2];
+};
+
+/*
+ * Data for el packet class PAL (14), type EV7_ZBOX (5)
+ */
+struct ev7_pal_zbox_subpacket {
+       u32 zbox0_dram_err_status_1;
+       u32 zbox0_dram_err_status_2;
+       u32 zbox0_dram_err_status_3;
+       u32 zbox0_dram_err_ctl;
+       u32 zbox0_dram_err_adr;
+       u32 zbox0_dift_timeout;
+       u32 zbox0_dram_mapper_ctl;
+       u32 zbox0_frc_err_adr;
+       u32 zbox0_dift_err_status;
+       u32 reserved1;
+       u32 zbox1_dram_err_status_1;
+       u32 zbox1_dram_err_status_2;
+       u32 zbox1_dram_err_status_3;
+       u32 zbox1_dram_err_ctl;
+       u32 zbox1_dram_err_adr;
+       u32 zbox1_dift_timeout;
+       u32 zbox1_dram_mapper_ctl;
+       u32 zbox1_frc_err_adr;
+       u32 zbox1_dift_err_status;
+       u32 reserved2;
+       u64 cbox_ctl;
+       u64 cbox_stp_ctl;
+       u64 zbox0_error_pa;
+       u64 zbox1_error_pa;
+       u64 zbox0_ored_syndrome;
+       u64 zbox1_ored_syndrome;
+       u64 reserved3[2];
+};
+
+/*
+ * Data for el packet class PAL (14), type EV7_RBOX (6)
+ */
+struct ev7_pal_rbox_subpacket {
+       u64 rbox_cfg;
+       u64 rbox_n_cfg;
+       u64 rbox_s_cfg;
+       u64 rbox_e_cfg;
+       u64 rbox_w_cfg;
+       u64 rbox_n_err;
+       u64 rbox_s_err;
+       u64 rbox_e_err;
+       u64 rbox_w_err;
+       u64 rbox_io_cfg;
+       u64 rbox_io_err;
+       u64 rbox_l_err;
+       u64 rbox_whoami;
+       u64 rbox_imask;
+       u64 rbox_intq;
+       u64 rbox_int;
+       u64 reserved[2];
+};
+
+/*
+ * Data for el packet class PAL (14), type EV7_IO (7)
+ */
+struct ev7_pal_io_one_port {
+       u64 pox_err_sum;
+       u64 pox_tlb_err;
+       u64 pox_spl_cmplt;
+       u64 pox_trans_sum;
+       u64 pox_first_err;
+       u64 pox_mult_err;
+       u64 pox_dm_source;
+       u64 pox_dm_dest;
+       u64 pox_dm_size;
+       u64 pox_dm_ctrl;
+       u64 reserved;
+};
+
+struct ev7_pal_io_subpacket {
+       u64 io_asic_rev;
+       u64 io_sys_rev;
+       u64 io7_uph;
+       u64 hpi_ctl;
+       u64 crd_ctl;
+       u64 hei_ctl;
+       u64 po7_error_sum;
+       u64 po7_uncrr_sym;
+       u64 po7_crrct_sym;
+       u64 po7_ugbge_sym;
+       u64 po7_err_pkt0;
+       u64 po7_err_pkt1;
+       u64 reserved[2];
+       struct ev7_pal_io_one_port ports[4];
+};
+
+/*
+ * Environmental subpacket. Data used for el packets:
+ *        class PAL (14), type AMBIENT_TEMPERATURE (10)
+ *        class PAL (14), type AIRMOVER_FAN (11)
+ *        class PAL (14), type VOLTAGE (12)
+ *        class PAL (14), type INTRUSION (13)
+ *        class PAL (14), type POWER_SUPPLY (14)
+ *        class PAL (14), type LAN (15)
+ *        class PAL (14), type HOT_PLUG (16)
+ */
+struct ev7_pal_environmental_subpacket {
+       u16 cabinet;
+       u16 drawer;
+       u16 reserved1[2];
+       u8 module_type;
+       u8 unit_id;             /* unit reporting condition */
+       u8 reserved2;
+       u8 condition;           /* condition reported       */
+};
+
+/*
+ * Convert environmental type to index
+ */
+static inline int ev7_lf_env_index(int type)
+{
+       BUG_ON((type < EL_TYPE__PAL__ENV__AMBIENT_TEMPERATURE) 
+              || (type > EL_TYPE__PAL__ENV__HOT_PLUG));
+
+       return type - EL_TYPE__PAL__ENV__AMBIENT_TEMPERATURE;
+}
+
+/*
+ * Data for generic el packet class PAL.
+ */
+struct ev7_pal_subpacket {
+       union {
+               struct ev7_pal_logout_subpacket logout;      /* Type     1 */
+               struct ev7_pal_processor_subpacket ev7;      /* Type     4 */
+               struct ev7_pal_zbox_subpacket zbox;          /* Type     5 */
+               struct ev7_pal_rbox_subpacket rbox;          /* Type     6 */
+               struct ev7_pal_io_subpacket io;              /* Type     7 */
+               struct ev7_pal_environmental_subpacket env;  /* Type 10-16 */
+               u64 as_quad[1];                              /* Raw u64    */
+       } by_type;
+};
+
+/*
+ * Struct to contain collected logout from subpackets.
+ */
+struct ev7_lf_subpackets {
+       struct ev7_pal_logout_subpacket *logout;                /* Type  1 */
+       struct ev7_pal_processor_subpacket *ev7;                /* Type  4 */
+       struct ev7_pal_zbox_subpacket *zbox;                    /* Type  5 */
+       struct ev7_pal_rbox_subpacket *rbox;                    /* Type  6 */
+       struct ev7_pal_io_subpacket *io;                        /* Type  7 */
+       struct ev7_pal_environmental_subpacket *env[7];      /* Type 10-16 */
+
+       unsigned int io_pid;
+};
+
+#endif /* __ALPHA_ERR_EV7_H */
+
+
diff --git a/arch/alpha/include/asm/errno.h b/arch/alpha/include/asm/errno.h
new file mode 100644 (file)
index 0000000..69e2655
--- /dev/null
@@ -0,0 +1,123 @@
+#ifndef _ALPHA_ERRNO_H
+#define _ALPHA_ERRNO_H
+
+#include <asm-generic/errno-base.h>
+
+#undef EAGAIN                  /* 11 in errno-base.h */
+
+#define        EDEADLK         11      /* Resource deadlock would occur */
+
+#define        EAGAIN          35      /* Try again */
+#define        EWOULDBLOCK     EAGAIN  /* Operation would block */
+#define        EINPROGRESS     36      /* Operation now in progress */
+#define        EALREADY        37      /* Operation already in progress */
+#define        ENOTSOCK        38      /* Socket operation on non-socket */
+#define        EDESTADDRREQ    39      /* Destination address required */
+#define        EMSGSIZE        40      /* Message too long */
+#define        EPROTOTYPE      41      /* Protocol wrong type for socket */
+#define        ENOPROTOOPT     42      /* Protocol not available */
+#define        EPROTONOSUPPORT 43      /* Protocol not supported */
+#define        ESOCKTNOSUPPORT 44      /* Socket type not supported */
+#define        EOPNOTSUPP      45      /* Operation not supported on transport endpoint */
+#define        EPFNOSUPPORT    46      /* Protocol family not supported */
+#define        EAFNOSUPPORT    47      /* Address family not supported by protocol */
+#define        EADDRINUSE      48      /* Address already in use */
+#define        EADDRNOTAVAIL   49      /* Cannot assign requested address */
+#define        ENETDOWN        50      /* Network is down */
+#define        ENETUNREACH     51      /* Network is unreachable */
+#define        ENETRESET       52      /* Network dropped connection because of reset */
+#define        ECONNABORTED    53      /* Software caused connection abort */
+#define        ECONNRESET      54      /* Connection reset by peer */
+#define        ENOBUFS         55      /* No buffer space available */
+#define        EISCONN         56      /* Transport endpoint is already connected */
+#define        ENOTCONN        57      /* Transport endpoint is not connected */
+#define        ESHUTDOWN       58      /* Cannot send after transport endpoint shutdown */
+#define        ETOOMANYREFS    59      /* Too many references: cannot splice */
+#define        ETIMEDOUT       60      /* Connection timed out */
+#define        ECONNREFUSED    61      /* Connection refused */
+#define        ELOOP           62      /* Too many symbolic links encountered */
+#define        ENAMETOOLONG    63      /* File name too long */
+#define        EHOSTDOWN       64      /* Host is down */
+#define        EHOSTUNREACH    65      /* No route to host */
+#define        ENOTEMPTY       66      /* Directory not empty */
+
+#define        EUSERS          68      /* Too many users */
+#define        EDQUOT          69      /* Quota exceeded */
+#define        ESTALE          70      /* Stale NFS file handle */
+#define        EREMOTE         71      /* Object is remote */
+
+#define        ENOLCK          77      /* No record locks available */
+#define        ENOSYS          78      /* Function not implemented */
+
+#define        ENOMSG          80      /* No message of desired type */
+#define        EIDRM           81      /* Identifier removed */
+#define        ENOSR           82      /* Out of streams resources */
+#define        ETIME           83      /* Timer expired */
+#define        EBADMSG         84      /* Not a data message */
+#define        EPROTO          85      /* Protocol error */
+#define        ENODATA         86      /* No data available */
+#define        ENOSTR          87      /* Device not a stream */
+
+#define        ENOPKG          92      /* Package not installed */
+
+#define        EILSEQ          116     /* Illegal byte sequence */
+
+/* The following are just random noise.. */
+#define        ECHRNG          88      /* Channel number out of range */
+#define        EL2NSYNC        89      /* Level 2 not synchronized */
+#define        EL3HLT          90      /* Level 3 halted */
+#define        EL3RST          91      /* Level 3 reset */
+
+#define        ELNRNG          93      /* Link number out of range */
+#define        EUNATCH         94      /* Protocol driver not attached */
+#define        ENOCSI          95      /* No CSI structure available */
+#define        EL2HLT          96      /* Level 2 halted */
+#define        EBADE           97      /* Invalid exchange */
+#define        EBADR           98      /* Invalid request descriptor */
+#define        EXFULL          99      /* Exchange full */
+#define        ENOANO          100     /* No anode */
+#define        EBADRQC         101     /* Invalid request code */
+#define        EBADSLT         102     /* Invalid slot */
+
+#define        EDEADLOCK       EDEADLK
+
+#define        EBFONT          104     /* Bad font file format */
+#define        ENONET          105     /* Machine is not on the network */
+#define        ENOLINK         106     /* Link has been severed */
+#define        EADV            107     /* Advertise error */
+#define        ESRMNT          108     /* Srmount error */
+#define        ECOMM           109     /* Communication error on send */
+#define        EMULTIHOP       110     /* Multihop attempted */
+#define        EDOTDOT         111     /* RFS specific error */
+#define        EOVERFLOW       112     /* Value too large for defined data type */
+#define        ENOTUNIQ        113     /* Name not unique on network */
+#define        EBADFD          114     /* File descriptor in bad state */
+#define        EREMCHG         115     /* Remote address changed */
+
+#define        EUCLEAN         117     /* Structure needs cleaning */
+#define        ENOTNAM         118     /* Not a XENIX named type file */
+#define        ENAVAIL         119     /* No XENIX semaphores available */
+#define        EISNAM          120     /* Is a named type file */
+#define        EREMOTEIO       121     /* Remote I/O error */
+
+#define        ELIBACC         122     /* Can not access a needed shared library */
+#define        ELIBBAD         123     /* Accessing a corrupted shared library */
+#define        ELIBSCN         124     /* .lib section in a.out corrupted */
+#define        ELIBMAX         125     /* Attempting to link in too many shared libraries */
+#define        ELIBEXEC        126     /* Cannot exec a shared library directly */
+#define        ERESTART        127     /* Interrupted system call should be restarted */
+#define        ESTRPIPE        128     /* Streams pipe error */
+
+#define ENOMEDIUM      129     /* No medium found */
+#define EMEDIUMTYPE    130     /* Wrong medium type */
+#define        ECANCELED       131     /* Operation Cancelled */
+#define        ENOKEY          132     /* Required key not available */
+#define        EKEYEXPIRED     133     /* Key has expired */
+#define        EKEYREVOKED     134     /* Key has been revoked */
+#define        EKEYREJECTED    135     /* Key was rejected by service */
+
+/* for robust mutexes */
+#define        EOWNERDEAD      136     /* Owner died */
+#define        ENOTRECOVERABLE 137     /* State not recoverable */
+
+#endif
diff --git a/arch/alpha/include/asm/fb.h b/arch/alpha/include/asm/fb.h
new file mode 100644 (file)
index 0000000..fa9bbb9
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef _ASM_FB_H_
+#define _ASM_FB_H_
+#include <linux/device.h>
+
+/* Caching is off in the I/O space quadrant by design.  */
+#define fb_pgprotect(...) do {} while (0)
+
+static inline int fb_is_primary_device(struct fb_info *info)
+{
+       return 0;
+}
+
+#endif /* _ASM_FB_H_ */
diff --git a/arch/alpha/include/asm/fcntl.h b/arch/alpha/include/asm/fcntl.h
new file mode 100644 (file)
index 0000000..25da001
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef _ALPHA_FCNTL_H
+#define _ALPHA_FCNTL_H
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+   located on an ext2 file system */
+#define O_CREAT                 01000  /* not fcntl */
+#define O_TRUNC                 02000  /* not fcntl */
+#define O_EXCL          04000  /* not fcntl */
+#define O_NOCTTY       010000  /* not fcntl */
+
+#define O_NONBLOCK      00004
+#define O_APPEND        00010
+#define O_SYNC         040000
+#define O_DIRECTORY    0100000 /* must be a directory */
+#define O_NOFOLLOW     0200000 /* don't follow links */
+#define O_LARGEFILE    0400000 /* will be set by the kernel on every open */
+#define O_DIRECT       02000000 /* direct disk access - should check with OSF/1 */
+#define O_NOATIME      04000000
+#define O_CLOEXEC      010000000 /* set close_on_exec */
+
+#define F_GETLK                7
+#define F_SETLK                8
+#define F_SETLKW       9
+
+#define F_SETOWN       5       /*  for sockets. */
+#define F_GETOWN       6       /*  for sockets. */
+#define F_SETSIG       10      /*  for sockets. */
+#define F_GETSIG       11      /*  for sockets. */
+
+/* for posix fcntl() and lockf() */
+#define F_RDLCK                1
+#define F_WRLCK                2
+#define F_UNLCK                8
+
+/* for old implementation of bsd flock () */
+#define F_EXLCK                16      /* or 3 */
+#define F_SHLCK                32      /* or 4 */
+
+#define F_INPROGRESS   64
+
+#include <asm-generic/fcntl.h>
+
+#endif
diff --git a/arch/alpha/include/asm/floppy.h b/arch/alpha/include/asm/floppy.h
new file mode 100644 (file)
index 0000000..0be5041
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Architecture specific parts of the Floppy driver
+ *
+ * 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) 1995
+ */
+#ifndef __ASM_ALPHA_FLOPPY_H
+#define __ASM_ALPHA_FLOPPY_H
+
+
+#define fd_inb(port)                   inb_p(port)
+#define fd_outb(value,port)            outb_p(value,port)
+
+#define fd_enable_dma()         enable_dma(FLOPPY_DMA)
+#define fd_disable_dma()        disable_dma(FLOPPY_DMA)
+#define fd_request_dma()        request_dma(FLOPPY_DMA,"floppy")
+#define fd_free_dma()           free_dma(FLOPPY_DMA)
+#define fd_clear_dma_ff()       clear_dma_ff(FLOPPY_DMA)
+#define fd_set_dma_mode(mode)   set_dma_mode(FLOPPY_DMA,mode)
+#define fd_set_dma_addr(addr)   set_dma_addr(FLOPPY_DMA,virt_to_bus(addr))
+#define fd_set_dma_count(count) set_dma_count(FLOPPY_DMA,count)
+#define fd_enable_irq()         enable_irq(FLOPPY_IRQ)
+#define fd_disable_irq()        disable_irq(FLOPPY_IRQ)
+#define fd_cacheflush(addr,size) /* nothing */
+#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>
+
+#define fd_dma_setup(addr,size,mode,io) alpha_fd_dma_setup(addr,size,mode,io)
+
+static __inline__ int 
+alpha_fd_dma_setup(char *addr, unsigned long size, int mode, int io)
+{
+       static unsigned long prev_size;
+       static dma_addr_t bus_addr = 0;
+       static char *prev_addr;
+       static int prev_dir;
+       int dir;
+
+       dir = (mode != DMA_MODE_READ) ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE;
+
+       if (bus_addr 
+           && (addr != prev_addr || size != prev_size || dir != prev_dir)) {
+               /* different from last time -- unmap prev */
+               pci_unmap_single(isa_bridge, bus_addr, prev_size, prev_dir);
+               bus_addr = 0;
+       }
+
+       if (!bus_addr)  /* need to map it */
+               bus_addr = pci_map_single(isa_bridge, addr, size, dir);
+
+       /* remember this one as prev */
+       prev_addr = addr;
+       prev_size = size;
+       prev_dir = dir;
+
+       fd_clear_dma_ff();
+       fd_cacheflush(addr, size);
+       fd_set_dma_mode(mode);
+       set_dma_addr(FLOPPY_DMA, bus_addr);
+       fd_set_dma_count(size);
+       virtual_dma_port = io;
+       fd_enable_dma();
+
+       return 0;
+}
+
+#endif /* CONFIG_PCI */
+
+__inline__ void virtual_dma_init(void)
+{
+       /* Nothing to do on an Alpha */
+}
+
+static int FDC1 = 0x3f0;
+static int FDC2 = -1;
+
+/*
+ * Again, the CMOS information doesn't work on the alpha..
+ */
+#define FLOPPY0_TYPE 6
+#define FLOPPY1_TYPE 0
+
+#define N_FDC 2
+#define N_DRIVE 8
+
+/*
+ * Most Alphas have no problems with floppy DMA crossing 64k borders,
+ * except for certain ones, like XL and RUFFIAN.
+ *
+ * However, the test is simple and fast, and this *is* floppy, after all,
+ * so we do it for all platforms, just to make sure.
+ *
+ * This is advantageous in other circumstances as well, as in moving
+ * about the PCI DMA windows and forcing the floppy to start doing
+ * scatter-gather when it never had before, and there *is* a problem
+ * on that platform... ;-}
+ */
+
+static inline unsigned long CROSS_64KB(void *a, unsigned long s)
+{
+       unsigned long p = (unsigned long)a;
+       return ((p + s - 1) ^ p) & ~0xffffUL;
+}
+
+#define EXTRA_FLOPPY_PARAMS
+
+#endif /* __ASM_ALPHA_FLOPPY_H */
diff --git a/arch/alpha/include/asm/fpu.h b/arch/alpha/include/asm/fpu.h
new file mode 100644 (file)
index 0000000..ecb17a7
--- /dev/null
@@ -0,0 +1,193 @@
+#ifndef __ASM_ALPHA_FPU_H
+#define __ASM_ALPHA_FPU_H
+
+/*
+ * Alpha floating-point control register defines:
+ */
+#define FPCR_DNOD      (1UL<<47)       /* denorm INV trap disable */
+#define FPCR_DNZ       (1UL<<48)       /* denorms to zero */
+#define FPCR_INVD      (1UL<<49)       /* invalid op disable (opt.) */
+#define FPCR_DZED      (1UL<<50)       /* division by zero disable (opt.) */
+#define FPCR_OVFD      (1UL<<51)       /* overflow disable (optional) */
+#define FPCR_INV       (1UL<<52)       /* invalid operation */
+#define FPCR_DZE       (1UL<<53)       /* division by zero */
+#define FPCR_OVF       (1UL<<54)       /* overflow */
+#define FPCR_UNF       (1UL<<55)       /* underflow */
+#define FPCR_INE       (1UL<<56)       /* inexact */
+#define FPCR_IOV       (1UL<<57)       /* integer overflow */
+#define FPCR_UNDZ      (1UL<<60)       /* underflow to zero (opt.) */
+#define FPCR_UNFD      (1UL<<61)       /* underflow disable (opt.) */
+#define FPCR_INED      (1UL<<62)       /* inexact disable (opt.) */
+#define FPCR_SUM       (1UL<<63)       /* summary bit */
+
+#define FPCR_DYN_SHIFT 58              /* first dynamic rounding mode bit */
+#define FPCR_DYN_CHOPPED (0x0UL << FPCR_DYN_SHIFT)     /* towards 0 */
+#define FPCR_DYN_MINUS  (0x1UL << FPCR_DYN_SHIFT)      /* towards -INF */
+#define FPCR_DYN_NORMAL         (0x2UL << FPCR_DYN_SHIFT)      /* towards nearest */
+#define FPCR_DYN_PLUS   (0x3UL << FPCR_DYN_SHIFT)      /* towards +INF */
+#define FPCR_DYN_MASK   (0x3UL << FPCR_DYN_SHIFT)
+
+#define FPCR_MASK      0xffff800000000000L
+
+/*
+ * IEEE trap enables are implemented in software.  These per-thread
+ * bits are stored in the "ieee_state" field of "struct thread_info".
+ * Thus, the bits are defined so as not to conflict with the
+ * floating-point enable bit (which is architected).  On top of that,
+ * we want to make these bits compatible with OSF/1 so
+ * ieee_set_fp_control() etc. can be implemented easily and
+ * compatibly.  The corresponding definitions are in
+ * /usr/include/machine/fpu.h under OSF/1.
+ */
+#define IEEE_TRAP_ENABLE_INV   (1UL<<1)        /* invalid op */
+#define IEEE_TRAP_ENABLE_DZE   (1UL<<2)        /* division by zero */
+#define IEEE_TRAP_ENABLE_OVF   (1UL<<3)        /* overflow */
+#define IEEE_TRAP_ENABLE_UNF   (1UL<<4)        /* underflow */
+#define IEEE_TRAP_ENABLE_INE   (1UL<<5)        /* inexact */
+#define IEEE_TRAP_ENABLE_DNO   (1UL<<6)        /* denorm */
+#define IEEE_TRAP_ENABLE_MASK  (IEEE_TRAP_ENABLE_INV | IEEE_TRAP_ENABLE_DZE |\
+                                IEEE_TRAP_ENABLE_OVF | IEEE_TRAP_ENABLE_UNF |\
+                                IEEE_TRAP_ENABLE_INE | IEEE_TRAP_ENABLE_DNO)
+
+/* Denorm and Underflow flushing */
+#define IEEE_MAP_DMZ           (1UL<<12)       /* Map denorm inputs to zero */
+#define IEEE_MAP_UMZ           (1UL<<13)       /* Map underflowed outputs to zero */
+
+#define IEEE_MAP_MASK          (IEEE_MAP_DMZ | IEEE_MAP_UMZ)
+
+/* status bits coming from fpcr: */
+#define IEEE_STATUS_INV                (1UL<<17)
+#define IEEE_STATUS_DZE                (1UL<<18)
+#define IEEE_STATUS_OVF                (1UL<<19)
+#define IEEE_STATUS_UNF                (1UL<<20)
+#define IEEE_STATUS_INE                (1UL<<21)
+#define IEEE_STATUS_DNO                (1UL<<22)
+
+#define IEEE_STATUS_MASK       (IEEE_STATUS_INV | IEEE_STATUS_DZE |    \
+                                IEEE_STATUS_OVF | IEEE_STATUS_UNF |    \
+                                IEEE_STATUS_INE | IEEE_STATUS_DNO)
+
+#define IEEE_SW_MASK           (IEEE_TRAP_ENABLE_MASK |                \
+                                IEEE_STATUS_MASK | IEEE_MAP_MASK)
+
+#define IEEE_CURRENT_RM_SHIFT  32
+#define IEEE_CURRENT_RM_MASK   (3UL<<IEEE_CURRENT_RM_SHIFT)
+
+#define IEEE_STATUS_TO_EXCSUM_SHIFT    16
+
+#define IEEE_INHERIT    (1UL<<63)      /* inherit on thread create? */
+
+/*
+ * Convert the software IEEE trap enable and status bits into the
+ * hardware fpcr format. 
+ *
+ * Digital Unix engineers receive my thanks for not defining the
+ * software bits identical to the hardware bits.  The chip designers
+ * receive my thanks for making all the not-implemented fpcr bits
+ * RAZ forcing us to use system calls to read/write this value.
+ */
+
+static inline unsigned long
+ieee_swcr_to_fpcr(unsigned long sw)
+{
+       unsigned long fp;
+       fp = (sw & IEEE_STATUS_MASK) << 35;
+       fp |= (sw & IEEE_MAP_DMZ) << 36;
+       fp |= (sw & IEEE_STATUS_MASK ? FPCR_SUM : 0);
+       fp |= (~sw & (IEEE_TRAP_ENABLE_INV
+                     | IEEE_TRAP_ENABLE_DZE
+                     | IEEE_TRAP_ENABLE_OVF)) << 48;
+       fp |= (~sw & (IEEE_TRAP_ENABLE_UNF | IEEE_TRAP_ENABLE_INE)) << 57;
+       fp |= (sw & IEEE_MAP_UMZ ? FPCR_UNDZ | FPCR_UNFD : 0);
+       fp |= (~sw & IEEE_TRAP_ENABLE_DNO) << 41;
+       return fp;
+}
+
+static inline unsigned long
+ieee_fpcr_to_swcr(unsigned long fp)
+{
+       unsigned long sw;
+       sw = (fp >> 35) & IEEE_STATUS_MASK;
+       sw |= (fp >> 36) & IEEE_MAP_DMZ;
+       sw |= (~fp >> 48) & (IEEE_TRAP_ENABLE_INV
+                            | IEEE_TRAP_ENABLE_DZE
+                            | IEEE_TRAP_ENABLE_OVF);
+       sw |= (~fp >> 57) & (IEEE_TRAP_ENABLE_UNF | IEEE_TRAP_ENABLE_INE);
+       sw |= (fp >> 47) & IEEE_MAP_UMZ;
+       sw |= (~fp >> 41) & IEEE_TRAP_ENABLE_DNO;
+       return sw;
+}
+
+#ifdef __KERNEL__
+
+/* The following two functions don't need trapb/excb instructions
+   around the mf_fpcr/mt_fpcr instructions because (a) the kernel
+   never generates arithmetic faults and (b) call_pal instructions
+   are implied trap barriers.  */
+
+static inline unsigned long
+rdfpcr(void)
+{
+       unsigned long tmp, ret;
+
+#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
+       __asm__ __volatile__ (
+               "ftoit $f0,%0\n\t"
+               "mf_fpcr $f0\n\t"
+               "ftoit $f0,%1\n\t"
+               "itoft %0,$f0"
+               : "=r"(tmp), "=r"(ret));
+#else
+       __asm__ __volatile__ (
+               "stt $f0,%0\n\t"
+               "mf_fpcr $f0\n\t"
+               "stt $f0,%1\n\t"
+               "ldt $f0,%0"
+               : "=m"(tmp), "=m"(ret));
+#endif
+
+       return ret;
+}
+
+static inline void
+wrfpcr(unsigned long val)
+{
+       unsigned long tmp;
+
+#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
+       __asm__ __volatile__ (
+               "ftoit $f0,%0\n\t"
+               "itoft %1,$f0\n\t"
+               "mt_fpcr $f0\n\t"
+               "itoft %0,$f0"
+               : "=&r"(tmp) : "r"(val));
+#else
+       __asm__ __volatile__ (
+               "stt $f0,%0\n\t"
+               "ldt $f0,%1\n\t"
+               "mt_fpcr $f0\n\t"
+               "ldt $f0,%0"
+               : "=m"(tmp) : "m"(val));
+#endif
+}
+
+static inline unsigned long
+swcr_update_status(unsigned long swcr, unsigned long fpcr)
+{
+       /* EV6 implements most of the bits in hardware.  Collect
+          the acrued exception bits from the real fpcr.  */
+       if (implver() == IMPLVER_EV6) {
+               swcr &= ~IEEE_STATUS_MASK;
+               swcr |= (fpcr >> 35) & IEEE_STATUS_MASK;
+       }
+       return swcr;
+}
+
+extern unsigned long alpha_read_fp_reg (unsigned long reg);
+extern void alpha_write_fp_reg (unsigned long reg, unsigned long val);
+extern unsigned long alpha_read_fp_reg_s (unsigned long reg);
+extern void alpha_write_fp_reg_s (unsigned long reg, unsigned long val);
+
+#endif /* __KERNEL__ */
+
+#endif /* __ASM_ALPHA_FPU_H */
diff --git a/arch/alpha/include/asm/futex.h b/arch/alpha/include/asm/futex.h
new file mode 100644 (file)
index 0000000..6a332a9
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _ASM_FUTEX_H
+#define _ASM_FUTEX_H
+
+#include <asm-generic/futex.h>
+
+#endif
diff --git a/arch/alpha/include/asm/gct.h b/arch/alpha/include/asm/gct.h
new file mode 100644 (file)
index 0000000..3504c70
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef __ALPHA_GCT_H
+#define __ALPHA_GCT_H
+
+typedef u64 gct_id;
+typedef u64 gct6_handle;
+
+typedef struct __gct6_node {
+       u8 type;        
+       u8 subtype;
+       u16 size;
+       u32 hd_extension;
+       gct6_handle owner;
+       gct6_handle active_user;
+       gct_id id;
+       u64 flags;
+       u16 rev;
+       u16 change_counter;
+       u16 max_child;
+       u16 reserved1;
+       gct6_handle saved_owner;
+       gct6_handle affinity;
+       gct6_handle parent;
+       gct6_handle next;
+       gct6_handle prev;
+       gct6_handle child;
+       u64 fw_flags;
+       u64 os_usage;
+       u64 fru_id;
+       u32 checksum;
+       u32 magic;      /* 'GLXY' */
+} gct6_node;
+
+typedef struct {
+       u8 type;        
+       u8 subtype;
+       void (*callout)(gct6_node *);
+} gct6_search_struct;
+
+#define GCT_NODE_MAGIC   0x59584c47    /* 'GLXY' */
+
+/* 
+ * node types 
+ */
+#define GCT_TYPE_HOSE                  0x0E
+
+/*
+ * node subtypes
+ */
+#define GCT_SUBTYPE_IO_PORT_MODULE     0x2C
+
+#define GCT_NODE_PTR(off) ((gct6_node *)((char *)hwrpb +               \
+                                        hwrpb->frut_offset +           \
+                                        (gct6_handle)(off)))           \
+
+int gct6_find_nodes(gct6_node *, gct6_search_struct *);
+
+#endif /* __ALPHA_GCT_H */
+
diff --git a/arch/alpha/include/asm/gentrap.h b/arch/alpha/include/asm/gentrap.h
new file mode 100644 (file)
index 0000000..ae50cc3
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef _ASMAXP_GENTRAP_H
+#define _ASMAXP_GENTRAP_H
+
+/*
+ * Definitions for gentrap causes.  They are generated by user-level
+ * programs and therefore should be compatible with the corresponding
+ * OSF/1 definitions.
+ */
+#define GEN_INTOVF     -1      /* integer overflow */
+#define GEN_INTDIV     -2      /* integer division by zero */
+#define GEN_FLTOVF     -3      /* fp overflow */
+#define GEN_FLTDIV     -4      /* fp division by zero */
+#define GEN_FLTUND     -5      /* fp underflow */
+#define GEN_FLTINV     -6      /* invalid fp operand */
+#define GEN_FLTINE     -7      /* inexact fp operand */
+#define GEN_DECOVF     -8      /* decimal overflow (for COBOL??) */
+#define GEN_DECDIV     -9      /* decimal division by zero */
+#define GEN_DECINV     -10     /* invalid decimal operand */
+#define GEN_ROPRAND    -11     /* reserved operand */
+#define GEN_ASSERTERR  -12     /* assertion error */
+#define GEN_NULPTRERR  -13     /* null pointer error */
+#define GEN_STKOVF     -14     /* stack overflow */
+#define GEN_STRLENERR  -15     /* string length error */
+#define GEN_SUBSTRERR  -16     /* substring error */
+#define GEN_RANGERR    -17     /* range error */
+#define GEN_SUBRNG     -18
+#define GEN_SUBRNG1    -19      
+#define GEN_SUBRNG2    -20
+#define GEN_SUBRNG3    -21     /* these report range errors for */
+#define GEN_SUBRNG4    -22     /* subscripting (indexing) at levels 0..7 */
+#define GEN_SUBRNG5    -23
+#define GEN_SUBRNG6    -24
+#define GEN_SUBRNG7    -25
+
+/* the remaining codes (-26..-1023) are reserved. */
+
+#endif /* _ASMAXP_GENTRAP_H */
diff --git a/arch/alpha/include/asm/hardirq.h b/arch/alpha/include/asm/hardirq.h
new file mode 100644 (file)
index 0000000..d953e23
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef _ALPHA_HARDIRQ_H
+#define _ALPHA_HARDIRQ_H
+
+#include <linux/threads.h>
+#include <linux/cache.h>
+
+
+/* entry.S is sensitive to the offsets of these fields */
+typedef struct {
+       unsigned long __softirq_pending;
+} ____cacheline_aligned irq_cpustat_t;
+
+#include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
+
+void ack_bad_irq(unsigned int irq);
+
+#define HARDIRQ_BITS   12
+
+/*
+ * The hardirq mask has to be large enough to have
+ * space for potentially nestable IRQ sources in the system
+ * to nest on a single CPU. On Alpha, interrupts are masked at the CPU
+ * by IPL as well as at the system level. We only have 8 IPLs (UNIX PALcode)
+ * so we really only have 8 nestable IRQs, but allow some overhead
+ */
+#if (1 << HARDIRQ_BITS) < 16
+#error HARDIRQ_BITS is too low!
+#endif
+
+#endif /* _ALPHA_HARDIRQ_H */
diff --git a/arch/alpha/include/asm/hw_irq.h b/arch/alpha/include/asm/hw_irq.h
new file mode 100644 (file)
index 0000000..a37db0f
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef _ALPHA_HW_IRQ_H
+#define _ALPHA_HW_IRQ_H
+
+
+extern volatile unsigned long irq_err_count;
+
+#ifdef CONFIG_ALPHA_GENERIC
+#define ACTUAL_NR_IRQS alpha_mv.nr_irqs
+#else
+#define ACTUAL_NR_IRQS NR_IRQS
+#endif
+
+#endif
diff --git a/arch/alpha/include/asm/hwrpb.h b/arch/alpha/include/asm/hwrpb.h
new file mode 100644 (file)
index 0000000..8e8f871
--- /dev/null
@@ -0,0 +1,220 @@
+#ifndef __ALPHA_HWRPB_H
+#define __ALPHA_HWRPB_H
+
+#define INIT_HWRPB ((struct hwrpb_struct *) 0x10000000)
+
+/*
+ * DEC processor types for Alpha systems.  Found in HWRPB.
+ * These values are architected.
+ */
+
+#define EV3_CPU                 1       /* EV3                  */
+#define EV4_CPU                 2       /* EV4 (21064)          */
+#define LCA4_CPU                4       /* LCA4 (21066/21068)   */
+#define EV5_CPU                 5       /* EV5 (21164)          */
+#define EV45_CPU                6       /* EV4.5 (21064/xxx)    */
+#define EV56_CPU               7       /* EV5.6 (21164)        */
+#define EV6_CPU                        8       /* EV6 (21264)          */
+#define PCA56_CPU              9       /* PCA56 (21164PC)      */
+#define PCA57_CPU              10      /* PCA57 (notyet)       */
+#define EV67_CPU               11      /* EV67 (21264A)        */
+#define EV68CB_CPU             12      /* EV68CB (21264C)      */
+#define EV68AL_CPU             13      /* EV68AL (21264B)      */
+#define EV68CX_CPU             14      /* EV68CX (21264D)      */
+#define EV7_CPU                        15      /* EV7 (21364)          */
+#define EV79_CPU               16      /* EV79 (21364??)       */
+#define EV69_CPU               17      /* EV69 (21264/EV69A)   */
+
+/*
+ * DEC system types for Alpha systems.  Found in HWRPB.
+ * These values are architected.
+ */
+
+#define ST_ADU                   1     /* Alpha ADU systype    */
+#define ST_DEC_4000              2     /* Cobra systype        */
+#define ST_DEC_7000              3     /* Ruby systype         */
+#define ST_DEC_3000_500                  4     /* Flamingo systype     */
+#define ST_DEC_2000_300                  6     /* Jensen systype       */
+#define ST_DEC_3000_300                  7     /* Pelican systype      */
+#define ST_DEC_2100_A500         9     /* Sable systype        */
+#define ST_DEC_AXPVME_64        10     /* AXPvme system type   */
+#define ST_DEC_AXPPCI_33        11     /* NoName system type   */
+#define ST_DEC_TLASER           12     /* Turbolaser systype   */
+#define ST_DEC_2100_A50                 13     /* Avanti systype       */
+#define ST_DEC_MUSTANG          14     /* Mustang systype      */
+#define ST_DEC_ALCOR            15     /* Alcor (EV5) systype  */
+#define ST_DEC_1000             17     /* Mikasa systype       */
+#define ST_DEC_EB64             18     /* EB64 systype         */
+#define ST_DEC_EB66             19     /* EB66 systype         */
+#define ST_DEC_EB64P            20     /* EB64+ systype        */
+#define ST_DEC_BURNS            21     /* laptop systype       */
+#define ST_DEC_RAWHIDE          22     /* Rawhide systype      */
+#define ST_DEC_K2               23     /* K2 systype           */
+#define ST_DEC_LYNX             24     /* Lynx systype         */
+#define ST_DEC_XL               25     /* Alpha XL systype     */
+#define ST_DEC_EB164            26     /* EB164 systype        */
+#define ST_DEC_NORITAKE                 27     /* Noritake systype     */
+#define ST_DEC_CORTEX           28     /* Cortex systype       */
+#define ST_DEC_MIATA            30     /* Miata systype        */
+#define ST_DEC_XXM              31     /* XXM systype          */
+#define ST_DEC_TAKARA           32     /* Takara systype       */
+#define ST_DEC_YUKON            33     /* Yukon systype        */
+#define ST_DEC_TSUNAMI          34     /* Tsunami systype      */
+#define ST_DEC_WILDFIRE                 35     /* Wildfire systype     */
+#define ST_DEC_CUSCO            36     /* CUSCO systype        */
+#define ST_DEC_EIGER            37     /* Eiger systype        */
+#define ST_DEC_TITAN            38     /* Titan systype        */
+#define ST_DEC_MARVEL           39     /* Marvel systype       */
+
+/* UNOFFICIAL!!! */
+#define ST_UNOFFICIAL_BIAS     100
+#define ST_DTI_RUFFIAN         101     /* RUFFIAN systype      */
+
+/* Alpha Processor, Inc. systems */
+#define ST_API_BIAS            200
+#define ST_API_NAUTILUS                201     /* UP1000 systype       */
+
+struct pcb_struct {
+       unsigned long ksp;
+       unsigned long usp;
+       unsigned long ptbr;
+       unsigned int pcc;
+       unsigned int asn;
+       unsigned long unique;
+       unsigned long flags;
+       unsigned long res1, res2;
+};
+
+struct percpu_struct {
+       unsigned long hwpcb[16];
+       unsigned long flags;
+       unsigned long pal_mem_size;
+       unsigned long pal_scratch_size;
+       unsigned long pal_mem_pa;
+       unsigned long pal_scratch_pa;
+       unsigned long pal_revision;
+       unsigned long type;
+       unsigned long variation;
+       unsigned long revision;
+       unsigned long serial_no[2];
+       unsigned long logout_area_pa;
+       unsigned long logout_area_len;
+       unsigned long halt_PCBB;
+       unsigned long halt_PC;
+       unsigned long halt_PS;
+       unsigned long halt_arg;
+       unsigned long halt_ra;
+       unsigned long halt_pv;
+       unsigned long halt_reason;
+       unsigned long res;
+       unsigned long ipc_buffer[21];
+       unsigned long palcode_avail[16];
+       unsigned long compatibility;
+       unsigned long console_data_log_pa;
+       unsigned long console_data_log_length;
+       unsigned long bcache_info;
+};
+
+struct procdesc_struct {
+       unsigned long weird_vms_stuff;
+       unsigned long address;
+};
+
+struct vf_map_struct {
+       unsigned long va;
+       unsigned long pa;
+       unsigned long count;
+};
+
+struct crb_struct {
+       struct procdesc_struct * dispatch_va;
+       struct procdesc_struct * dispatch_pa;
+       struct procdesc_struct * fixup_va;
+       struct procdesc_struct * fixup_pa;
+       /* virtual->physical map */
+       unsigned long map_entries;
+       unsigned long map_pages;
+       struct vf_map_struct map[1];
+};
+
+struct memclust_struct {
+       unsigned long start_pfn;
+       unsigned long numpages;
+       unsigned long numtested;
+       unsigned long bitmap_va;
+       unsigned long bitmap_pa;
+       unsigned long bitmap_chksum;
+       unsigned long usage;
+};
+
+struct memdesc_struct {
+       unsigned long chksum;
+       unsigned long optional_pa;
+       unsigned long numclusters;
+       struct memclust_struct cluster[0];
+};
+
+struct dsr_struct {
+       long smm;                       /* SMM nubber used by LMF       */
+       unsigned long  lurt_off;        /* offset to LURT table         */
+       unsigned long  sysname_off;     /* offset to sysname char count */
+};
+
+struct hwrpb_struct {
+       unsigned long phys_addr;        /* check: physical address of the hwrpb */
+       unsigned long id;               /* check: "HWRPB\0\0\0" */
+       unsigned long revision; 
+       unsigned long size;             /* size of hwrpb */
+       unsigned long cpuid;
+       unsigned long pagesize;         /* 8192, I hope */
+       unsigned long pa_bits;          /* number of physical address bits */
+       unsigned long max_asn;
+       unsigned char ssn[16];          /* system serial number: big bother is watching */
+       unsigned long sys_type;
+       unsigned long sys_variation;
+       unsigned long sys_revision;
+       unsigned long intr_freq;        /* interval clock frequency * 4096 */
+       unsigned long cycle_freq;       /* cycle counter frequency */
+       unsigned long vptb;             /* Virtual Page Table Base address */
+       unsigned long res1;
+       unsigned long tbhb_offset;      /* Translation Buffer Hint Block */
+       unsigned long nr_processors;
+       unsigned long processor_size;
+       unsigned long processor_offset;
+       unsigned long ctb_nr;
+       unsigned long ctb_size;         /* console terminal block size */
+       unsigned long ctbt_offset;      /* console terminal block table offset */
+       unsigned long crb_offset;       /* console callback routine block */
+       unsigned long mddt_offset;      /* memory data descriptor table */
+       unsigned long cdb_offset;       /* configuration data block (or NULL) */
+       unsigned long frut_offset;      /* FRU table (or NULL) */
+       void (*save_terminal)(unsigned long);
+       unsigned long save_terminal_data;
+       void (*restore_terminal)(unsigned long);
+       unsigned long restore_terminal_data;
+       void (*CPU_restart)(unsigned long);
+       unsigned long CPU_restart_data;
+       unsigned long res2;
+       unsigned long res3;
+       unsigned long chksum;
+       unsigned long rxrdy;
+       unsigned long txrdy;
+       unsigned long dsr_offset;       /* "Dynamic System Recognition Data Block Table" */
+};
+
+#ifdef __KERNEL__
+
+extern struct hwrpb_struct *hwrpb;
+
+static inline void
+hwrpb_update_checksum(struct hwrpb_struct *h)
+{
+       unsigned long sum = 0, *l;
+        for (l = (unsigned long *) h; l < (unsigned long *) &h->chksum; ++l)
+                sum += *l;
+        h->chksum = sum;
+}
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_HWRPB_H */
diff --git a/arch/alpha/include/asm/io.h b/arch/alpha/include/asm/io.h
new file mode 100644 (file)
index 0000000..e971ab0
--- /dev/null
@@ -0,0 +1,577 @@
+#ifndef __ALPHA_IO_H
+#define __ALPHA_IO_H
+
+#ifdef __KERNEL__
+
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <asm/compiler.h>
+#include <asm/system.h>
+#include <asm/pgtable.h>
+#include <asm/machvec.h>
+#include <asm/hwrpb.h>
+
+/* The generic header contains only prototypes.  Including it ensures that
+   the implementation we have here matches that interface.  */
+#include <asm-generic/iomap.h>
+
+/* We don't use IO slowdowns on the Alpha, but.. */
+#define __SLOW_DOWN_IO do { } while (0)
+#define SLOW_DOWN_IO   do { } while (0)
+
+/*
+ * Virtual -> physical identity mapping starts at this offset
+ */
+#ifdef USE_48_BIT_KSEG
+#define IDENT_ADDR     0xffff800000000000UL
+#else
+#define IDENT_ADDR     0xfffffc0000000000UL
+#endif
+
+/*
+ * We try to avoid hae updates (thus the cache), but when we
+ * do need to update the hae, we need to do it atomically, so
+ * that any interrupts wouldn't get confused with the hae
+ * register not being up-to-date with respect to the hardware
+ * value.
+ */
+extern inline void __set_hae(unsigned long new_hae)
+{
+       unsigned long flags;
+       local_irq_save(flags);
+
+       alpha_mv.hae_cache = new_hae;
+       *alpha_mv.hae_register = new_hae;
+       mb();
+       /* Re-read to make sure it was written.  */
+       new_hae = *alpha_mv.hae_register;
+
+       local_irq_restore(flags);
+}
+
+extern inline void set_hae(unsigned long new_hae)
+{
+       if (new_hae != alpha_mv.hae_cache)
+               __set_hae(new_hae);
+}
+
+/*
+ * Change virtual addresses to physical addresses and vv.
+ */
+#ifdef USE_48_BIT_KSEG
+static inline unsigned long virt_to_phys(void *address)
+{
+       return (unsigned long)address - IDENT_ADDR;
+}
+
+static inline void * phys_to_virt(unsigned long address)
+{
+       return (void *) (address + IDENT_ADDR);
+}
+#else
+static inline unsigned long virt_to_phys(void *address)
+{
+        unsigned long phys = (unsigned long)address;
+
+       /* Sign-extend from bit 41.  */
+       phys <<= (64 - 41);
+       phys = (long)phys >> (64 - 41);
+
+       /* Crop to the physical address width of the processor.  */
+        phys &= (1ul << hwrpb->pa_bits) - 1;
+
+        return phys;
+}
+
+static inline void * phys_to_virt(unsigned long address)
+{
+        return (void *)(IDENT_ADDR + (address & ((1ul << 41) - 1)));
+}
+#endif
+
+#define page_to_phys(page)     page_to_pa(page)
+
+static inline dma_addr_t __deprecated isa_page_to_bus(struct page *page)
+{
+       return page_to_phys(page);
+}
+
+/* This depends on working iommu.  */
+#define BIO_VMERGE_BOUNDARY    (alpha_mv.mv_pci_tbi ? PAGE_SIZE : 0)
+
+/* Maximum PIO space address supported?  */
+#define IO_SPACE_LIMIT 0xffff
+
+/*
+ * Change addresses as seen by the kernel (virtual) to addresses as
+ * seen by a device (bus), and vice versa.
+ *
+ * Note that this only works for a limited range of kernel addresses,
+ * and very well may not span all memory.  Consider this interface 
+ * deprecated in favour of the DMA-mapping API.
+ */
+extern unsigned long __direct_map_base;
+extern unsigned long __direct_map_size;
+
+static inline unsigned long __deprecated virt_to_bus(void *address)
+{
+       unsigned long phys = virt_to_phys(address);
+       unsigned long bus = phys + __direct_map_base;
+       return phys <= __direct_map_size ? bus : 0;
+}
+#define isa_virt_to_bus virt_to_bus
+
+static inline void * __deprecated bus_to_virt(unsigned long address)
+{
+       void *virt;
+
+       /* This check is a sanity check but also ensures that bus address 0
+          maps to virtual address 0 which is useful to detect null pointers
+          (the NCR driver is much simpler if NULL pointers are preserved).  */
+       address -= __direct_map_base;
+       virt = phys_to_virt(address);
+       return (long)address <= 0 ? NULL : virt;
+}
+#define isa_bus_to_virt bus_to_virt
+
+/*
+ * There are different chipsets to interface the Alpha CPUs to the world.
+ */
+
+#define IO_CONCAT(a,b) _IO_CONCAT(a,b)
+#define _IO_CONCAT(a,b)        a ## _ ## b
+
+#ifdef CONFIG_ALPHA_GENERIC
+
+/* In a generic kernel, we always go through the machine vector.  */
+
+#define REMAP1(TYPE, NAME, QUAL)                                       \
+static inline TYPE generic_##NAME(QUAL void __iomem *addr)             \
+{                                                                      \
+       return alpha_mv.mv_##NAME(addr);                                \
+}
+
+#define REMAP2(TYPE, NAME, QUAL)                                       \
+static inline void generic_##NAME(TYPE b, QUAL void __iomem *addr)     \
+{                                                                      \
+       alpha_mv.mv_##NAME(b, addr);                                    \
+}
+
+REMAP1(unsigned int, ioread8, /**/)
+REMAP1(unsigned int, ioread16, /**/)
+REMAP1(unsigned int, ioread32, /**/)
+REMAP1(u8, readb, const volatile)
+REMAP1(u16, readw, const volatile)
+REMAP1(u32, readl, const volatile)
+REMAP1(u64, readq, const volatile)
+
+REMAP2(u8, iowrite8, /**/)
+REMAP2(u16, iowrite16, /**/)
+REMAP2(u32, iowrite32, /**/)
+REMAP2(u8, writeb, volatile)
+REMAP2(u16, writew, volatile)
+REMAP2(u32, writel, volatile)
+REMAP2(u64, writeq, volatile)
+
+#undef REMAP1
+#undef REMAP2
+
+extern inline void __iomem *generic_ioportmap(unsigned long a)
+{
+       return alpha_mv.mv_ioportmap(a);
+}
+
+static inline void __iomem *generic_ioremap(unsigned long a, unsigned long s)
+{
+       return alpha_mv.mv_ioremap(a, s);
+}
+
+static inline void generic_iounmap(volatile void __iomem *a)
+{
+       return alpha_mv.mv_iounmap(a);
+}
+
+static inline int generic_is_ioaddr(unsigned long a)
+{
+       return alpha_mv.mv_is_ioaddr(a);
+}
+
+static inline int generic_is_mmio(const volatile void __iomem *a)
+{
+       return alpha_mv.mv_is_mmio(a);
+}
+
+#define __IO_PREFIX            generic
+#define generic_trivial_rw_bw  0
+#define generic_trivial_rw_lq  0
+#define generic_trivial_io_bw  0
+#define generic_trivial_io_lq  0
+#define generic_trivial_iounmap        0
+
+#else
+
+#if defined(CONFIG_ALPHA_APECS)
+# include <asm/core_apecs.h>
+#elif defined(CONFIG_ALPHA_CIA)
+# include <asm/core_cia.h>
+#elif defined(CONFIG_ALPHA_IRONGATE)
+# include <asm/core_irongate.h>
+#elif defined(CONFIG_ALPHA_JENSEN)
+# include <asm/jensen.h>
+#elif defined(CONFIG_ALPHA_LCA)
+# include <asm/core_lca.h>
+#elif defined(CONFIG_ALPHA_MARVEL)
+# include <asm/core_marvel.h>
+#elif defined(CONFIG_ALPHA_MCPCIA)
+# include <asm/core_mcpcia.h>
+#elif defined(CONFIG_ALPHA_POLARIS)
+# include <asm/core_polaris.h>
+#elif defined(CONFIG_ALPHA_T2)
+# include <asm/core_t2.h>
+#elif defined(CONFIG_ALPHA_TSUNAMI)
+# include <asm/core_tsunami.h>
+#elif defined(CONFIG_ALPHA_TITAN)
+# include <asm/core_titan.h>
+#elif defined(CONFIG_ALPHA_WILDFIRE)
+# include <asm/core_wildfire.h>
+#else
+#error "What system is this?"
+#endif
+
+#endif /* GENERIC */
+
+/*
+ * We always have external versions of these routines.
+ */
+extern u8              inb(unsigned long port);
+extern u16             inw(unsigned long port);
+extern u32             inl(unsigned long port);
+extern void            outb(u8 b, unsigned long port);
+extern void            outw(u16 b, unsigned long port);
+extern void            outl(u32 b, unsigned long port);
+
+extern u8              readb(const volatile void __iomem *addr);
+extern u16             readw(const volatile void __iomem *addr);
+extern u32             readl(const volatile void __iomem *addr);
+extern u64             readq(const volatile void __iomem *addr);
+extern void            writeb(u8 b, volatile void __iomem *addr);
+extern void            writew(u16 b, volatile void __iomem *addr);
+extern void            writel(u32 b, volatile void __iomem *addr);
+extern void            writeq(u64 b, volatile void __iomem *addr);
+
+extern u8              __raw_readb(const volatile void __iomem *addr);
+extern u16             __raw_readw(const volatile void __iomem *addr);
+extern u32             __raw_readl(const volatile void __iomem *addr);
+extern u64             __raw_readq(const volatile void __iomem *addr);
+extern void            __raw_writeb(u8 b, volatile void __iomem *addr);
+extern void            __raw_writew(u16 b, volatile void __iomem *addr);
+extern void            __raw_writel(u32 b, volatile void __iomem *addr);
+extern void            __raw_writeq(u64 b, volatile void __iomem *addr);
+
+/*
+ * Mapping from port numbers to __iomem space is pretty easy.
+ */
+
+/* These two have to be extern inline because of the extern prototype from
+   <asm-generic/iomap.h>.  It is not legal to mix "extern" and "static" for
+   the same declaration.  */
+extern inline void __iomem *ioport_map(unsigned long port, unsigned int size)
+{
+       return IO_CONCAT(__IO_PREFIX,ioportmap) (port);
+}
+
+extern inline void ioport_unmap(void __iomem *addr)
+{
+}
+
+static inline void __iomem *ioremap(unsigned long port, unsigned long size)
+{
+       return IO_CONCAT(__IO_PREFIX,ioremap) (port, size);
+}
+
+static inline void __iomem *__ioremap(unsigned long port, unsigned long size,
+                                     unsigned long flags)
+{
+       return ioremap(port, size);
+}
+
+static inline void __iomem * ioremap_nocache(unsigned long offset,
+                                            unsigned long size)
+{
+       return ioremap(offset, size);
+} 
+
+static inline void iounmap(volatile void __iomem *addr)
+{
+       IO_CONCAT(__IO_PREFIX,iounmap)(addr);
+}
+
+static inline int __is_ioaddr(unsigned long addr)
+{
+       return IO_CONCAT(__IO_PREFIX,is_ioaddr)(addr);
+}
+#define __is_ioaddr(a)         __is_ioaddr((unsigned long)(a))
+
+static inline int __is_mmio(const volatile void __iomem *addr)
+{
+       return IO_CONCAT(__IO_PREFIX,is_mmio)(addr);
+}
+
+
+/*
+ * If the actual I/O bits are sufficiently trivial, then expand inline.
+ */
+
+#if IO_CONCAT(__IO_PREFIX,trivial_io_bw)
+extern inline unsigned int ioread8(void __iomem *addr)
+{
+       unsigned int ret = IO_CONCAT(__IO_PREFIX,ioread8)(addr);
+       mb();
+       return ret;
+}
+
+extern inline unsigned int ioread16(void __iomem *addr)
+{
+       unsigned int ret = IO_CONCAT(__IO_PREFIX,ioread16)(addr);
+       mb();
+       return ret;
+}
+
+extern inline void iowrite8(u8 b, void __iomem *addr)
+{
+       IO_CONCAT(__IO_PREFIX,iowrite8)(b, addr);
+       mb();
+}
+
+extern inline void iowrite16(u16 b, void __iomem *addr)
+{
+       IO_CONCAT(__IO_PREFIX,iowrite16)(b, addr);
+       mb();
+}
+
+extern inline u8 inb(unsigned long port)
+{
+       return ioread8(ioport_map(port, 1));
+}
+
+extern inline u16 inw(unsigned long port)
+{
+       return ioread16(ioport_map(port, 2));
+}
+
+extern inline void outb(u8 b, unsigned long port)
+{
+       iowrite8(b, ioport_map(port, 1));
+}
+
+extern inline void outw(u16 b, unsigned long port)
+{
+       iowrite16(b, ioport_map(port, 2));
+}
+#endif
+
+#if IO_CONCAT(__IO_PREFIX,trivial_io_lq)
+extern inline unsigned int ioread32(void __iomem *addr)
+{
+       unsigned int ret = IO_CONCAT(__IO_PREFIX,ioread32)(addr);
+       mb();
+       return ret;
+}
+
+extern inline void iowrite32(u32 b, void __iomem *addr)
+{
+       IO_CONCAT(__IO_PREFIX,iowrite32)(b, addr);
+       mb();
+}
+
+extern inline u32 inl(unsigned long port)
+{
+       return ioread32(ioport_map(port, 4));
+}
+
+extern inline void outl(u32 b, unsigned long port)
+{
+       iowrite32(b, ioport_map(port, 4));
+}
+#endif
+
+#if IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 1
+extern inline u8 __raw_readb(const volatile void __iomem *addr)
+{
+       return IO_CONCAT(__IO_PREFIX,readb)(addr);
+}
+
+extern inline u16 __raw_readw(const volatile void __iomem *addr)
+{
+       return IO_CONCAT(__IO_PREFIX,readw)(addr);
+}
+
+extern inline void __raw_writeb(u8 b, volatile void __iomem *addr)
+{
+       IO_CONCAT(__IO_PREFIX,writeb)(b, addr);
+}
+
+extern inline void __raw_writew(u16 b, volatile void __iomem *addr)
+{
+       IO_CONCAT(__IO_PREFIX,writew)(b, addr);
+}
+
+extern inline u8 readb(const volatile void __iomem *addr)
+{
+       u8 ret = __raw_readb(addr);
+       mb();
+       return ret;
+}
+
+extern inline u16 readw(const volatile void __iomem *addr)
+{
+       u16 ret = __raw_readw(addr);
+       mb();
+       return ret;
+}
+
+extern inline void writeb(u8 b, volatile void __iomem *addr)
+{
+       __raw_writeb(b, addr);
+       mb();
+}
+
+extern inline void writew(u16 b, volatile void __iomem *addr)
+{
+       __raw_writew(b, addr);
+       mb();
+}
+#endif
+
+#if IO_CONCAT(__IO_PREFIX,trivial_rw_lq) == 1
+extern inline u32 __raw_readl(const volatile void __iomem *addr)
+{
+       return IO_CONCAT(__IO_PREFIX,readl)(addr);
+}
+
+extern inline u64 __raw_readq(const volatile void __iomem *addr)
+{
+       return IO_CONCAT(__IO_PREFIX,readq)(addr);
+}
+
+extern inline void __raw_writel(u32 b, volatile void __iomem *addr)
+{
+       IO_CONCAT(__IO_PREFIX,writel)(b, addr);
+}
+
+extern inline void __raw_writeq(u64 b, volatile void __iomem *addr)
+{
+       IO_CONCAT(__IO_PREFIX,writeq)(b, addr);
+}
+
+extern inline u32 readl(const volatile void __iomem *addr)
+{
+       u32 ret = __raw_readl(addr);
+       mb();
+       return ret;
+}
+
+extern inline u64 readq(const volatile void __iomem *addr)
+{
+       u64 ret = __raw_readq(addr);
+       mb();
+       return ret;
+}
+
+extern inline void writel(u32 b, volatile void __iomem *addr)
+{
+       __raw_writel(b, addr);
+       mb();
+}
+
+extern inline void writeq(u64 b, volatile void __iomem *addr)
+{
+       __raw_writeq(b, addr);
+       mb();
+}
+#endif
+
+#define inb_p          inb
+#define inw_p          inw
+#define inl_p          inl
+#define outb_p         outb
+#define outw_p         outw
+#define outl_p         outl
+#define readb_relaxed(addr) __raw_readb(addr)
+#define readw_relaxed(addr) __raw_readw(addr)
+#define readl_relaxed(addr) __raw_readl(addr)
+#define readq_relaxed(addr) __raw_readq(addr)
+
+#define mmiowb()
+
+/*
+ * String version of IO memory access ops:
+ */
+extern void memcpy_fromio(void *, const volatile void __iomem *, long);
+extern void memcpy_toio(volatile void __iomem *, const void *, long);
+extern void _memset_c_io(volatile void __iomem *, unsigned long, long);
+
+static inline void memset_io(volatile void __iomem *addr, u8 c, long len)
+{
+       _memset_c_io(addr, 0x0101010101010101UL * c, len);
+}
+
+#define __HAVE_ARCH_MEMSETW_IO
+static inline void memsetw_io(volatile void __iomem *addr, u16 c, long len)
+{
+       _memset_c_io(addr, 0x0001000100010001UL * c, len);
+}
+
+/*
+ * String versions of in/out ops:
+ */
+extern void insb (unsigned long port, void *dst, unsigned long count);
+extern void insw (unsigned long port, void *dst, unsigned long count);
+extern void insl (unsigned long port, void *dst, unsigned long count);
+extern void outsb (unsigned long port, const void *src, unsigned long count);
+extern void outsw (unsigned long port, const void *src, unsigned long count);
+extern void outsl (unsigned long port, const void *src, unsigned long count);
+
+/*
+ * The Alpha Jensen hardware for some rather strange reason puts
+ * the RTC clock at 0x170 instead of 0x70. Probably due to some
+ * misguided idea about using 0x70 for NMI stuff.
+ *
+ * These defines will override the defaults when doing RTC queries
+ */
+
+#ifdef CONFIG_ALPHA_GENERIC
+# define RTC_PORT(x)   ((x) + alpha_mv.rtc_port)
+#else
+# ifdef CONFIG_ALPHA_JENSEN
+#  define RTC_PORT(x)  (0x170+(x))
+# else
+#  define RTC_PORT(x)  (0x70 + (x))
+# endif
+#endif
+#define RTC_ALWAYS_BCD 0
+
+/*
+ * Some mucking forons use if[n]def writeq to check if platform has it.
+ * It's a bloody bad idea and we probably want ARCH_HAS_WRITEQ for them
+ * to play with; for now just use cpp anti-recursion logics and make sure
+ * that damn thing is defined and expands to itself.
+ */
+
+#define writeq writeq
+#define readq readq
+
+/*
+ * Convert a physical pointer to a virtual kernel pointer for /dev/mem
+ * access
+ */
+#define xlate_dev_mem_ptr(p)   __va(p)
+
+/*
+ * Convert a virtual cached pointer to an uncached pointer
+ */
+#define xlate_dev_kmem_ptr(p)  p
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_IO_H */
diff --git a/arch/alpha/include/asm/io_trivial.h b/arch/alpha/include/asm/io_trivial.h
new file mode 100644 (file)
index 0000000..1c77f10
--- /dev/null
@@ -0,0 +1,131 @@
+/* Trivial implementations of basic i/o routines.  Assumes that all
+   of the hard work has been done by ioremap and ioportmap, and that
+   access to i/o space is linear.  */
+
+/* This file may be included multiple times.  */
+
+#if IO_CONCAT(__IO_PREFIX,trivial_io_bw)
+__EXTERN_INLINE unsigned int
+IO_CONCAT(__IO_PREFIX,ioread8)(void __iomem *a)
+{
+       return __kernel_ldbu(*(volatile u8 __force *)a);
+}
+
+__EXTERN_INLINE unsigned int
+IO_CONCAT(__IO_PREFIX,ioread16)(void __iomem *a)
+{
+       return __kernel_ldwu(*(volatile u16 __force *)a);
+}
+
+__EXTERN_INLINE void
+IO_CONCAT(__IO_PREFIX,iowrite8)(u8 b, void __iomem *a)
+{
+       __kernel_stb(b, *(volatile u8 __force *)a);
+}
+
+__EXTERN_INLINE void
+IO_CONCAT(__IO_PREFIX,iowrite16)(u16 b, void __iomem *a)
+{
+       __kernel_stw(b, *(volatile u16 __force *)a);
+}
+#endif
+
+#if IO_CONCAT(__IO_PREFIX,trivial_io_lq)
+__EXTERN_INLINE unsigned int
+IO_CONCAT(__IO_PREFIX,ioread32)(void __iomem *a)
+{
+       return *(volatile u32 __force *)a;
+}
+
+__EXTERN_INLINE void
+IO_CONCAT(__IO_PREFIX,iowrite32)(u32 b, void __iomem *a)
+{
+       *(volatile u32 __force *)a = b;
+}
+#endif
+
+#if IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 1
+__EXTERN_INLINE u8
+IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a)
+{
+       return __kernel_ldbu(*(const volatile u8 __force *)a);
+}
+
+__EXTERN_INLINE u16
+IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a)
+{
+       return __kernel_ldwu(*(const volatile u16 __force *)a);
+}
+
+__EXTERN_INLINE void
+IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a)
+{
+       __kernel_stb(b, *(volatile u8 __force *)a);
+}
+
+__EXTERN_INLINE void
+IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a)
+{
+       __kernel_stw(b, *(volatile u16 __force *)a);
+}
+#elif IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 2
+__EXTERN_INLINE u8
+IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a)
+{
+       void __iomem *addr = (void __iomem *)a;
+       return IO_CONCAT(__IO_PREFIX,ioread8)(addr);
+}
+
+__EXTERN_INLINE u16
+IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a)
+{
+       void __iomem *addr = (void __iomem *)a;
+       return IO_CONCAT(__IO_PREFIX,ioread16)(addr);
+}
+
+__EXTERN_INLINE void
+IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a)
+{
+       void __iomem *addr = (void __iomem *)a;
+       IO_CONCAT(__IO_PREFIX,iowrite8)(b, addr);
+}
+
+__EXTERN_INLINE void
+IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a)
+{
+       void __iomem *addr = (void __iomem *)a;
+       IO_CONCAT(__IO_PREFIX,iowrite16)(b, addr);
+}
+#endif
+
+#if IO_CONCAT(__IO_PREFIX,trivial_rw_lq) == 1
+__EXTERN_INLINE u32
+IO_CONCAT(__IO_PREFIX,readl)(const volatile void __iomem *a)
+{
+       return *(const volatile u32 __force *)a;
+}
+
+__EXTERN_INLINE u64
+IO_CONCAT(__IO_PREFIX,readq)(const volatile void __iomem *a)
+{
+       return *(const volatile u64 __force *)a;
+}
+
+__EXTERN_INLINE void
+IO_CONCAT(__IO_PREFIX,writel)(u32 b, volatile void __iomem *a)
+{
+       *(volatile u32 __force *)a = b;
+}
+
+__EXTERN_INLINE void
+IO_CONCAT(__IO_PREFIX,writeq)(u64 b, volatile void __iomem *a)
+{
+       *(volatile u64 __force *)a = b;
+}
+#endif
+
+#if IO_CONCAT(__IO_PREFIX,trivial_iounmap)
+__EXTERN_INLINE void IO_CONCAT(__IO_PREFIX,iounmap)(volatile void __iomem *a)
+{
+}
+#endif
diff --git a/arch/alpha/include/asm/ioctl.h b/arch/alpha/include/asm/ioctl.h
new file mode 100644 (file)
index 0000000..fc63727
--- /dev/null
@@ -0,0 +1,66 @@
+#ifndef _ALPHA_IOCTL_H
+#define _ALPHA_IOCTL_H
+
+/*
+ * The original linux ioctl numbering scheme was just a general
+ * "anything goes" setup, where more or less random numbers were
+ * assigned.  Sorry, I was clueless when I started out on this.
+ *
+ * On the alpha, we'll try to clean it up a bit, using a more sane
+ * ioctl numbering, and also trying to be compatible with OSF/1 in
+ * the process. I'd like to clean it up for the i386 as well, but
+ * it's so painful recognizing both the new and the old numbers..
+ */
+
+#define _IOC_NRBITS    8
+#define _IOC_TYPEBITS  8
+#define _IOC_SIZEBITS  13
+#define _IOC_DIRBITS   3
+
+#define _IOC_NRMASK    ((1 << _IOC_NRBITS)-1)
+#define _IOC_TYPEMASK  ((1 << _IOC_TYPEBITS)-1)
+#define _IOC_SIZEMASK  ((1 << _IOC_SIZEBITS)-1)
+#define _IOC_DIRMASK   ((1 << _IOC_DIRBITS)-1)
+
+#define _IOC_NRSHIFT   0
+#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
+#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
+#define _IOC_DIRSHIFT  (_IOC_SIZESHIFT+_IOC_SIZEBITS)
+
+/*
+ * Direction bits _IOC_NONE could be 0, but OSF/1 gives it a bit.
+ * And this turns out useful to catch old ioctl numbers in header
+ * files for us.
+ */
+#define _IOC_NONE      1U
+#define _IOC_READ      2U
+#define _IOC_WRITE     4U
+
+#define _IOC(dir,type,nr,size)                 \
+       ((unsigned int)                         \
+        (((dir)  << _IOC_DIRSHIFT) |           \
+         ((type) << _IOC_TYPESHIFT) |          \
+         ((nr)   << _IOC_NRSHIFT) |            \
+         ((size) << _IOC_SIZESHIFT)))
+
+/* used to create numbers */
+#define _IO(type,nr)           _IOC(_IOC_NONE,(type),(nr),0)
+#define _IOR(type,nr,size)     _IOC(_IOC_READ,(type),(nr),sizeof(size))
+#define _IOW(type,nr,size)     _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
+#define _IOWR(type,nr,size)    _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
+
+/* used to decode them.. */
+#define _IOC_DIR(nr)           (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
+#define _IOC_TYPE(nr)          (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
+#define _IOC_NR(nr)            (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
+#define _IOC_SIZE(nr)          (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
+
+/* ...and for the drivers/sound files... */
+
+#define IOC_IN         (_IOC_WRITE << _IOC_DIRSHIFT)
+#define IOC_OUT                (_IOC_READ << _IOC_DIRSHIFT)
+#define IOC_INOUT      ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
+#define IOCSIZE_MASK   (_IOC_SIZEMASK << _IOC_SIZESHIFT)
+#define IOCSIZE_SHIFT  (_IOC_SIZESHIFT)
+
+#endif /* _ALPHA_IOCTL_H */
diff --git a/arch/alpha/include/asm/ioctls.h b/arch/alpha/include/asm/ioctls.h
new file mode 100644 (file)
index 0000000..67bb9f6
--- /dev/null
@@ -0,0 +1,112 @@
+#ifndef _ASM_ALPHA_IOCTLS_H
+#define _ASM_ALPHA_IOCTLS_H
+
+#include <asm/ioctl.h>
+
+#define FIOCLEX                _IO('f', 1)
+#define FIONCLEX       _IO('f', 2)
+#define FIOASYNC       _IOW('f', 125, int)
+#define FIONBIO                _IOW('f', 126, int)
+#define FIONREAD       _IOR('f', 127, int)
+#define TIOCINQ                FIONREAD
+#define FIOQSIZE       _IOR('f', 128, loff_t)
+
+#define TIOCGETP       _IOR('t', 8, struct sgttyb)
+#define TIOCSETP       _IOW('t', 9, struct sgttyb)
+#define TIOCSETN       _IOW('t', 10, struct sgttyb)    /* TIOCSETP wo flush */
+
+#define TIOCSETC       _IOW('t', 17, struct tchars)
+#define TIOCGETC       _IOR('t', 18, struct tchars)
+#define TCGETS         _IOR('t', 19, struct termios)
+#define TCSETS         _IOW('t', 20, struct termios)
+#define TCSETSW                _IOW('t', 21, struct termios)
+#define TCSETSF                _IOW('t', 22, struct termios)
+
+#define TCGETA         _IOR('t', 23, struct termio)
+#define TCSETA         _IOW('t', 24, struct termio)
+#define TCSETAW                _IOW('t', 25, struct termio)
+#define TCSETAF                _IOW('t', 28, struct termio)
+
+#define TCSBRK         _IO('t', 29)
+#define TCXONC         _IO('t', 30)
+#define TCFLSH         _IO('t', 31)
+
+#define TIOCSWINSZ     _IOW('t', 103, struct winsize)
+#define TIOCGWINSZ     _IOR('t', 104, struct winsize)
+#define        TIOCSTART       _IO('t', 110)           /* start output, like ^Q */
+#define        TIOCSTOP        _IO('t', 111)           /* stop output, like ^S */
+#define TIOCOUTQ        _IOR('t', 115, int)     /* output queue size */
+
+#define TIOCGLTC       _IOR('t', 116, struct ltchars)
+#define TIOCSLTC       _IOW('t', 117, struct ltchars)
+#define TIOCSPGRP      _IOW('t', 118, int)
+#define TIOCGPGRP      _IOR('t', 119, int)
+
+#define TIOCEXCL       0x540C
+#define TIOCNXCL       0x540D
+#define TIOCSCTTY      0x540E
+
+#define TIOCSTI                0x5412
+#define TIOCMGET       0x5415
+#define TIOCMBIS       0x5416
+#define TIOCMBIC       0x5417
+#define TIOCMSET       0x5418
+# define TIOCM_LE      0x001
+# define TIOCM_DTR     0x002
+# define TIOCM_RTS     0x004
+# define TIOCM_ST      0x008
+# define TIOCM_SR      0x010
+# define TIOCM_CTS     0x020
+# define TIOCM_CAR     0x040
+# define TIOCM_RNG     0x080
+# define TIOCM_DSR     0x100
+# define TIOCM_CD      TIOCM_CAR
+# define TIOCM_RI      TIOCM_RNG
+# define TIOCM_OUT1    0x2000
+# define TIOCM_OUT2    0x4000
+# define TIOCM_LOOP    0x8000
+
+#define TIOCGSOFTCAR   0x5419
+#define TIOCSSOFTCAR   0x541A
+#define TIOCLINUX      0x541C
+#define TIOCCONS       0x541D
+#define TIOCGSERIAL    0x541E
+#define TIOCSSERIAL    0x541F
+#define TIOCPKT                0x5420
+# define TIOCPKT_DATA           0
+# define TIOCPKT_FLUSHREAD      1
+# define TIOCPKT_FLUSHWRITE     2
+# define TIOCPKT_STOP           4
+# define TIOCPKT_START          8
+# define TIOCPKT_NOSTOP                16
+# define TIOCPKT_DOSTOP                32
+
+
+#define TIOCNOTTY      0x5422
+#define TIOCSETD       0x5423
+#define TIOCGETD       0x5424
+#define TCSBRKP                0x5425  /* Needed for POSIX tcsendbreak() */
+#define TIOCSBRK       0x5427  /* BSD compatibility */
+#define TIOCCBRK       0x5428  /* BSD compatibility */
+#define TIOCGSID       0x5429  /* Return the session ID of FD */
+#define TIOCGPTN       _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
+#define TIOCSPTLCK     _IOW('T',0x31, int)  /* Lock/unlock Pty */
+
+#define TIOCSERCONFIG  0x5453
+#define TIOCSERGWILD   0x5454
+#define TIOCSERSWILD   0x5455
+#define TIOCGLCKTRMIOS 0x5456
+#define TIOCSLCKTRMIOS 0x5457
+#define TIOCSERGSTRUCT 0x5458 /* For debugging only */
+#define TIOCSERGETLSR   0x5459 /* Get line status register */
+  /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
+# define TIOCSER_TEMT    0x01  /* Transmitter physically empty */
+#define TIOCSERGETMULTI 0x545A /* Get multiport config  */
+#define TIOCSERSETMULTI 0x545B /* Set multiport config */
+
+#define TIOCMIWAIT     0x545C  /* wait for a change on serial input line(s) */
+#define TIOCGICOUNT    0x545D  /* read serial port inline interrupt counts */
+#define TIOCGHAYESESP  0x545E  /* Get Hayes ESP configuration */
+#define TIOCSHAYESESP  0x545F  /* Set Hayes ESP configuration */
+
+#endif /* _ASM_ALPHA_IOCTLS_H */
diff --git a/arch/alpha/include/asm/ipcbuf.h b/arch/alpha/include/asm/ipcbuf.h
new file mode 100644 (file)
index 0000000..d9c0e1a
--- /dev/null
@@ -0,0 +1,28 @@
+#ifndef _ALPHA_IPCBUF_H
+#define _ALPHA_IPCBUF_H
+
+/* 
+ * The ipc64_perm structure for alpha architecture.
+ * Note extra padding because this structure is passed back and forth
+ * between kernel and user space.
+ *
+ * Pad space is left for:
+ * - 32-bit seq
+ * - 2 miscellaneous 64-bit values
+ */
+
+struct ipc64_perm
+{
+       __kernel_key_t  key;
+       __kernel_uid_t  uid;
+       __kernel_gid_t  gid;
+       __kernel_uid_t  cuid;
+       __kernel_gid_t  cgid;
+       __kernel_mode_t mode; 
+       unsigned short  seq;
+       unsigned short  __pad1;
+       unsigned long   __unused1;
+       unsigned long   __unused2;
+};
+
+#endif /* _ALPHA_IPCBUF_H */
diff --git a/arch/alpha/include/asm/irq.h b/arch/alpha/include/asm/irq.h
new file mode 100644 (file)
index 0000000..0637740
--- /dev/null
@@ -0,0 +1,91 @@
+#ifndef _ALPHA_IRQ_H
+#define _ALPHA_IRQ_H
+
+/*
+ *     linux/include/alpha/irq.h
+ *
+ *     (C) 1994 Linus Torvalds
+ */
+
+#include <linux/linkage.h>
+
+#if   defined(CONFIG_ALPHA_GENERIC)
+
+/* Here NR_IRQS is not exact, but rather an upper bound.  This is used
+   many places throughout the kernel to size static arrays.  That's ok,
+   we'll use alpha_mv.nr_irqs when we want the real thing.  */
+
+/* When LEGACY_START_ADDRESS is selected, we leave out:
+     TITAN
+     WILDFIRE
+     MARVEL
+
+   This helps keep the kernel object size reasonable for the majority
+   of machines.
+*/
+
+# if defined(CONFIG_ALPHA_LEGACY_START_ADDRESS)
+#  define NR_IRQS      (128)           /* max is RAWHIDE/TAKARA */
+# else
+#  define NR_IRQS      (32768 + 16)    /* marvel - 32 pids */
+# endif
+
+#elif defined(CONFIG_ALPHA_CABRIOLET) || \
+      defined(CONFIG_ALPHA_EB66P)     || \
+      defined(CONFIG_ALPHA_EB164)     || \
+      defined(CONFIG_ALPHA_PC164)     || \
+      defined(CONFIG_ALPHA_LX164)
+# define NR_IRQS       35
+
+#elif defined(CONFIG_ALPHA_EB66)      || \
+      defined(CONFIG_ALPHA_EB64P)     || \
+      defined(CONFIG_ALPHA_MIKASA)
+# define NR_IRQS       32
+
+#elif defined(CONFIG_ALPHA_ALCOR)     || \
+      defined(CONFIG_ALPHA_MIATA)     || \
+      defined(CONFIG_ALPHA_RUFFIAN)   || \
+      defined(CONFIG_ALPHA_RX164)     || \
+      defined(CONFIG_ALPHA_NORITAKE)
+# define NR_IRQS       48
+
+#elif defined(CONFIG_ALPHA_SABLE)     || \
+      defined(CONFIG_ALPHA_SX164)
+# define NR_IRQS       40
+
+#elif defined(CONFIG_ALPHA_DP264) || \
+      defined(CONFIG_ALPHA_LYNX)  || \
+      defined(CONFIG_ALPHA_SHARK) || \
+      defined(CONFIG_ALPHA_EIGER)
+# define NR_IRQS       64
+
+#elif defined(CONFIG_ALPHA_TITAN)
+#define NR_IRQS                80
+
+#elif defined(CONFIG_ALPHA_RAWHIDE) || \
+       defined(CONFIG_ALPHA_TAKARA)
+# define NR_IRQS       128
+
+#elif defined(CONFIG_ALPHA_WILDFIRE)
+# define NR_IRQS       2048 /* enuff for 8 QBBs */
+
+#elif defined(CONFIG_ALPHA_MARVEL)
+# define NR_IRQS       (32768 + 16)    /* marvel - 32 pids*/
+
+#else /* everyone else */
+# define NR_IRQS       16
+#endif
+
+static __inline__ int irq_canonicalize(int irq)
+{
+       /*
+        * XXX is this true for all Alpha's?  The old serial driver
+        * did it this way for years without any complaints, so....
+        */
+       return ((irq == 2) ? 9 : irq);
+}
+
+struct pt_regs;
+extern void (*perf_irq)(unsigned long, struct pt_regs *);
+
+#endif /* _ALPHA_IRQ_H */
diff --git a/arch/alpha/include/asm/irq_regs.h b/arch/alpha/include/asm/irq_regs.h
new file mode 100644 (file)
index 0000000..3dd9c0b
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/irq_regs.h>
diff --git a/arch/alpha/include/asm/jensen.h b/arch/alpha/include/asm/jensen.h
new file mode 100644 (file)
index 0000000..964b06e
--- /dev/null
@@ -0,0 +1,346 @@
+#ifndef __ALPHA_JENSEN_H
+#define __ALPHA_JENSEN_H
+
+#include <asm/compiler.h>
+
+/*
+ * Defines for the AlphaPC EISA IO and memory address space.
+ */
+
+/*
+ * NOTE! The memory operations do not set any memory barriers, as it's
+ * not needed for cases like a frame buffer that is essentially memory-like.
+ * You need to do them by hand if the operations depend on ordering.
+ *
+ * Similarly, the port IO operations do a "mb" only after a write operation:
+ * if an mb is needed before (as in the case of doing memory mapped IO
+ * first, and then a port IO operation to the same device), it needs to be
+ * done by hand.
+ *
+ * After the above has bitten me 100 times, I'll give up and just do the
+ * mb all the time, but right now I'm hoping this will work out.  Avoiding
+ * mb's may potentially be a noticeable speed improvement, but I can't
+ * honestly say I've tested it.
+ *
+ * Handling interrupts that need to do mb's to synchronize to non-interrupts
+ * is another fun race area.  Don't do it (because if you do, I'll have to
+ * do *everything* with interrupts disabled, ugh).
+ */
+
+/*
+ * EISA Interrupt Acknowledge address
+ */
+#define EISA_INTA              (IDENT_ADDR + 0x100000000UL)
+
+/*
+ * FEPROM addresses
+ */
+#define EISA_FEPROM0           (IDENT_ADDR + 0x180000000UL)
+#define EISA_FEPROM1           (IDENT_ADDR + 0x1A0000000UL)
+
+/*
+ * VL82C106 base address
+ */
+#define EISA_VL82C106          (IDENT_ADDR + 0x1C0000000UL)
+
+/*
+ * EISA "Host Address Extension" address (bits 25-31 of the EISA address)
+ */
+#define EISA_HAE               (IDENT_ADDR + 0x1D0000000UL)
+
+/*
+ * "SYSCTL" register address
+ */
+#define EISA_SYSCTL            (IDENT_ADDR + 0x1E0000000UL)
+
+/*
+ * "spare" register address
+ */
+#define EISA_SPARE             (IDENT_ADDR + 0x1F0000000UL)
+
+/*
+ * EISA memory address offset
+ */
+#define EISA_MEM               (IDENT_ADDR + 0x200000000UL)
+
+/*
+ * EISA IO address offset
+ */
+#define EISA_IO                        (IDENT_ADDR + 0x300000000UL)
+
+
+#ifdef __KERNEL__
+
+#ifndef __EXTERN_INLINE
+#define __EXTERN_INLINE extern inline
+#define __IO_EXTERN_INLINE
+#endif
+
+/*
+ * Handle the "host address register". This needs to be set
+ * to the high 7 bits of the EISA address.  This is also needed
+ * for EISA IO addresses, which are only 16 bits wide (the
+ * hae needs to be set to 0).
+ *
+ * HAE isn't needed for the local IO operations, though.
+ */
+
+#define JENSEN_HAE_ADDRESS     EISA_HAE
+#define JENSEN_HAE_MASK                0x1ffffff
+
+__EXTERN_INLINE void jensen_set_hae(unsigned long addr)
+{
+       /* hae on the Jensen is bits 31:25 shifted right */
+       addr >>= 25;
+       if (addr != alpha_mv.hae_cache)
+               set_hae(addr);
+}
+
+#define vuip   volatile unsigned int *
+
+/*
+ * IO functions
+ *
+ * The "local" functions are those that don't go out to the EISA bus,
+ * but instead act on the VL82C106 chip directly.. This is mainly the
+ * keyboard, RTC,  printer and first two serial lines..
+ *
+ * The local stuff makes for some complications, but it seems to be
+ * gone in the PCI version. I hope I can get DEC suckered^H^H^H^H^H^H^H^H
+ * convinced that I need one of the newer machines.
+ */
+
+static inline unsigned int jensen_local_inb(unsigned long addr)
+{
+       return 0xff & *(vuip)((addr << 9) + EISA_VL82C106);
+}
+
+static inline void jensen_local_outb(u8 b, unsigned long addr)
+{
+       *(vuip)((addr << 9) + EISA_VL82C106) = b;
+       mb();
+}
+
+static inline unsigned int jensen_bus_inb(unsigned long addr)
+{
+       long result;
+
+       jensen_set_hae(0);
+       result = *(volatile int *)((addr << 7) + EISA_IO + 0x00);
+       return __kernel_extbl(result, addr & 3);
+}
+
+static inline void jensen_bus_outb(u8 b, unsigned long addr)
+{
+       jensen_set_hae(0);
+       *(vuip)((addr << 7) + EISA_IO + 0x00) = b * 0x01010101;
+       mb();
+}
+
+/*
+ * It seems gcc is not very good at optimizing away logical
+ * operations that result in operations across inline functions.
+ * Which is why this is a macro.
+ */
+
+#define jensen_is_local(addr) ( \
+/* keyboard */ (addr == 0x60 || addr == 0x64) || \
+/* RTC */      (addr == 0x170 || addr == 0x171) || \
+/* mb COM2 */  (addr >= 0x2f8 && addr <= 0x2ff) || \
+/* mb LPT1 */  (addr >= 0x3bc && addr <= 0x3be) || \
+/* mb COM2 */  (addr >= 0x3f8 && addr <= 0x3ff))
+
+__EXTERN_INLINE u8 jensen_inb(unsigned long addr)
+{
+       if (jensen_is_local(addr))
+               return jensen_local_inb(addr);
+       else
+               return jensen_bus_inb(addr);
+}
+
+__EXTERN_INLINE void jensen_outb(u8 b, unsigned long addr)
+{
+       if (jensen_is_local(addr))
+               jensen_local_outb(b, addr);
+       else
+               jensen_bus_outb(b, addr);
+}
+
+__EXTERN_INLINE u16 jensen_inw(unsigned long addr)
+{
+       long result;
+
+       jensen_set_hae(0);
+       result = *(volatile int *) ((addr << 7) + EISA_IO + 0x20);
+       result >>= (addr & 3) * 8;
+       return 0xffffUL & result;
+}
+
+__EXTERN_INLINE u32 jensen_inl(unsigned long addr)
+{
+       jensen_set_hae(0);
+       return *(vuip) ((addr << 7) + EISA_IO + 0x60);
+}
+
+__EXTERN_INLINE void jensen_outw(u16 b, unsigned long addr)
+{
+       jensen_set_hae(0);
+       *(vuip) ((addr << 7) + EISA_IO + 0x20) = b * 0x00010001;
+       mb();
+}
+
+__EXTERN_INLINE void jensen_outl(u32 b, unsigned long addr)
+{
+       jensen_set_hae(0);
+       *(vuip) ((addr << 7) + EISA_IO + 0x60) = b;
+       mb();
+}
+
+/*
+ * Memory functions.
+ */
+
+__EXTERN_INLINE u8 jensen_readb(const volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       long result;
+
+       jensen_set_hae(addr);
+       addr &= JENSEN_HAE_MASK;
+       result = *(volatile int *) ((addr << 7) + EISA_MEM + 0x00);
+       result >>= (addr & 3) * 8;
+       return 0xffUL & result;
+}
+
+__EXTERN_INLINE u16 jensen_readw(const volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       long result;
+
+       jensen_set_hae(addr);
+       addr &= JENSEN_HAE_MASK;
+       result = *(volatile int *) ((addr << 7) + EISA_MEM + 0x20);
+       result >>= (addr & 3) * 8;
+       return 0xffffUL & result;
+}
+
+__EXTERN_INLINE u32 jensen_readl(const volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       jensen_set_hae(addr);
+       addr &= JENSEN_HAE_MASK;
+       return *(vuip) ((addr << 7) + EISA_MEM + 0x60);
+}
+
+__EXTERN_INLINE u64 jensen_readq(const volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       unsigned long r0, r1;
+
+       jensen_set_hae(addr);
+       addr &= JENSEN_HAE_MASK;
+       addr = (addr << 7) + EISA_MEM + 0x60;
+       r0 = *(vuip) (addr);
+       r1 = *(vuip) (addr + (4 << 7));
+       return r1 << 32 | r0;
+}
+
+__EXTERN_INLINE void jensen_writeb(u8 b, volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       jensen_set_hae(addr);
+       addr &= JENSEN_HAE_MASK;
+       *(vuip) ((addr << 7) + EISA_MEM + 0x00) = b * 0x01010101;
+}
+
+__EXTERN_INLINE void jensen_writew(u16 b, volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       jensen_set_hae(addr);
+       addr &= JENSEN_HAE_MASK;
+       *(vuip) ((addr << 7) + EISA_MEM + 0x20) = b * 0x00010001;
+}
+
+__EXTERN_INLINE void jensen_writel(u32 b, volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       jensen_set_hae(addr);
+       addr &= JENSEN_HAE_MASK;
+       *(vuip) ((addr << 7) + EISA_MEM + 0x60) = b;
+}
+
+__EXTERN_INLINE void jensen_writeq(u64 b, volatile void __iomem *xaddr)
+{
+       unsigned long addr = (unsigned long) xaddr;
+       jensen_set_hae(addr);
+       addr &= JENSEN_HAE_MASK;
+       addr = (addr << 7) + EISA_MEM + 0x60;
+       *(vuip) (addr) = b;
+       *(vuip) (addr + (4 << 7)) = b >> 32;
+}
+
+__EXTERN_INLINE void __iomem *jensen_ioportmap(unsigned long addr)
+{
+       return (void __iomem *)addr;
+}
+
+__EXTERN_INLINE void __iomem *jensen_ioremap(unsigned long addr,
+                                            unsigned long size)
+{
+       return (void __iomem *)(addr + 0x100000000ul);
+}
+
+__EXTERN_INLINE int jensen_is_ioaddr(unsigned long addr)
+{
+       return (long)addr >= 0;
+}
+
+__EXTERN_INLINE int jensen_is_mmio(const volatile void __iomem *addr)
+{
+       return (unsigned long)addr >= 0x100000000ul;
+}
+
+/* New-style ioread interface.  All the routines are so ugly for Jensen
+   that it doesn't make sense to merge them.  */
+
+#define IOPORT(OS, NS)                                                 \
+__EXTERN_INLINE unsigned int jensen_ioread##NS(void __iomem *xaddr)    \
+{                                                                      \
+       if (jensen_is_mmio(xaddr))                                      \
+               return jensen_read##OS(xaddr - 0x100000000ul);          \
+       else                                                            \
+               return jensen_in##OS((unsigned long)xaddr);             \
+}                                                                      \
+__EXTERN_INLINE void jensen_iowrite##NS(u##NS b, void __iomem *xaddr)  \
+{                                                                      \
+       if (jensen_is_mmio(xaddr))                                      \
+               jensen_write##OS(b, xaddr - 0x100000000ul);             \
+       else                                                            \
+               jensen_out##OS(b, (unsigned long)xaddr);                \
+}
+
+IOPORT(b, 8)
+IOPORT(w, 16)
+IOPORT(l, 32)
+
+#undef IOPORT
+
+#undef vuip
+
+#undef __IO_PREFIX
+#define __IO_PREFIX            jensen
+#define jensen_trivial_rw_bw   0
+#define jensen_trivial_rw_lq   0
+#define jensen_trivial_io_bw   0
+#define jensen_trivial_io_lq   0
+#define jensen_trivial_iounmap 1
+#include <asm/io_trivial.h>
+
+#ifdef __IO_EXTERN_INLINE
+#undef __EXTERN_INLINE
+#undef __IO_EXTERN_INLINE
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_JENSEN_H */
diff --git a/arch/alpha/include/asm/kdebug.h b/arch/alpha/include/asm/kdebug.h
new file mode 100644 (file)
index 0000000..6ece1b0
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/kdebug.h>
diff --git a/arch/alpha/include/asm/kmap_types.h b/arch/alpha/include/asm/kmap_types.h
new file mode 100644 (file)
index 0000000..3e6735a
--- /dev/null
@@ -0,0 +1,32 @@
+#ifndef _ASM_KMAP_TYPES_H
+#define _ASM_KMAP_TYPES_H
+
+/* Dummy header just to define km_type. */
+
+
+#ifdef CONFIG_DEBUG_HIGHMEM
+# define D(n) __KM_FENCE_##n ,
+#else
+# define D(n)
+#endif
+
+enum km_type {
+D(0)   KM_BOUNCE_READ,
+D(1)   KM_SKB_SUNRPC_DATA,
+D(2)   KM_SKB_DATA_SOFTIRQ,
+D(3)   KM_USER0,
+D(4)   KM_USER1,
+D(5)   KM_BIO_SRC_IRQ,
+D(6)   KM_BIO_DST_IRQ,
+D(7)   KM_PTE0,
+D(8)   KM_PTE1,
+D(9)   KM_IRQ0,
+D(10)  KM_IRQ1,
+D(11)  KM_SOFTIRQ0,
+D(12)  KM_SOFTIRQ1,
+D(13)  KM_TYPE_NR
+};
+
+#undef D
+
+#endif
diff --git a/arch/alpha/include/asm/linkage.h b/arch/alpha/include/asm/linkage.h
new file mode 100644 (file)
index 0000000..291c2d0
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __ASM_LINKAGE_H
+#define __ASM_LINKAGE_H
+
+/* Nothing to see here... */
+
+#endif
diff --git a/arch/alpha/include/asm/local.h b/arch/alpha/include/asm/local.h
new file mode 100644 (file)
index 0000000..6ad3ea6
--- /dev/null
@@ -0,0 +1,118 @@
+#ifndef _ALPHA_LOCAL_H
+#define _ALPHA_LOCAL_H
+
+#include <linux/percpu.h>
+#include <asm/atomic.h>
+
+typedef struct
+{
+       atomic_long_t a;
+} local_t;
+
+#define LOCAL_INIT(i)  { ATOMIC_LONG_INIT(i) }
+#define local_read(l)  atomic_long_read(&(l)->a)
+#define local_set(l,i) atomic_long_set(&(l)->a, (i))
+#define local_inc(l)   atomic_long_inc(&(l)->a)
+#define local_dec(l)   atomic_long_dec(&(l)->a)
+#define local_add(i,l) atomic_long_add((i),(&(l)->a))
+#define local_sub(i,l) atomic_long_sub((i),(&(l)->a))
+
+static __inline__ long local_add_return(long i, local_t * l)
+{
+       long temp, result;
+       __asm__ __volatile__(
+       "1:     ldq_l %0,%1\n"
+       "       addq %0,%3,%2\n"
+       "       addq %0,%3,%0\n"
+       "       stq_c %0,%1\n"
+       "       beq %0,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (l->a.counter), "=&r" (result)
+       :"Ir" (i), "m" (l->a.counter) : "memory");
+       return result;
+}
+
+static __inline__ long local_sub_return(long i, local_t * l)
+{
+       long temp, result;
+       __asm__ __volatile__(
+       "1:     ldq_l %0,%1\n"
+       "       subq %0,%3,%2\n"
+       "       subq %0,%3,%0\n"
+       "       stq_c %0,%1\n"
+       "       beq %0,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (l->a.counter), "=&r" (result)
+       :"Ir" (i), "m" (l->a.counter) : "memory");
+       return result;
+}
+
+#define local_cmpxchg(l, o, n) \
+       (cmpxchg_local(&((l)->a.counter), (o), (n)))
+#define local_xchg(l, n) (xchg_local(&((l)->a.counter), (n)))
+
+/**
+ * local_add_unless - add unless the number is a given value
+ * @l: pointer of type local_t
+ * @a: the amount to add to l...
+ * @u: ...unless l is equal to u.
+ *
+ * Atomically adds @a to @l, so long as it was not @u.
+ * Returns non-zero if @l was not @u, and zero otherwise.
+ */
+#define local_add_unless(l, a, u)                              \
+({                                                             \
+       long c, old;                                            \
+       c = local_read(l);                                      \
+       for (;;) {                                              \
+               if (unlikely(c == (u)))                         \
+                       break;                                  \
+               old = local_cmpxchg((l), c, c + (a));   \
+               if (likely(old == c))                           \
+                       break;                                  \
+               c = old;                                        \
+       }                                                       \
+       c != (u);                                               \
+})
+#define local_inc_not_zero(l) local_add_unless((l), 1, 0)
+
+#define local_add_negative(a, l) (local_add_return((a), (l)) < 0)
+
+#define local_dec_return(l) local_sub_return(1,(l))
+
+#define local_inc_return(l) local_add_return(1,(l))
+
+#define local_sub_and_test(i,l) (local_sub_return((i), (l)) == 0)
+
+#define local_inc_and_test(l) (local_add_return(1, (l)) == 0)
+
+#define local_dec_and_test(l) (local_sub_return(1, (l)) == 0)
+
+/* Verify if faster than atomic ops */
+#define __local_inc(l)         ((l)->a.counter++)
+#define __local_dec(l)         ((l)->a.counter++)
+#define __local_add(i,l)       ((l)->a.counter+=(i))
+#define __local_sub(i,l)       ((l)->a.counter-=(i))
+
+/* Use these for per-cpu local_t variables: on some archs they are
+ * much more efficient than these naive implementations.  Note they take
+ * a variable, not an address.
+ */
+#define cpu_local_read(l)      local_read(&__get_cpu_var(l))
+#define cpu_local_set(l, i)    local_set(&__get_cpu_var(l), (i))
+
+#define cpu_local_inc(l)       local_inc(&__get_cpu_var(l))
+#define cpu_local_dec(l)       local_dec(&__get_cpu_var(l))
+#define cpu_local_add(i, l)    local_add((i), &__get_cpu_var(l))
+#define cpu_local_sub(i, l)    local_sub((i), &__get_cpu_var(l))
+
+#define __cpu_local_inc(l)     __local_inc(&__get_cpu_var(l))
+#define __cpu_local_dec(l)     __local_dec(&__get_cpu_var(l))
+#define __cpu_local_add(i, l)  __local_add((i), &__get_cpu_var(l))
+#define __cpu_local_sub(i, l)  __local_sub((i), &__get_cpu_var(l))
+
+#endif /* _ALPHA_LOCAL_H */
diff --git a/arch/alpha/include/asm/machvec.h b/arch/alpha/include/asm/machvec.h
new file mode 100644 (file)
index 0000000..a86c083
--- /dev/null
@@ -0,0 +1,134 @@
+#ifndef __ALPHA_MACHVEC_H
+#define __ALPHA_MACHVEC_H 1
+
+#include <linux/types.h>
+
+/*
+ *     This file gets pulled in by asm/io.h from user space. We don't
+ *     want most of this escaping.
+ */
+#ifdef __KERNEL__
+
+/* The following structure vectors all of the I/O and IRQ manipulation
+   from the generic kernel to the hardware specific backend.  */
+
+struct task_struct;
+struct mm_struct;
+struct vm_area_struct;
+struct linux_hose_info;
+struct pci_dev;
+struct pci_ops;
+struct pci_controller;
+struct _alpha_agp_info;
+
+struct alpha_machine_vector
+{
+       /* This "belongs" down below with the rest of the runtime
+          variables, but it is convenient for entry.S if these 
+          two slots are at the beginning of the struct.  */
+       unsigned long hae_cache;
+       unsigned long *hae_register;
+
+       int nr_irqs;
+       int rtc_port;
+       unsigned int max_asn;
+       unsigned long max_isa_dma_address;
+       unsigned long irq_probe_mask;
+       unsigned long iack_sc;
+       unsigned long min_io_address;
+       unsigned long min_mem_address;
+       unsigned long pci_dac_offset;
+
+       void (*mv_pci_tbi)(struct pci_controller *hose,
+                          dma_addr_t start, dma_addr_t end);
+
+       unsigned int (*mv_ioread8)(void __iomem *);
+       unsigned int (*mv_ioread16)(void __iomem *);
+       unsigned int (*mv_ioread32)(void __iomem *);
+
+       void (*mv_iowrite8)(u8, void __iomem *);
+       void (*mv_iowrite16)(u16, void __iomem *);
+       void (*mv_iowrite32)(u32, void __iomem *);
+
+       u8 (*mv_readb)(const volatile void __iomem *);
+       u16 (*mv_readw)(const volatile void __iomem *);
+       u32 (*mv_readl)(const volatile void __iomem *);
+       u64 (*mv_readq)(const volatile void __iomem *);
+
+       void (*mv_writeb)(u8, volatile void __iomem *);
+       void (*mv_writew)(u16, volatile void __iomem *);
+       void (*mv_writel)(u32, volatile void __iomem *);
+       void (*mv_writeq)(u64, volatile void __iomem *);
+
+       void __iomem *(*mv_ioportmap)(unsigned long);
+       void __iomem *(*mv_ioremap)(unsigned long, unsigned long);
+       void (*mv_iounmap)(volatile void __iomem *);
+       int (*mv_is_ioaddr)(unsigned long);
+       int (*mv_is_mmio)(const volatile void __iomem *);
+
+       void (*mv_switch_mm)(struct mm_struct *, struct mm_struct *,
+                            struct task_struct *);
+       void (*mv_activate_mm)(struct mm_struct *, struct mm_struct *);
+
+       void (*mv_flush_tlb_current)(struct mm_struct *);
+       void (*mv_flush_tlb_current_page)(struct mm_struct * mm,
+                                         struct vm_area_struct *vma,
+                                         unsigned long addr);
+
+       void (*update_irq_hw)(unsigned long, unsigned long, int);
+       void (*ack_irq)(unsigned long);
+       void (*device_interrupt)(unsigned long vector);
+       void (*machine_check)(u64 vector, u64 la);
+
+       void (*smp_callin)(void);
+       void (*init_arch)(void);
+       void (*init_irq)(void);
+       void (*init_rtc)(void);
+       void (*init_pci)(void);
+       void (*kill_arch)(int);
+
+       u8 (*pci_swizzle)(struct pci_dev *, u8 *);
+       int (*pci_map_irq)(struct pci_dev *, u8, u8);
+       struct pci_ops *pci_ops;
+
+       struct _alpha_agp_info *(*agp_info)(void);
+
+       const char *vector_name;
+
+       /* NUMA information */
+       int (*pa_to_nid)(unsigned long);
+       int (*cpuid_to_nid)(int);
+       unsigned long (*node_mem_start)(int);
+       unsigned long (*node_mem_size)(int);
+
+       /* System specific parameters.  */
+       union {
+           struct {
+               unsigned long gru_int_req_bits;
+           } cia;
+
+           struct {
+               unsigned long gamma_bias;
+           } t2;
+
+           struct {
+               unsigned int route_tab;
+           } sio;
+       } sys;
+};
+
+extern struct alpha_machine_vector alpha_mv;
+
+#ifdef CONFIG_ALPHA_GENERIC
+extern int alpha_using_srm;
+#else
+#ifdef CONFIG_ALPHA_SRM
+#define alpha_using_srm 1
+#else
+#define alpha_using_srm 0
+#endif
+#endif /* GENERIC */
+
+#endif
+#endif /* __ALPHA_MACHVEC_H */
diff --git a/arch/alpha/include/asm/mc146818rtc.h b/arch/alpha/include/asm/mc146818rtc.h
new file mode 100644 (file)
index 0000000..097703f
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Machine dependent access functions for RTC registers.
+ */
+#ifndef __ASM_ALPHA_MC146818RTC_H
+#define __ASM_ALPHA_MC146818RTC_H
+
+#include <asm/io.h>
+
+#ifndef RTC_PORT
+#define RTC_PORT(x)    (0x70 + (x))
+#define RTC_ALWAYS_BCD 1       /* RTC operates in binary mode */
+#endif
+
+/*
+ * The yet supported machines all access the RTC index register via
+ * an ISA port access but the way to access the date register differs ...
+ */
+#define CMOS_READ(addr) ({ \
+outb_p((addr),RTC_PORT(0)); \
+inb_p(RTC_PORT(1)); \
+})
+#define CMOS_WRITE(val, addr) ({ \
+outb_p((addr),RTC_PORT(0)); \
+outb_p((val),RTC_PORT(1)); \
+})
+
+#endif /* __ASM_ALPHA_MC146818RTC_H */
diff --git a/arch/alpha/include/asm/md.h b/arch/alpha/include/asm/md.h
new file mode 100644 (file)
index 0000000..6c9b822
--- /dev/null
@@ -0,0 +1,13 @@
+/* $Id: md.h,v 1.1 1997/12/15 15:11:48 jj Exp $
+ * md.h: High speed xor_block operation for RAID4/5 
+ *
+ */
+#ifndef __ASM_MD_H
+#define __ASM_MD_H
+
+/* #define HAVE_ARCH_XORBLOCK */
+
+#define MD_XORBLOCK_ALIGNMENT  sizeof(long)
+
+#endif /* __ASM_MD_H */
diff --git a/arch/alpha/include/asm/mman.h b/arch/alpha/include/asm/mman.h
new file mode 100644 (file)
index 0000000..90d7c35
--- /dev/null
@@ -0,0 +1,54 @@
+#ifndef __ALPHA_MMAN_H__
+#define __ALPHA_MMAN_H__
+
+#define PROT_READ      0x1             /* page can be read */
+#define PROT_WRITE     0x2             /* page can be written */
+#define PROT_EXEC      0x4             /* page can be executed */
+#define PROT_SEM       0x8             /* page may be used for atomic ops */
+#define PROT_NONE      0x0             /* page can not be accessed */
+#define PROT_GROWSDOWN 0x01000000      /* mprotect flag: extend change to start of growsdown vma */
+#define PROT_GROWSUP   0x02000000      /* mprotect flag: extend change to end of growsup vma */
+
+#define MAP_SHARED     0x01            /* Share changes */
+#define MAP_PRIVATE    0x02            /* Changes are private */
+#define MAP_TYPE       0x0f            /* Mask for type of mapping (OSF/1 is _wrong_) */
+#define MAP_FIXED      0x100           /* Interpret addr exactly */
+#define MAP_ANONYMOUS  0x10            /* don't use a file */
+
+/* not used by linux, but here to make sure we don't clash with OSF/1 defines */
+#define _MAP_HASSEMAPHORE 0x0200
+#define _MAP_INHERIT   0x0400
+#define _MAP_UNALIGNED 0x0800
+
+/* These are linux-specific */
+#define MAP_GROWSDOWN  0x01000         /* stack-like segment */
+#define MAP_DENYWRITE  0x02000         /* ETXTBSY */
+#define MAP_EXECUTABLE 0x04000         /* mark it as an executable */
+#define MAP_LOCKED     0x08000         /* lock the mapping */
+#define MAP_NORESERVE  0x10000         /* don't check for reservations */
+#define MAP_POPULATE   0x20000         /* populate (prefault) pagetables */
+#define MAP_NONBLOCK   0x40000         /* do not block on IO */
+
+#define MS_ASYNC       1               /* sync memory asynchronously */
+#define MS_SYNC                2               /* synchronous memory sync */
+#define MS_INVALIDATE  4               /* invalidate the caches */
+
+#define MCL_CURRENT     8192           /* lock all currently mapped pages */
+#define MCL_FUTURE     16384           /* lock all additions to address space */
+
+#define MADV_NORMAL    0               /* no further special treatment */
+#define MADV_RANDOM    1               /* expect random page references */
+#define MADV_SEQUENTIAL        2               /* expect sequential page references */
+#define MADV_WILLNEED  3               /* will need these pages */
+#define        MADV_SPACEAVAIL 5               /* ensure resources are available */
+#define MADV_DONTNEED  6               /* don't need these pages */
+
+/* common/generic parameters */
+#define MADV_REMOVE    9               /* remove these pages & resources */
+#define MADV_DONTFORK  10              /* don't inherit across fork */
+#define MADV_DOFORK    11              /* do inherit across fork */
+
+/* compatibility flags */
+#define MAP_FILE       0
+
+#endif /* __ALPHA_MMAN_H__ */
diff --git a/arch/alpha/include/asm/mmu.h b/arch/alpha/include/asm/mmu.h
new file mode 100644 (file)
index 0000000..3dc1277
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef __ALPHA_MMU_H
+#define __ALPHA_MMU_H
+
+/* The alpha MMU context is one "unsigned long" bitmap per CPU */
+typedef unsigned long mm_context_t[NR_CPUS];
+
+#endif
diff --git a/arch/alpha/include/asm/mmu_context.h b/arch/alpha/include/asm/mmu_context.h
new file mode 100644 (file)
index 0000000..86c08a0
--- /dev/null
@@ -0,0 +1,260 @@
+#ifndef __ALPHA_MMU_CONTEXT_H
+#define __ALPHA_MMU_CONTEXT_H
+
+/*
+ * get a new mmu context..
+ *
+ * Copyright (C) 1996, Linus Torvalds
+ */
+
+#include <asm/system.h>
+#include <asm/machvec.h>
+#include <asm/compiler.h>
+#include <asm-generic/mm_hooks.h>
+
+/*
+ * Force a context reload. This is needed when we change the page
+ * table pointer or when we update the ASN of the current process.
+ */
+
+/* Don't get into trouble with dueling __EXTERN_INLINEs.  */
+#ifndef __EXTERN_INLINE
+#include <asm/io.h>
+#endif
+
+
+static inline unsigned long
+__reload_thread(struct pcb_struct *pcb)
+{
+       register unsigned long a0 __asm__("$16");
+       register unsigned long v0 __asm__("$0");
+
+       a0 = virt_to_phys(pcb);
+       __asm__ __volatile__(
+               "call_pal %2 #__reload_thread"
+               : "=r"(v0), "=r"(a0)
+               : "i"(PAL_swpctx), "r"(a0)
+               : "$1", "$22", "$23", "$24", "$25");
+
+       return v0;
+}
+
+
+/*
+ * The maximum ASN's the processor supports.  On the EV4 this is 63
+ * but the PAL-code doesn't actually use this information.  On the
+ * EV5 this is 127, and EV6 has 255.
+ *
+ * On the EV4, the ASNs are more-or-less useless anyway, as they are
+ * only used as an icache tag, not for TB entries.  On the EV5 and EV6,
+ * ASN's also validate the TB entries, and thus make a lot more sense.
+ *
+ * The EV4 ASN's don't even match the architecture manual, ugh.  And
+ * I quote: "If a processor implements address space numbers (ASNs),
+ * and the old PTE has the Address Space Match (ASM) bit clear (ASNs
+ * in use) and the Valid bit set, then entries can also effectively be
+ * made coherent by assigning a new, unused ASN to the currently
+ * running process and not reusing the previous ASN before calling the
+ * appropriate PALcode routine to invalidate the translation buffer (TB)". 
+ *
+ * In short, the EV4 has a "kind of" ASN capability, but it doesn't actually
+ * work correctly and can thus not be used (explaining the lack of PAL-code
+ * support).
+ */
+#define EV4_MAX_ASN 63
+#define EV5_MAX_ASN 127
+#define EV6_MAX_ASN 255
+
+#ifdef CONFIG_ALPHA_GENERIC
+# define MAX_ASN       (alpha_mv.max_asn)
+#else
+# ifdef CONFIG_ALPHA_EV4
+#  define MAX_ASN      EV4_MAX_ASN
+# elif defined(CONFIG_ALPHA_EV5)
+#  define MAX_ASN      EV5_MAX_ASN
+# else
+#  define MAX_ASN      EV6_MAX_ASN
+# endif
+#endif
+
+/*
+ * cpu_last_asn(processor):
+ * 63                                            0
+ * +-------------+----------------+--------------+
+ * | asn version | this processor | hardware asn |
+ * +-------------+----------------+--------------+
+ */
+
+#include <asm/smp.h>
+#ifdef CONFIG_SMP
+#define cpu_last_asn(cpuid)    (cpu_data[cpuid].last_asn)
+#else
+extern unsigned long last_asn;
+#define cpu_last_asn(cpuid)    last_asn
+#endif /* CONFIG_SMP */
+
+#define WIDTH_HARDWARE_ASN     8
+#define ASN_FIRST_VERSION (1UL << WIDTH_HARDWARE_ASN)
+#define HARDWARE_ASN_MASK ((1UL << WIDTH_HARDWARE_ASN) - 1)
+
+/*
+ * NOTE! The way this is set up, the high bits of the "asn_cache" (and
+ * the "mm->context") are the ASN _version_ code. A version of 0 is
+ * always considered invalid, so to invalidate another process you only
+ * need to do "p->mm->context = 0".
+ *
+ * If we need more ASN's than the processor has, we invalidate the old
+ * user TLB's (tbiap()) and start a new ASN version. That will automatically
+ * force a new asn for any other processes the next time they want to
+ * run.
+ */
+
+#ifndef __EXTERN_INLINE
+#define __EXTERN_INLINE extern inline
+#define __MMU_EXTERN_INLINE
+#endif
+
+extern inline unsigned long
+__get_new_mm_context(struct mm_struct *mm, long cpu)
+{
+       unsigned long asn = cpu_last_asn(cpu);
+       unsigned long next = asn + 1;
+
+       if ((asn & HARDWARE_ASN_MASK) >= MAX_ASN) {
+               tbiap();
+               imb();
+               next = (asn & ~HARDWARE_ASN_MASK) + ASN_FIRST_VERSION;
+       }
+       cpu_last_asn(cpu) = next;
+       return next;
+}
+
+__EXTERN_INLINE void
+ev5_switch_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm,
+             struct task_struct *next)
+{
+       /* Check if our ASN is of an older version, and thus invalid. */
+       unsigned long asn;
+       unsigned long mmc;
+       long cpu = smp_processor_id();
+
+#ifdef CONFIG_SMP
+       cpu_data[cpu].asn_lock = 1;
+       barrier();
+#endif
+       asn = cpu_last_asn(cpu);
+       mmc = next_mm->context[cpu];
+       if ((mmc ^ asn) & ~HARDWARE_ASN_MASK) {
+               mmc = __get_new_mm_context(next_mm, cpu);
+               next_mm->context[cpu] = mmc;
+       }
+#ifdef CONFIG_SMP
+       else
+               cpu_data[cpu].need_new_asn = 1;
+#endif
+
+       /* Always update the PCB ASN.  Another thread may have allocated
+          a new mm->context (via flush_tlb_mm) without the ASN serial
+          number wrapping.  We have no way to detect when this is needed.  */
+       task_thread_info(next)->pcb.asn = mmc & HARDWARE_ASN_MASK;
+}
+
+__EXTERN_INLINE void
+ev4_switch_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm,
+             struct task_struct *next)
+{
+       /* As described, ASN's are broken for TLB usage.  But we can
+          optimize for switching between threads -- if the mm is
+          unchanged from current we needn't flush.  */
+       /* ??? May not be needed because EV4 PALcode recognizes that
+          ASN's are broken and does a tbiap itself on swpctx, under
+          the "Must set ASN or flush" rule.  At least this is true
+          for a 1992 SRM, reports Joseph Martin (jmartin@hlo.dec.com).
+          I'm going to leave this here anyway, just to Be Sure.  -- r~  */
+       if (prev_mm != next_mm)
+               tbiap();
+
+       /* Do continue to allocate ASNs, because we can still use them
+          to avoid flushing the icache.  */
+       ev5_switch_mm(prev_mm, next_mm, next);
+}
+
+extern void __load_new_mm_context(struct mm_struct *);
+
+#ifdef CONFIG_SMP
+#define check_mmu_context()                                    \
+do {                                                           \
+       int cpu = smp_processor_id();                           \
+       cpu_data[cpu].asn_lock = 0;                             \
+       barrier();                                              \
+       if (cpu_data[cpu].need_new_asn) {                       \
+               struct mm_struct * mm = current->active_mm;     \
+               cpu_data[cpu].need_new_asn = 0;                 \
+               if (!mm->context[cpu])                  \
+                       __load_new_mm_context(mm);              \
+       }                                                       \
+} while(0)
+#else
+#define check_mmu_context()  do { } while(0)
+#endif
+
+__EXTERN_INLINE void
+ev5_activate_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm)
+{
+       __load_new_mm_context(next_mm);
+}
+
+__EXTERN_INLINE void
+ev4_activate_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm)
+{
+       __load_new_mm_context(next_mm);
+       tbiap();
+}
+
+#define deactivate_mm(tsk,mm)  do { } while (0)
+
+#ifdef CONFIG_ALPHA_GENERIC
+# define switch_mm(a,b,c)      alpha_mv.mv_switch_mm((a),(b),(c))
+# define activate_mm(x,y)      alpha_mv.mv_activate_mm((x),(y))
+#else
+# ifdef CONFIG_ALPHA_EV4
+#  define switch_mm(a,b,c)     ev4_switch_mm((a),(b),(c))
+#  define activate_mm(x,y)     ev4_activate_mm((x),(y))
+# else
+#  define switch_mm(a,b,c)     ev5_switch_mm((a),(b),(c))
+#  define activate_mm(x,y)     ev5_activate_mm((x),(y))
+# endif
+#endif
+
+static inline int
+init_new_context(struct task_struct *tsk, struct mm_struct *mm)
+{
+       int i;
+
+       for_each_online_cpu(i)
+               mm->context[i] = 0;
+       if (tsk != current)
+               task_thread_info(tsk)->pcb.ptbr
+                 = ((unsigned long)mm->pgd - IDENT_ADDR) >> PAGE_SHIFT;
+       return 0;
+}
+
+extern inline void
+destroy_context(struct mm_struct *mm)
+{
+       /* Nothing to do.  */
+}
+
+static inline void
+enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
+{
+       task_thread_info(tsk)->pcb.ptbr
+         = ((unsigned long)mm->pgd - IDENT_ADDR) >> PAGE_SHIFT;
+}
+
+#ifdef __MMU_EXTERN_INLINE
+#undef __EXTERN_INLINE
+#undef __MMU_EXTERN_INLINE
+#endif
+
+#endif /* __ALPHA_MMU_CONTEXT_H */
diff --git a/arch/alpha/include/asm/mmzone.h b/arch/alpha/include/asm/mmzone.h
new file mode 100644 (file)
index 0000000..8af56ce
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Written by Kanoj Sarcar (kanoj@sgi.com) Aug 99
+ * Adapted for the alpha wildfire architecture Jan 2001.
+ */
+#ifndef _ASM_MMZONE_H_
+#define _ASM_MMZONE_H_
+
+#include <asm/smp.h>
+
+struct bootmem_data_t; /* stupid forward decl. */
+
+/*
+ * Following are macros that are specific to this numa platform.
+ */
+
+extern pg_data_t node_data[];
+
+#define alpha_pa_to_nid(pa)            \
+        (alpha_mv.pa_to_nid            \
+        ? alpha_mv.pa_to_nid(pa)       \
+        : (0))
+#define node_mem_start(nid)            \
+        (alpha_mv.node_mem_start       \
+        ? alpha_mv.node_mem_start(nid) \
+        : (0UL))
+#define node_mem_size(nid)             \
+        (alpha_mv.node_mem_size        \
+        ? alpha_mv.node_mem_size(nid)  \
+        : ((nid) ? (0UL) : (~0UL)))
+
+#define pa_to_nid(pa)          alpha_pa_to_nid(pa)
+#define NODE_DATA(nid)         (&node_data[(nid)])
+
+#define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn)
+
+#if 1
+#define PLAT_NODE_DATA_LOCALNR(p, n)   \
+       (((p) >> PAGE_SHIFT) - PLAT_NODE_DATA(n)->gendata.node_start_pfn)
+#else
+static inline unsigned long
+PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
+{
+       unsigned long temp;
+       temp = p >> PAGE_SHIFT;
+       return temp - PLAT_NODE_DATA(n)->gendata.node_start_pfn;
+}
+#endif
+
+#ifdef CONFIG_DISCONTIGMEM
+
+/*
+ * Following are macros that each numa implementation must define.
+ */
+
+/*
+ * Given a kernel address, find the home node of the underlying memory.
+ */
+#define kvaddr_to_nid(kaddr)   pa_to_nid(__pa(kaddr))
+#define node_start_pfn(nid)    (NODE_DATA(nid)->node_start_pfn)
+
+/*
+ * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory
+ * and returns the kaddr corresponding to first physical page in the
+ * node's mem_map.
+ */
+#define LOCAL_BASE_ADDR(kaddr)                                           \
+    ((unsigned long)__va(NODE_DATA(kvaddr_to_nid(kaddr))->node_start_pfn  \
+                        << PAGE_SHIFT))
+
+/* XXX: FIXME -- wli */
+#define kern_addr_valid(kaddr) (0)
+
+#define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
+
+#define VALID_PAGE(page)       (((page) - mem_map) < max_mapnr)
+
+#define pmd_page(pmd)          (pfn_to_page(pmd_val(pmd) >> 32))
+#define pgd_page(pgd)          (pfn_to_page(pgd_val(pgd) >> 32))
+#define pte_pfn(pte)           (pte_val(pte) >> 32)
+
+#define mk_pte(page, pgprot)                                                \
+({                                                                          \
+       pte_t pte;                                                           \
+       unsigned long pfn;                                                   \
+                                                                            \
+       pfn = page_to_pfn(page) << 32; \
+       pte_val(pte) = pfn | pgprot_val(pgprot);                             \
+                                                                            \
+       pte;                                                                 \
+})
+
+#define pte_page(x)                                                    \
+({                                                                     \
+               unsigned long kvirt;                                            \
+       struct page * __xx;                                             \
+                                                                       \
+       kvirt = (unsigned long)__va(pte_val(x) >> (32-PAGE_SHIFT));     \
+       __xx = virt_to_page(kvirt);                                     \
+                                                                       \
+       __xx;                                                           \
+})
+
+#define page_to_pa(page)                                               \
+       (page_to_pfn(page) << PAGE_SHIFT)
+
+#define pfn_to_nid(pfn)                pa_to_nid(((u64)(pfn) << PAGE_SHIFT))
+#define pfn_valid(pfn)                                                 \
+       (((pfn) - node_start_pfn(pfn_to_nid(pfn))) <                    \
+        node_spanned_pages(pfn_to_nid(pfn)))                                   \
+
+#define virt_addr_valid(kaddr) pfn_valid((__pa(kaddr) >> PAGE_SHIFT))
+
+#endif /* CONFIG_DISCONTIGMEM */
+
+#endif /* _ASM_MMZONE_H_ */
diff --git a/arch/alpha/include/asm/module.h b/arch/alpha/include/asm/module.h
new file mode 100644 (file)
index 0000000..7b63743
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef _ALPHA_MODULE_H
+#define _ALPHA_MODULE_H
+
+struct mod_arch_specific
+{
+       unsigned int gotsecindex;
+};
+
+#define Elf_Sym Elf64_Sym
+#define Elf_Shdr Elf64_Shdr
+#define Elf_Ehdr Elf64_Ehdr
+#define Elf_Phdr Elf64_Phdr
+#define Elf_Dyn Elf64_Dyn
+#define Elf_Rel Elf64_Rel
+#define Elf_Rela Elf64_Rela
+
+#define ARCH_SHF_SMALL SHF_ALPHA_GPREL
+
+#ifdef MODULE
+asm(".section .got,\"aws\",@progbits; .align 3; .previous");
+#endif
+
+#endif /*_ALPHA_MODULE_H*/
diff --git a/arch/alpha/include/asm/msgbuf.h b/arch/alpha/include/asm/msgbuf.h
new file mode 100644 (file)
index 0000000..9849650
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef _ALPHA_MSGBUF_H
+#define _ALPHA_MSGBUF_H
+
+/* 
+ * The msqid64_ds structure for alpha architecture.
+ * Note extra padding because this structure is passed back and forth
+ * between kernel and user space.
+ *
+ * Pad space is left for:
+ * - 2 miscellaneous 64-bit values
+ */
+
+struct msqid64_ds {
+       struct ipc64_perm msg_perm;
+       __kernel_time_t msg_stime;      /* last msgsnd time */
+       __kernel_time_t msg_rtime;      /* last msgrcv time */
+       __kernel_time_t msg_ctime;      /* last change time */
+       unsigned long  msg_cbytes;      /* current number of bytes on queue */
+       unsigned long  msg_qnum;        /* number of messages in queue */
+       unsigned long  msg_qbytes;      /* max number of bytes on queue */
+       __kernel_pid_t msg_lspid;       /* pid of last msgsnd */
+       __kernel_pid_t msg_lrpid;       /* last receive pid */
+       unsigned long  __unused1;
+       unsigned long  __unused2;
+};
+
+#endif /* _ALPHA_MSGBUF_H */
diff --git a/arch/alpha/include/asm/mutex.h b/arch/alpha/include/asm/mutex.h
new file mode 100644 (file)
index 0000000..458c1f7
--- /dev/null
@@ -0,0 +1,9 @@
+/*
+ * Pull in the generic implementation for the mutex fastpath.
+ *
+ * TODO: implement optimized primitives instead, or leave the generic
+ * implementation in place, or pick the atomic_xchg() based generic
+ * implementation. (see asm-generic/mutex-xchg.h for details)
+ */
+
+#include <asm-generic/mutex-dec.h>
diff --git a/arch/alpha/include/asm/page.h b/arch/alpha/include/asm/page.h
new file mode 100644 (file)
index 0000000..0995f9d
--- /dev/null
@@ -0,0 +1,98 @@
+#ifndef _ALPHA_PAGE_H
+#define _ALPHA_PAGE_H
+
+#include <linux/const.h>
+#include <asm/pal.h>
+
+/* PAGE_SHIFT determines the page size */
+#define PAGE_SHIFT     13
+#define PAGE_SIZE      (_AC(1,UL) << PAGE_SHIFT)
+#define PAGE_MASK      (~(PAGE_SIZE-1))
+
+#ifndef __ASSEMBLY__
+
+#define STRICT_MM_TYPECHECKS
+
+extern void clear_page(void *page);
+#define clear_user_page(page, vaddr, pg)       clear_page(page)
+
+#define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \
+       alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vmaddr)
+#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
+
+extern void copy_page(void * _to, void * _from);
+#define copy_user_page(to, from, vaddr, pg)    copy_page(to, from)
+
+#ifdef STRICT_MM_TYPECHECKS
+/*
+ * These are used to make use of C type-checking..
+ */
+typedef struct { unsigned long pte; } pte_t;
+typedef struct { unsigned long pmd; } pmd_t;
+typedef struct { unsigned long pgd; } pgd_t;
+typedef struct { unsigned long pgprot; } pgprot_t;
+
+#define pte_val(x)     ((x).pte)
+#define pmd_val(x)     ((x).pmd)
+#define pgd_val(x)     ((x).pgd)
+#define pgprot_val(x)  ((x).pgprot)
+
+#define __pte(x)       ((pte_t) { (x) } )
+#define __pmd(x)       ((pmd_t) { (x) } )
+#define __pgd(x)       ((pgd_t) { (x) } )
+#define __pgprot(x)    ((pgprot_t) { (x) } )
+
+#else
+/*
+ * .. while these make it easier on the compiler
+ */
+typedef unsigned long pte_t;
+typedef unsigned long pmd_t;
+typedef unsigned long pgd_t;
+typedef unsigned long pgprot_t;
+
+#define pte_val(x)     (x)
+#define pmd_val(x)     (x)
+#define pgd_val(x)     (x)
+#define pgprot_val(x)  (x)
+
+#define __pte(x)       (x)
+#define __pgd(x)       (x)
+#define __pgprot(x)    (x)
+
+#endif /* STRICT_MM_TYPECHECKS */
+
+typedef struct page *pgtable_t;
+
+#ifdef USE_48_BIT_KSEG
+#define PAGE_OFFSET            0xffff800000000000UL
+#else
+#define PAGE_OFFSET            0xfffffc0000000000UL
+#endif
+
+#else
+
+#ifdef USE_48_BIT_KSEG
+#define PAGE_OFFSET            0xffff800000000000
+#else
+#define PAGE_OFFSET            0xfffffc0000000000
+#endif
+
+#endif /* !__ASSEMBLY__ */
+
+#define __pa(x)                        ((unsigned long) (x) - PAGE_OFFSET)
+#define __va(x)                        ((void *)((unsigned long) (x) + PAGE_OFFSET))
+#ifndef CONFIG_DISCONTIGMEM
+#define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
+
+#define pfn_valid(pfn)         ((pfn) < max_mapnr)
+#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
+#endif /* CONFIG_DISCONTIGMEM */
+
+#define VM_DATA_DEFAULT_FLAGS          (VM_READ | VM_WRITE | VM_EXEC | \
+                                        VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
+
+#include <asm-generic/memory_model.h>
+#include <asm-generic/page.h>
+
+#endif /* _ALPHA_PAGE_H */
diff --git a/arch/alpha/include/asm/pal.h b/arch/alpha/include/asm/pal.h
new file mode 100644 (file)
index 0000000..9b4ba0d
--- /dev/null
@@ -0,0 +1,51 @@
+#ifndef __ALPHA_PAL_H
+#define __ALPHA_PAL_H
+
+/*
+ * Common PAL-code
+ */
+#define PAL_halt         0
+#define PAL_cflush       1
+#define PAL_draina       2
+#define PAL_bpt                128
+#define PAL_bugchk     129
+#define PAL_chmk       131
+#define PAL_callsys    131
+#define PAL_imb                134
+#define PAL_rduniq     158
+#define PAL_wruniq     159
+#define PAL_gentrap    170
+#define PAL_nphalt     190
+
+/*
+ * VMS specific PAL-code
+ */
+#define PAL_swppal     10
+#define PAL_mfpr_vptb  41
+
+/*
+ * OSF specific PAL-code
+ */
+#define PAL_cserve      9
+#define PAL_wripir     13
+#define PAL_rdmces     16
+#define PAL_wrmces     17
+#define PAL_wrfen      43
+#define PAL_wrvptptr   45
+#define PAL_jtopal     46
+#define PAL_swpctx     48
+#define PAL_wrval      49
+#define PAL_rdval      50
+#define PAL_tbi                51
+#define PAL_wrent      52
+#define PAL_swpipl     53
+#define PAL_rdps       54
+#define PAL_wrkgp      55
+#define PAL_wrusp      56
+#define PAL_wrperfmon  57
+#define PAL_rdusp      58
+#define PAL_whami      60
+#define PAL_retsys     61
+#define PAL_rti                63
+
+#endif /* __ALPHA_PAL_H */
diff --git a/arch/alpha/include/asm/param.h b/arch/alpha/include/asm/param.h
new file mode 100644 (file)
index 0000000..e691ecf
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef _ASM_ALPHA_PARAM_H
+#define _ASM_ALPHA_PARAM_H
+
+/* ??? Gross.  I don't want to parameterize this, and supposedly the
+   hardware ignores reprogramming.  We also need userland buy-in to the 
+   change in HZ, since this is visible in the wait4 resources etc.  */
+
+#ifdef __KERNEL__
+#define HZ             CONFIG_HZ
+#define USER_HZ                HZ
+#else
+#define HZ             1024
+#endif
+
+#define EXEC_PAGESIZE  8192
+
+#ifndef NOGROUP
+#define NOGROUP                (-1)
+#endif
+
+#define MAXHOSTNAMELEN 64      /* max length of hostname */
+
+#ifdef __KERNEL__
+# define CLOCKS_PER_SEC        HZ      /* frequency at which times() counts */
+#endif
+
+#endif /* _ASM_ALPHA_PARAM_H */
diff --git a/arch/alpha/include/asm/parport.h b/arch/alpha/include/asm/parport.h
new file mode 100644 (file)
index 0000000..c5ee7cb
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * parport.h: platform-specific PC-style parport initialisation
+ *
+ * Copyright (C) 1999, 2000  Tim Waugh <tim@cyberelk.demon.co.uk>
+ *
+ * This file should only be included by drivers/parport/parport_pc.c.
+ */
+
+#ifndef _ASM_AXP_PARPORT_H
+#define _ASM_AXP_PARPORT_H 1
+
+static int __devinit parport_pc_find_isa_ports (int autoirq, int autodma);
+static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma)
+{
+       return parport_pc_find_isa_ports (autoirq, autodma);
+}
+
+#endif /* !(_ASM_AXP_PARPORT_H) */
diff --git a/arch/alpha/include/asm/pci.h b/arch/alpha/include/asm/pci.h
new file mode 100644 (file)
index 0000000..2a14302
--- /dev/null
@@ -0,0 +1,276 @@
+#ifndef __ALPHA_PCI_H
+#define __ALPHA_PCI_H
+
+#ifdef __KERNEL__
+
+#include <linux/spinlock.h>
+#include <linux/dma-mapping.h>
+#include <asm/scatterlist.h>
+#include <asm/machvec.h>
+
+/*
+ * The following structure is used to manage multiple PCI busses.
+ */
+
+struct pci_dev;
+struct pci_bus;
+struct resource;
+struct pci_iommu_arena;
+struct page;
+
+/* A controller.  Used to manage multiple PCI busses.  */
+
+struct pci_controller {
+       struct pci_controller *next;
+        struct pci_bus *bus;
+       struct resource *io_space;
+       struct resource *mem_space;
+
+       /* The following are for reporting to userland.  The invariant is
+          that if we report a BWX-capable dense memory, we do not report
+          a sparse memory at all, even if it exists.  */
+       unsigned long sparse_mem_base;
+       unsigned long dense_mem_base;
+       unsigned long sparse_io_base;
+       unsigned long dense_io_base;
+
+       /* This one's for the kernel only.  It's in KSEG somewhere.  */
+       unsigned long config_space_base;
+
+       unsigned int index;
+       /* For compatibility with current (as of July 2003) pciutils
+          and XFree86. Eventually will be removed. */
+       unsigned int need_domain_info;
+
+       struct pci_iommu_arena *sg_pci;
+       struct pci_iommu_arena *sg_isa;
+
+       void *sysdata;
+};
+
+/* Override the logic in pci_scan_bus for skipping already-configured
+   bus numbers.  */
+
+#define pcibios_assign_all_busses()    1
+#define pcibios_scan_all_fns(a, b)     0
+
+#define PCIBIOS_MIN_IO         alpha_mv.min_io_address
+#define PCIBIOS_MIN_MEM                alpha_mv.min_mem_address
+
+extern void pcibios_set_master(struct pci_dev *dev);
+
+extern inline void pcibios_penalize_isa_irq(int irq, int active)
+{
+       /* We don't do dynamic PCI IRQ allocation */
+}
+
+/* IOMMU controls.  */
+
+/* The PCI address space does not equal the physical memory address space.
+   The networking and block device layers use this boolean for bounce buffer
+   decisions.  */
+#define PCI_DMA_BUS_IS_PHYS  0
+
+/* Allocate and map kernel buffer using consistent mode DMA for PCI
+   device.  Returns non-NULL cpu-view pointer to the buffer if
+   successful and sets *DMA_ADDRP to the pci side dma address as well,
+   else DMA_ADDRP is undefined.  */
+
+extern void *__pci_alloc_consistent(struct pci_dev *, size_t,
+                                   dma_addr_t *, gfp_t);
+static inline void *
+pci_alloc_consistent(struct pci_dev *dev, size_t size, dma_addr_t *dma)
+{
+       return __pci_alloc_consistent(dev, size, dma, GFP_ATOMIC);
+}
+
+/* Free and unmap a consistent DMA buffer.  CPU_ADDR and DMA_ADDR must
+   be values that were returned from pci_alloc_consistent.  SIZE must
+   be the same as what as passed into pci_alloc_consistent.
+   References to the memory and mappings associated with CPU_ADDR or
+   DMA_ADDR past this call are illegal.  */
+
+extern void pci_free_consistent(struct pci_dev *, size_t, void *, dma_addr_t);
+
+/* Map a single buffer of the indicate size for PCI DMA in streaming mode.
+   The 32-bit PCI bus mastering address to use is returned.  Once the device
+   is given the dma address, the device owns this memory until either
+   pci_unmap_single or pci_dma_sync_single_for_cpu is performed.  */
+
+extern dma_addr_t pci_map_single(struct pci_dev *, void *, size_t, int);
+
+/* Likewise, but for a page instead of an address.  */
+extern dma_addr_t pci_map_page(struct pci_dev *, struct page *,
+                              unsigned long, size_t, int);
+
+/* Test for pci_map_single or pci_map_page having generated an error.  */
+
+static inline int
+pci_dma_mapping_error(struct pci_dev *pdev, dma_addr_t dma_addr)
+{
+       return dma_addr == 0;
+}
+
+/* Unmap a single streaming mode DMA translation.  The DMA_ADDR and
+   SIZE must match what was provided for in a previous pci_map_single
+   call.  All other usages are undefined.  After this call, reads by
+   the cpu to the buffer are guaranteed to see whatever the device
+   wrote there.  */
+
+extern void pci_unmap_single(struct pci_dev *, dma_addr_t, size_t, int);
+extern void pci_unmap_page(struct pci_dev *, dma_addr_t, size_t, int);
+
+/* pci_unmap_{single,page} is not a nop, thus... */
+#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)      \
+       dma_addr_t ADDR_NAME;
+#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)                \
+       __u32 LEN_NAME;
+#define pci_unmap_addr(PTR, ADDR_NAME)                 \
+       ((PTR)->ADDR_NAME)
+#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)                \
+       (((PTR)->ADDR_NAME) = (VAL))
+#define pci_unmap_len(PTR, LEN_NAME)                   \
+       ((PTR)->LEN_NAME)
+#define pci_unmap_len_set(PTR, LEN_NAME, VAL)          \
+       (((PTR)->LEN_NAME) = (VAL))
+
+/* Map a set of buffers described by scatterlist in streaming mode for
+   PCI DMA.  This is the scatter-gather version of the above
+   pci_map_single interface.  Here the scatter gather list elements
+   are each tagged with the appropriate PCI dma address and length.
+   They are obtained via sg_dma_{address,length}(SG).
+
+   NOTE: An implementation may be able to use a smaller number of DMA
+   address/length pairs than there are SG table elements.  (for
+   example via virtual mapping capabilities) The routine returns the
+   number of addr/length pairs actually used, at most nents.
+
+   Device ownership issues as mentioned above for pci_map_single are
+   the same here.  */
+
+extern int pci_map_sg(struct pci_dev *, struct scatterlist *, int, int);
+
+/* Unmap a set of streaming mode DMA translations.  Again, cpu read
+   rules concerning calls here are the same as for pci_unmap_single()
+   above.  */
+
+extern void pci_unmap_sg(struct pci_dev *, struct scatterlist *, int, int);
+
+/* Make physical memory consistent for a single streaming mode DMA
+   translation after a transfer and device currently has ownership
+   of the buffer.
+
+   If you perform a pci_map_single() but wish to interrogate the
+   buffer using the cpu, yet do not wish to teardown the PCI dma
+   mapping, you must call this function before doing so.  At the next
+   point you give the PCI dma address back to the card, you must first
+   perform a pci_dma_sync_for_device, and then the device again owns
+   the buffer.  */
+
+static inline void
+pci_dma_sync_single_for_cpu(struct pci_dev *dev, dma_addr_t dma_addr,
+                           long size, int direction)
+{
+       /* Nothing to do.  */
+}
+
+static inline void
+pci_dma_sync_single_for_device(struct pci_dev *dev, dma_addr_t dma_addr,
+                              size_t size, int direction)
+{
+       /* Nothing to do.  */
+}
+
+/* Make physical memory consistent for a set of streaming mode DMA
+   translations after a transfer.  The same as pci_dma_sync_single_*
+   but for a scatter-gather list, same rules and usage.  */
+
+static inline void
+pci_dma_sync_sg_for_cpu(struct pci_dev *dev, struct scatterlist *sg,
+                       int nents, int direction)
+{
+       /* Nothing to do.  */
+}
+
+static inline void
+pci_dma_sync_sg_for_device(struct pci_dev *dev, struct scatterlist *sg,
+                          int nents, int direction)
+{
+       /* Nothing to do.  */
+}
+
+/* Return whether the given PCI device DMA address mask can
+   be supported properly.  For example, if your device can
+   only drive the low 24-bits during PCI bus mastering, then
+   you would pass 0x00ffffff as the mask to this function.  */
+
+extern int pci_dma_supported(struct pci_dev *hwdev, u64 mask);
+
+#ifdef CONFIG_PCI
+static inline void pci_dma_burst_advice(struct pci_dev *pdev,
+                                       enum pci_dma_burst_strategy *strat,
+                                       unsigned long *strategy_parameter)
+{
+       unsigned long cacheline_size;
+       u8 byte;
+
+       pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &byte);
+       if (byte == 0)
+               cacheline_size = 1024;
+       else
+               cacheline_size = (int) byte * 4;
+
+       *strat = PCI_DMA_BURST_BOUNDARY;
+       *strategy_parameter = cacheline_size;
+}
+#endif
+
+/* TODO: integrate with include/asm-generic/pci.h ? */
+static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
+{
+       return channel ? 15 : 14;
+}
+
+extern void pcibios_resource_to_bus(struct pci_dev *, struct pci_bus_region *,
+                                   struct resource *);
+
+extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
+                                   struct pci_bus_region *region);
+
+static inline struct resource *
+pcibios_select_root(struct pci_dev *pdev, struct resource *res)
+{
+       struct resource *root = NULL;
+
+       if (res->flags & IORESOURCE_IO)
+               root = &ioport_resource;
+       if (res->flags & IORESOURCE_MEM)
+               root = &iomem_resource;
+
+       return root;
+}
+
+#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index
+
+static inline int pci_proc_domain(struct pci_bus *bus)
+{
+       struct pci_controller *hose = bus->sysdata;
+       return hose->need_domain_info;
+}
+
+struct pci_dev *alpha_gendev_to_pci(struct device *dev);
+
+#endif /* __KERNEL__ */
+
+/* Values for the `which' argument to sys_pciconfig_iobase.  */
+#define IOBASE_HOSE            0
+#define IOBASE_SPARSE_MEM      1
+#define IOBASE_DENSE_MEM       2
+#define IOBASE_SPARSE_IO       3
+#define IOBASE_DENSE_IO                4
+#define IOBASE_ROOT_BUS                5
+#define IOBASE_FROM_HOSE       0x10000
+
+extern struct pci_dev *isa_bridge;
+
+#endif /* __ALPHA_PCI_H */
diff --git a/arch/alpha/include/asm/percpu.h b/arch/alpha/include/asm/percpu.h
new file mode 100644 (file)
index 0000000..3495e8e
--- /dev/null
@@ -0,0 +1,78 @@
+#ifndef __ALPHA_PERCPU_H
+#define __ALPHA_PERCPU_H
+#include <linux/compiler.h>
+#include <linux/threads.h>
+
+/*
+ * Determine the real variable name from the name visible in the
+ * kernel sources.
+ */
+#define per_cpu_var(var) per_cpu__##var
+
+#ifdef CONFIG_SMP
+
+/*
+ * per_cpu_offset() is the offset that has to be added to a
+ * percpu variable to get to the instance for a certain processor.
+ */
+extern unsigned long __per_cpu_offset[NR_CPUS];
+
+#define per_cpu_offset(x) (__per_cpu_offset[x])
+
+#define __my_cpu_offset per_cpu_offset(raw_smp_processor_id())
+#ifdef CONFIG_DEBUG_PREEMPT
+#define my_cpu_offset per_cpu_offset(smp_processor_id())
+#else
+#define my_cpu_offset __my_cpu_offset
+#endif
+
+#ifndef MODULE
+#define SHIFT_PERCPU_PTR(var, offset) RELOC_HIDE(&per_cpu_var(var), (offset))
+#define PER_CPU_ATTRIBUTES
+#else
+/*
+ * To calculate addresses of locally defined variables, GCC uses 32-bit
+ * displacement from the GP. Which doesn't work for per cpu variables in
+ * modules, as an offset to the kernel per cpu area is way above 4G.
+ *
+ * This forces allocation of a GOT entry for per cpu variable using
+ * ldq instruction with a 'literal' relocation.
+ */
+#define SHIFT_PERCPU_PTR(var, offset) ({               \
+       extern int simple_identifier_##var(void);       \
+       unsigned long __ptr, tmp_gp;                    \
+       asm (  "br      %1, 1f                        \n\
+       1:      ldgp    %1, 0(%1)                     \n\
+               ldq %0, per_cpu__" #var"(%1)\t!literal"         \
+               : "=&r"(__ptr), "=&r"(tmp_gp));         \
+       (typeof(&per_cpu_var(var)))(__ptr + (offset)); })
+
+#define PER_CPU_ATTRIBUTES     __used
+
+#endif /* MODULE */
+
+/*
+ * A percpu variable may point to a discarded regions. The following are
+ * established ways to produce a usable pointer from the percpu variable
+ * offset.
+ */
+#define per_cpu(var, cpu) \
+       (*SHIFT_PERCPU_PTR(var, per_cpu_offset(cpu)))
+#define __get_cpu_var(var) \
+       (*SHIFT_PERCPU_PTR(var, my_cpu_offset))
+#define __raw_get_cpu_var(var) \
+       (*SHIFT_PERCPU_PTR(var, __my_cpu_offset))
+
+#else /* ! SMP */
+
+#define per_cpu(var, cpu)              (*((void)(cpu), &per_cpu_var(var)))
+#define __get_cpu_var(var)             per_cpu_var(var)
+#define __raw_get_cpu_var(var)         per_cpu_var(var)
+
+#define PER_CPU_ATTRIBUTES
+
+#endif /* SMP */
+
+#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu_var(name)
+
+#endif /* __ALPHA_PERCPU_H */
diff --git a/arch/alpha/include/asm/pgalloc.h b/arch/alpha/include/asm/pgalloc.h
new file mode 100644 (file)
index 0000000..fd09015
--- /dev/null
@@ -0,0 +1,83 @@
+#ifndef _ALPHA_PGALLOC_H
+#define _ALPHA_PGALLOC_H
+
+#include <linux/mm.h>
+#include <linux/mmzone.h>
+
+/*      
+ * Allocate and free page tables. The xxx_kernel() versions are
+ * used to allocate a kernel page table - this turns on ASN bits
+ * if any.
+ */
+
+static inline void
+pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t pte)
+{
+       pmd_set(pmd, (pte_t *)(page_to_pa(pte) + PAGE_OFFSET));
+}
+#define pmd_pgtable(pmd) pmd_page(pmd)
+
+static inline void
+pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
+{
+       pmd_set(pmd, pte);
+}
+
+static inline void
+pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
+{
+       pgd_set(pgd, pmd);
+}
+
+extern pgd_t *pgd_alloc(struct mm_struct *mm);
+
+static inline void
+pgd_free(struct mm_struct *mm, pgd_t *pgd)
+{
+       free_page((unsigned long)pgd);
+}
+
+static inline pmd_t *
+pmd_alloc_one(struct mm_struct *mm, unsigned long address)
+{
+       pmd_t *ret = (pmd_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO);
+       return ret;
+}
+
+static inline void
+pmd_free(struct mm_struct *mm, pmd_t *pmd)
+{
+       free_page((unsigned long)pmd);
+}
+
+extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);
+
+static inline void
+pte_free_kernel(struct mm_struct *mm, pte_t *pte)
+{
+       free_page((unsigned long)pte);
+}
+
+static inline pgtable_t
+pte_alloc_one(struct mm_struct *mm, unsigned long address)
+{
+       pte_t *pte = pte_alloc_one_kernel(mm, address);
+       struct page *page;
+
+       if (!pte)
+               return NULL;
+       page = virt_to_page(pte);
+       pgtable_page_ctor(page);
+       return page;
+}
+
+static inline void
+pte_free(struct mm_struct *mm, pgtable_t page)
+{
+       pgtable_page_dtor(page);
+       __free_page(page);
+}
+
+#define check_pgt_cache()      do { } while (0)
+
+#endif /* _ALPHA_PGALLOC_H */
diff --git a/arch/alpha/include/asm/pgtable.h b/arch/alpha/include/asm/pgtable.h
new file mode 100644 (file)
index 0000000..3f0c59f
--- /dev/null
@@ -0,0 +1,380 @@
+#ifndef _ALPHA_PGTABLE_H
+#define _ALPHA_PGTABLE_H
+
+#include <asm-generic/4level-fixup.h>
+
+/*
+ * This file contains the functions and defines necessary to modify and use
+ * the Alpha page table tree.
+ *
+ * This hopefully works with any standard Alpha page-size, as defined
+ * in <asm/page.h> (currently 8192).
+ */
+#include <linux/mmzone.h>
+
+#include <asm/page.h>
+#include <asm/processor.h>     /* For TASK_SIZE */
+#include <asm/machvec.h>
+
+struct mm_struct;
+struct vm_area_struct;
+
+/* Certain architectures need to do special things when PTEs
+ * within a page table are directly modified.  Thus, the following
+ * hook is made available.
+ */
+#define set_pte(pteptr, pteval) ((*(pteptr)) = (pteval))
+#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
+
+/* PMD_SHIFT determines the size of the area a second-level page table can map */
+#define PMD_SHIFT      (PAGE_SHIFT + (PAGE_SHIFT-3))
+#define PMD_SIZE       (1UL << PMD_SHIFT)
+#define PMD_MASK       (~(PMD_SIZE-1))
+
+/* PGDIR_SHIFT determines what a third-level page table entry can map */
+#define PGDIR_SHIFT    (PAGE_SHIFT + 2*(PAGE_SHIFT-3))
+#define PGDIR_SIZE     (1UL << PGDIR_SHIFT)
+#define PGDIR_MASK     (~(PGDIR_SIZE-1))
+
+/*
+ * Entries per page directory level:  the Alpha is three-level, with
+ * all levels having a one-page page table.
+ */
+#define PTRS_PER_PTE   (1UL << (PAGE_SHIFT-3))
+#define PTRS_PER_PMD   (1UL << (PAGE_SHIFT-3))
+#define PTRS_PER_PGD   (1UL << (PAGE_SHIFT-3))
+#define USER_PTRS_PER_PGD      (TASK_SIZE / PGDIR_SIZE)
+#define FIRST_USER_ADDRESS     0
+
+/* Number of pointers that fit on a page:  this will go away. */
+#define PTRS_PER_PAGE  (1UL << (PAGE_SHIFT-3))
+
+#ifdef CONFIG_ALPHA_LARGE_VMALLOC
+#define VMALLOC_START          0xfffffe0000000000
+#else
+#define VMALLOC_START          (-2*PGDIR_SIZE)
+#endif
+#define VMALLOC_END            (-PGDIR_SIZE)
+
+/*
+ * OSF/1 PAL-code-imposed page table bits
+ */
+#define _PAGE_VALID    0x0001
+#define _PAGE_FOR      0x0002  /* used for page protection (fault on read) */
+#define _PAGE_FOW      0x0004  /* used for page protection (fault on write) */
+#define _PAGE_FOE      0x0008  /* used for page protection (fault on exec) */
+#define _PAGE_ASM      0x0010
+#define _PAGE_KRE      0x0100  /* xxx - see below on the "accessed" bit */
+#define _PAGE_URE      0x0200  /* xxx */
+#define _PAGE_KWE      0x1000  /* used to do the dirty bit in software */
+#define _PAGE_UWE      0x2000  /* used to do the dirty bit in software */
+
+/* .. and these are ours ... */
+#define _PAGE_DIRTY    0x20000
+#define _PAGE_ACCESSED 0x40000
+#define _PAGE_FILE     0x80000 /* set:pagecache, unset:swap */
+
+/*
+ * NOTE! The "accessed" bit isn't necessarily exact:  it can be kept exactly
+ * by software (use the KRE/URE/KWE/UWE bits appropriately), but I'll fake it.
+ * Under Linux/AXP, the "accessed" bit just means "read", and I'll just use
+ * the KRE/URE bits to watch for it. That way we don't need to overload the
+ * KWE/UWE bits with both handling dirty and accessed.
+ *
+ * Note that the kernel uses the accessed bit just to check whether to page
+ * out a page or not, so it doesn't have to be exact anyway.
+ */
+
+#define __DIRTY_BITS   (_PAGE_DIRTY | _PAGE_KWE | _PAGE_UWE)
+#define __ACCESS_BITS  (_PAGE_ACCESSED | _PAGE_KRE | _PAGE_URE)
+
+#define _PFN_MASK      0xFFFFFFFF00000000UL
+
+#define _PAGE_TABLE    (_PAGE_VALID | __DIRTY_BITS | __ACCESS_BITS)
+#define _PAGE_CHG_MASK (_PFN_MASK | __DIRTY_BITS | __ACCESS_BITS)
+
+/*
+ * All the normal masks have the "page accessed" bits on, as any time they are used,
+ * the page is accessed. They are cleared only by the page-out routines
+ */
+#define PAGE_NONE      __pgprot(_PAGE_VALID | __ACCESS_BITS | _PAGE_FOR | _PAGE_FOW | _PAGE_FOE)
+#define PAGE_SHARED    __pgprot(_PAGE_VALID | __ACCESS_BITS)
+#define PAGE_COPY      __pgprot(_PAGE_VALID | __ACCESS_BITS | _PAGE_FOW)
+#define PAGE_READONLY  __pgprot(_PAGE_VALID | __ACCESS_BITS | _PAGE_FOW)
+#define PAGE_KERNEL    __pgprot(_PAGE_VALID | _PAGE_ASM | _PAGE_KRE | _PAGE_KWE)
+
+#define _PAGE_NORMAL(x) __pgprot(_PAGE_VALID | __ACCESS_BITS | (x))
+
+#define _PAGE_P(x) _PAGE_NORMAL((x) | (((x) & _PAGE_FOW)?0:_PAGE_FOW))
+#define _PAGE_S(x) _PAGE_NORMAL(x)
+
+/*
+ * The hardware can handle write-only mappings, but as the Alpha
+ * architecture does byte-wide writes with a read-modify-write
+ * sequence, it's not practical to have write-without-read privs.
+ * Thus the "-w- -> rw-" and "-wx -> rwx" mapping here (and in
+ * arch/alpha/mm/fault.c)
+ */
+       /* xwr */
+#define __P000 _PAGE_P(_PAGE_FOE | _PAGE_FOW | _PAGE_FOR)
+#define __P001 _PAGE_P(_PAGE_FOE | _PAGE_FOW)
+#define __P010 _PAGE_P(_PAGE_FOE)
+#define __P011 _PAGE_P(_PAGE_FOE)
+#define __P100 _PAGE_P(_PAGE_FOW | _PAGE_FOR)
+#define __P101 _PAGE_P(_PAGE_FOW)
+#define __P110 _PAGE_P(0)
+#define __P111 _PAGE_P(0)
+
+#define __S000 _PAGE_S(_PAGE_FOE | _PAGE_FOW | _PAGE_FOR)
+#define __S001 _PAGE_S(_PAGE_FOE | _PAGE_FOW)
+#define __S010 _PAGE_S(_PAGE_FOE)
+#define __S011 _PAGE_S(_PAGE_FOE)
+#define __S100 _PAGE_S(_PAGE_FOW | _PAGE_FOR)
+#define __S101 _PAGE_S(_PAGE_FOW)
+#define __S110 _PAGE_S(0)
+#define __S111 _PAGE_S(0)
+
+/*
+ * pgprot_noncached() is only for infiniband pci support, and a real
+ * implementation for RAM would be more complicated.
+ */
+#define pgprot_noncached(prot) (prot)
+
+/*
+ * BAD_PAGETABLE is used when we need a bogus page-table, while
+ * BAD_PAGE is used for a bogus page.
+ *
+ * ZERO_PAGE is a global shared page that is always zero:  used
+ * for zero-mapped memory areas etc..
+ */
+extern pte_t __bad_page(void);
+extern pmd_t * __bad_pagetable(void);
+
+extern unsigned long __zero_page(void);
+
+#define BAD_PAGETABLE  __bad_pagetable()
+#define BAD_PAGE       __bad_page()
+#define ZERO_PAGE(vaddr)       (virt_to_page(ZERO_PGE))
+
+/* number of bits that fit into a memory pointer */
+#define BITS_PER_PTR                   (8*sizeof(unsigned long))
+
+/* to align the pointer to a pointer address */
+#define PTR_MASK                       (~(sizeof(void*)-1))
+
+/* sizeof(void*)==1<<SIZEOF_PTR_LOG2 */
+#define SIZEOF_PTR_LOG2                        3
+
+/* to find an entry in a page-table */
+#define PAGE_PTR(address)              \
+  ((unsigned long)(address)>>(PAGE_SHIFT-SIZEOF_PTR_LOG2)&PTR_MASK&~PAGE_MASK)
+
+/*
+ * On certain platforms whose physical address space can overlap KSEG,
+ * namely EV6 and above, we must re-twiddle the physaddr to restore the
+ * correct high-order bits.
+ *
+ * This is extremely confusing until you realize that this is actually
+ * just working around a userspace bug.  The X server was intending to
+ * provide the physical address but instead provided the KSEG address.
+ * Or tried to, except it's not representable.
+ * 
+ * On Tsunami there's nothing meaningful at 0x40000000000, so this is
+ * a safe thing to do.  Come the first core logic that does put something
+ * in this area -- memory or whathaveyou -- then this hack will have
+ * to go away.  So be prepared!
+ */
+
+#if defined(CONFIG_ALPHA_GENERIC) && defined(USE_48_BIT_KSEG)
+#error "EV6-only feature in a generic kernel"
+#endif
+#if defined(CONFIG_ALPHA_GENERIC) || \
+    (defined(CONFIG_ALPHA_EV6) && !defined(USE_48_BIT_KSEG))
+#define KSEG_PFN       (0xc0000000000UL >> PAGE_SHIFT)
+#define PHYS_TWIDDLE(pfn) \
+  ((((pfn) & KSEG_PFN) == (0x40000000000UL >> PAGE_SHIFT)) \
+  ? ((pfn) ^= KSEG_PFN) : (pfn))
+#else
+#define PHYS_TWIDDLE(pfn) (pfn)
+#endif
+
+/*
+ * Conversion functions:  convert a page and protection to a page entry,
+ * and a page entry and page directory to the page they refer to.
+ */
+#ifndef CONFIG_DISCONTIGMEM
+#define page_to_pa(page)       (((page) - mem_map) << PAGE_SHIFT)
+
+#define pte_pfn(pte)   (pte_val(pte) >> 32)
+#define pte_page(pte)  pfn_to_page(pte_pfn(pte))
+#define mk_pte(page, pgprot)                                           \
+({                                                                     \
+       pte_t pte;                                                      \
+                                                                       \
+       pte_val(pte) = (page_to_pfn(page) << 32) | pgprot_val(pgprot);  \
+       pte;                                                            \
+})
+#endif
+
+extern inline pte_t pfn_pte(unsigned long physpfn, pgprot_t pgprot)
+{ pte_t pte; pte_val(pte) = (PHYS_TWIDDLE(physpfn) << 32) | pgprot_val(pgprot); return pte; }
+
+extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
+{ pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot); return pte; }
+
+extern inline void pmd_set(pmd_t * pmdp, pte_t * ptep)
+{ pmd_val(*pmdp) = _PAGE_TABLE | ((((unsigned long) ptep) - PAGE_OFFSET) << (32-PAGE_SHIFT)); }
+
+extern inline void pgd_set(pgd_t * pgdp, pmd_t * pmdp)
+{ pgd_val(*pgdp) = _PAGE_TABLE | ((((unsigned long) pmdp) - PAGE_OFFSET) << (32-PAGE_SHIFT)); }
+
+
+extern inline unsigned long
+pmd_page_vaddr(pmd_t pmd)
+{
+       return ((pmd_val(pmd) & _PFN_MASK) >> (32-PAGE_SHIFT)) + PAGE_OFFSET;
+}
+
+#ifndef CONFIG_DISCONTIGMEM
+#define pmd_page(pmd)  (mem_map + ((pmd_val(pmd) & _PFN_MASK) >> 32))
+#define pgd_page(pgd)  (mem_map + ((pgd_val(pgd) & _PFN_MASK) >> 32))
+#endif
+
+extern inline unsigned long pgd_page_vaddr(pgd_t pgd)
+{ return PAGE_OFFSET + ((pgd_val(pgd) & _PFN_MASK) >> (32-PAGE_SHIFT)); }
+
+extern inline int pte_none(pte_t pte)          { return !pte_val(pte); }
+extern inline int pte_present(pte_t pte)       { return pte_val(pte) & _PAGE_VALID; }
+extern inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
+{
+       pte_val(*ptep) = 0;
+}
+
+extern inline int pmd_none(pmd_t pmd)          { return !pmd_val(pmd); }
+extern inline int pmd_bad(pmd_t pmd)           { return (pmd_val(pmd) & ~_PFN_MASK) != _PAGE_TABLE; }
+extern inline int pmd_present(pmd_t pmd)       { return pmd_val(pmd) & _PAGE_VALID; }
+extern inline void pmd_clear(pmd_t * pmdp)     { pmd_val(*pmdp) = 0; }
+
+extern inline int pgd_none(pgd_t pgd)          { return !pgd_val(pgd); }
+extern inline int pgd_bad(pgd_t pgd)           { return (pgd_val(pgd) & ~_PFN_MASK) != _PAGE_TABLE; }
+extern inline int pgd_present(pgd_t pgd)       { return pgd_val(pgd) & _PAGE_VALID; }
+extern inline void pgd_clear(pgd_t * pgdp)     { pgd_val(*pgdp) = 0; }
+
+/*
+ * The following only work if pte_present() is true.
+ * Undefined behaviour if not..
+ */
+extern inline int pte_write(pte_t pte)         { return !(pte_val(pte) & _PAGE_FOW); }
+extern inline int pte_dirty(pte_t pte)         { return pte_val(pte) & _PAGE_DIRTY; }
+extern inline int pte_young(pte_t pte)         { return pte_val(pte) & _PAGE_ACCESSED; }
+extern inline int pte_file(pte_t pte)          { return pte_val(pte) & _PAGE_FILE; }
+extern inline int pte_special(pte_t pte)       { return 0; }
+
+extern inline pte_t pte_wrprotect(pte_t pte)   { pte_val(pte) |= _PAGE_FOW; return pte; }
+extern inline pte_t pte_mkclean(pte_t pte)     { pte_val(pte) &= ~(__DIRTY_BITS); return pte; }
+extern inline pte_t pte_mkold(pte_t pte)       { pte_val(pte) &= ~(__ACCESS_BITS); return pte; }
+extern inline pte_t pte_mkwrite(pte_t pte)     { pte_val(pte) &= ~_PAGE_FOW; return pte; }
+extern inline pte_t pte_mkdirty(pte_t pte)     { pte_val(pte) |= __DIRTY_BITS; return pte; }
+extern inline pte_t pte_mkyoung(pte_t pte)     { pte_val(pte) |= __ACCESS_BITS; return pte; }
+extern inline pte_t pte_mkspecial(pte_t pte)   { return pte; }
+
+#define PAGE_DIR_OFFSET(tsk,address) pgd_offset((tsk),(address))
+
+/* to find an entry in a kernel page-table-directory */
+#define pgd_offset_k(address) pgd_offset(&init_mm, (address))
+
+/* to find an entry in a page-table-directory. */
+#define pgd_index(address)     (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
+#define pgd_offset(mm, address)        ((mm)->pgd+pgd_index(address))
+
+/*
+ * The smp_read_barrier_depends() in the following functions are required to
+ * order the load of *dir (the pointer in the top level page table) with any
+ * subsequent load of the returned pmd_t *ret (ret is data dependent on *dir).
+ *
+ * If this ordering is not enforced, the CPU might load an older value of
+ * *ret, which may be uninitialized data. See mm/memory.c:__pte_alloc for
+ * more details.
+ *
+ * Note that we never change the mm->pgd pointer after the task is running, so
+ * pgd_offset does not require such a barrier.
+ */
+
+/* Find an entry in the second-level page table.. */
+extern inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
+{
+       pmd_t *ret = (pmd_t *) pgd_page_vaddr(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PAGE - 1));
+       smp_read_barrier_depends(); /* see above */
+       return ret;
+}
+
+/* Find an entry in the third-level page table.. */
+extern inline pte_t * pte_offset_kernel(pmd_t * dir, unsigned long address)
+{
+       pte_t *ret = (pte_t *) pmd_page_vaddr(*dir)
+               + ((address >> PAGE_SHIFT) & (PTRS_PER_PAGE - 1));
+       smp_read_barrier_depends(); /* see above */
+       return ret;
+}
+
+#define pte_offset_map(dir,addr)       pte_offset_kernel((dir),(addr))
+#define pte_offset_map_nested(dir,addr)        pte_offset_kernel((dir),(addr))
+#define pte_unmap(pte)                 do { } while (0)
+#define pte_unmap_nested(pte)          do { } while (0)
+
+extern pgd_t swapper_pg_dir[1024];
+
+/*
+ * The Alpha doesn't have any external MMU info:  the kernel page
+ * tables contain all the necessary information.
+ */
+extern inline void update_mmu_cache(struct vm_area_struct * vma,
+       unsigned long address, pte_t pte)
+{
+}
+
+/*
+ * Non-present pages:  high 24 bits are offset, next 8 bits type,
+ * low 32 bits zero.
+ */
+extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
+{ pte_t pte; pte_val(pte) = (type << 32) | (offset << 40); return pte; }
+
+#define __swp_type(x)          (((x).val >> 32) & 0xff)
+#define __swp_offset(x)                ((x).val >> 40)
+#define __swp_entry(type, off) ((swp_entry_t) { pte_val(mk_swap_pte((type), (off))) })
+#define __pte_to_swp_entry(pte)        ((swp_entry_t) { pte_val(pte) })
+#define __swp_entry_to_pte(x)  ((pte_t) { (x).val })
+
+#define pte_to_pgoff(pte)      (pte_val(pte) >> 32)
+#define pgoff_to_pte(off)      ((pte_t) { ((off) << 32) | _PAGE_FILE })
+
+#define PTE_FILE_MAX_BITS      32
+
+#ifndef CONFIG_DISCONTIGMEM
+#define kern_addr_valid(addr)  (1)
+#endif
+
+#define io_remap_pfn_range(vma, start, pfn, size, prot)        \
+               remap_pfn_range(vma, start, pfn, size, prot)
+
+#define pte_ERROR(e) \
+       printk("%s:%d: bad pte %016lx.\n", __FILE__, __LINE__, pte_val(e))
+#define pmd_ERROR(e) \
+       printk("%s:%d: bad pmd %016lx.\n", __FILE__, __LINE__, pmd_val(e))
+#define pgd_ERROR(e) \
+       printk("%s:%d: bad pgd %016lx.\n", __FILE__, __LINE__, pgd_val(e))
+
+extern void paging_init(void);
+
+#include <asm-generic/pgtable.h>
+
+/*
+ * No page table caches to initialise
+ */
+#define pgtable_cache_init()   do { } while (0)
+
+/* We have our own get_unmapped_area to cope with ADDR_LIMIT_32BIT.  */
+#define HAVE_ARCH_UNMAPPED_AREA
+
+#endif /* _ALPHA_PGTABLE_H */
diff --git a/arch/alpha/include/asm/poll.h b/arch/alpha/include/asm/poll.h
new file mode 100644 (file)
index 0000000..c98509d
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/poll.h>
diff --git a/arch/alpha/include/asm/posix_types.h b/arch/alpha/include/asm/posix_types.h
new file mode 100644 (file)
index 0000000..db16741
--- /dev/null
@@ -0,0 +1,123 @@
+#ifndef _ALPHA_POSIX_TYPES_H
+#define _ALPHA_POSIX_TYPES_H
+
+/*
+ * This file is generally used by user-level software, so you need to
+ * be a little careful about namespace pollution etc.  Also, we cannot
+ * assume GCC is being used.
+ */
+
+typedef unsigned int   __kernel_ino_t;
+typedef unsigned int   __kernel_mode_t;
+typedef unsigned int   __kernel_nlink_t;
+typedef long           __kernel_off_t;
+typedef long long      __kernel_loff_t;
+typedef int            __kernel_pid_t;
+typedef int            __kernel_ipc_pid_t;
+typedef unsigned int   __kernel_uid_t;
+typedef unsigned int   __kernel_gid_t;
+typedef unsigned long  __kernel_size_t;
+typedef long           __kernel_ssize_t;
+typedef long           __kernel_ptrdiff_t;
+typedef long           __kernel_time_t;
+typedef long           __kernel_suseconds_t;
+typedef long           __kernel_clock_t;
+typedef int            __kernel_daddr_t;
+typedef char *         __kernel_caddr_t;
+typedef unsigned long  __kernel_sigset_t;      /* at least 32 bits */
+typedef unsigned short __kernel_uid16_t;
+typedef unsigned short __kernel_gid16_t;
+typedef int            __kernel_clockid_t;
+typedef int            __kernel_timer_t;
+
+typedef struct {
+       int     val[2];
+} __kernel_fsid_t;
+
+typedef __kernel_uid_t __kernel_old_uid_t;
+typedef __kernel_gid_t __kernel_old_gid_t;
+typedef __kernel_uid_t __kernel_uid32_t;
+typedef __kernel_gid_t __kernel_gid32_t;
+
+typedef unsigned int   __kernel_old_dev_t;
+
+#ifdef __KERNEL__
+
+#ifndef __GNUC__
+
+#define        __FD_SET(d, set)        ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d))
+#define        __FD_CLR(d, set)        ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d))
+#define        __FD_ISSET(d, set)      (((set)->fds_bits[__FDELT(d)] & __FDMASK(d)) != 0)
+#define        __FD_ZERO(set)  \
+  ((void) memset ((void *) (set), 0, sizeof (__kernel_fd_set)))
+
+#else /* __GNUC__ */
+
+/* With GNU C, use inline functions instead so args are evaluated only once: */
+
+#undef __FD_SET
+static __inline__ void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp)
+{
+       unsigned long _tmp = fd / __NFDBITS;
+       unsigned long _rem = fd % __NFDBITS;
+       fdsetp->fds_bits[_tmp] |= (1UL<<_rem);
+}
+
+#undef __FD_CLR
+static __inline__ void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp)
+{
+       unsigned long _tmp = fd / __NFDBITS;
+       unsigned long _rem = fd % __NFDBITS;
+       fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem);
+}
+
+#undef __FD_ISSET
+static __inline__ int __FD_ISSET(unsigned long fd, const __kernel_fd_set *p)
+{ 
+       unsigned long _tmp = fd / __NFDBITS;
+       unsigned long _rem = fd % __NFDBITS;
+       return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0;
+}
+
+/*
+ * This will unroll the loop for the normal constant case (8 ints,
+ * for a 256-bit fd_set)
+ */
+#undef __FD_ZERO
+static __inline__ void __FD_ZERO(__kernel_fd_set *p)
+{
+       unsigned long *tmp = p->fds_bits;
+       int i;
+
+       if (__builtin_constant_p(__FDSET_LONGS)) {
+               switch (__FDSET_LONGS) {
+                     case 16:
+                       tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
+                       tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0;
+                       tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0;
+                       tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0;
+                       return;
+
+                     case 8:
+                       tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
+                       tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0;
+                       return;
+
+                     case 4:
+                       tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
+                       return;
+               }
+       }
+       i = __FDSET_LONGS;
+       while (i) {
+               i--;
+               *tmp = 0;
+               tmp++;
+       }
+}
+
+#endif /* __GNUC__ */
+
+#endif /* __KERNEL__ */
+
+#endif /* _ALPHA_POSIX_TYPES_H */
diff --git a/arch/alpha/include/asm/processor.h b/arch/alpha/include/asm/processor.h
new file mode 100644 (file)
index 0000000..94afe58
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * include/asm-alpha/processor.h
+ *
+ * Copyright (C) 1994 Linus Torvalds
+ */
+
+#ifndef __ASM_ALPHA_PROCESSOR_H
+#define __ASM_ALPHA_PROCESSOR_H
+
+#include <linux/personality.h> /* for ADDR_LIMIT_32BIT */
+
+/*
+ * Returns current instruction pointer ("program counter").
+ */
+#define current_text_addr() \
+  ({ void *__pc; __asm__ ("br %0,.+4" : "=r"(__pc)); __pc; })
+
+/*
+ * We have a 42-bit user address space: 4TB user VM...
+ */
+#define TASK_SIZE (0x40000000000UL)
+
+#define STACK_TOP \
+  (current->personality & ADDR_LIMIT_32BIT ? 0x80000000 : 0x00120000000UL)
+
+#define STACK_TOP_MAX  0x00120000000UL
+
+/* This decides where the kernel will search for a free chunk of vm
+ * space during mmap's.
+ */
+#define TASK_UNMAPPED_BASE \
+  ((current->personality & ADDR_LIMIT_32BIT) ? 0x40000000 : TASK_SIZE / 2)
+
+typedef struct {
+       unsigned long seg;
+} mm_segment_t;
+
+/* This is dead.  Everything has been moved to thread_info.  */
+struct thread_struct { };
+#define INIT_THREAD  { }
+
+/* Return saved PC of a blocked thread.  */
+struct task_struct;
+extern unsigned long thread_saved_pc(struct task_struct *);
+
+/* Do necessary setup to start up a newly executed thread.  */
+extern void start_thread(struct pt_regs *, unsigned long, unsigned long);
+
+/* Free all resources held by a thread. */
+extern void release_thread(struct task_struct *);
+
+/* Prepare to copy thread state - unlazy all lazy status */
+#define prepare_to_copy(tsk)   do { } while (0)
+
+/* Create a kernel thread without removing it from tasklists.  */
+extern long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
+
+unsigned long get_wchan(struct task_struct *p);
+
+#define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc)
+
+#define KSTK_ESP(tsk) \
+  ((tsk) == current ? rdusp() : task_thread_info(tsk)->pcb.usp)
+
+#define cpu_relax()    barrier()
+
+#define ARCH_HAS_PREFETCH
+#define ARCH_HAS_PREFETCHW
+#define ARCH_HAS_SPINLOCK_PREFETCH
+
+#ifndef CONFIG_SMP
+/* Nothing to prefetch. */
+#define spin_lock_prefetch(lock)       do { } while (0)
+#endif
+
+extern inline void prefetch(const void *ptr)  
+{ 
+       __builtin_prefetch(ptr, 0, 3);
+}
+
+extern inline void prefetchw(const void *ptr)  
+{
+       __builtin_prefetch(ptr, 1, 3);
+}
+
+#ifdef CONFIG_SMP
+extern inline void spin_lock_prefetch(const void *ptr)  
+{
+       __builtin_prefetch(ptr, 1, 3);
+}
+#endif
+
+#endif /* __ASM_ALPHA_PROCESSOR_H */
diff --git a/arch/alpha/include/asm/ptrace.h b/arch/alpha/include/asm/ptrace.h
new file mode 100644 (file)
index 0000000..32c7a5c
--- /dev/null
@@ -0,0 +1,83 @@
+#ifndef _ASMAXP_PTRACE_H
+#define _ASMAXP_PTRACE_H
+
+
+/*
+ * This struct defines the way the registers are stored on the
+ * kernel stack during a system call or other kernel entry
+ *
+ * NOTE! I want to minimize the overhead of system calls, so this
+ * struct has as little information as possible.  I does not have
+ *
+ *  - floating point regs: the kernel doesn't change those
+ *  - r9-15: saved by the C compiler
+ *
+ * This makes "fork()" and "exec()" a bit more complex, but should
+ * give us low system call latency.
+ */
+
+struct pt_regs {
+       unsigned long r0;
+       unsigned long r1;
+       unsigned long r2;
+       unsigned long r3;
+       unsigned long r4;
+       unsigned long r5;
+       unsigned long r6;
+       unsigned long r7;
+       unsigned long r8;
+       unsigned long r19;
+       unsigned long r20;
+       unsigned long r21;
+       unsigned long r22;
+       unsigned long r23;
+       unsigned long r24;
+       unsigned long r25;
+       unsigned long r26;
+       unsigned long r27;
+       unsigned long r28;
+       unsigned long hae;
+/* JRP - These are the values provided to a0-a2 by PALcode */
+       unsigned long trap_a0;
+       unsigned long trap_a1;
+       unsigned long trap_a2;
+/* These are saved by PAL-code: */
+       unsigned long ps;
+       unsigned long pc;
+       unsigned long gp;
+       unsigned long r16;
+       unsigned long r17;
+       unsigned long r18;
+};
+
+/*
+ * This is the extended stack used by signal handlers and the context
+ * switcher: it's pushed after the normal "struct pt_regs".
+ */
+struct switch_stack {
+       unsigned long r9;
+       unsigned long r10;
+       unsigned long r11;
+       unsigned long r12;
+       unsigned long r13;
+       unsigned long r14;
+       unsigned long r15;
+       unsigned long r26;
+       unsigned long fp[32];   /* fp[31] is fpcr */
+};
+
+#ifdef __KERNEL__
+
+#define user_mode(regs) (((regs)->ps & 8) != 0)
+#define instruction_pointer(regs) ((regs)->pc)
+#define profile_pc(regs) instruction_pointer(regs)
+extern void show_regs(struct pt_regs *);
+
+#define task_pt_regs(task) \
+  ((struct pt_regs *) (task_stack_page(task) + 2*PAGE_SIZE) - 1)
+
+#define force_successful_syscall_return() (task_pt_regs(current)->r0 = 0)
+
+#endif
+
+#endif
diff --git a/arch/alpha/include/asm/reg.h b/arch/alpha/include/asm/reg.h
new file mode 100644 (file)
index 0000000..86ff916
--- /dev/null
@@ -0,0 +1,52 @@
+#ifndef __reg_h__
+#define __reg_h__
+
+/*
+ * Exception frame offsets.
+ */
+#define EF_V0          0
+#define EF_T0          1
+#define EF_T1          2
+#define EF_T2          3
+#define EF_T3          4
+#define EF_T4          5
+#define EF_T5          6
+#define EF_T6          7
+#define EF_T7          8
+#define EF_S0          9
+#define EF_S1          10
+#define EF_S2          11
+#define EF_S3          12
+#define EF_S4          13
+#define EF_S5          14
+#define EF_S6          15
+#define EF_A3          16
+#define EF_A4          17
+#define EF_A5          18
+#define EF_T8          19
+#define EF_T9          20
+#define EF_T10         21
+#define EF_T11         22
+#define EF_RA          23
+#define EF_T12         24
+#define EF_AT          25
+#define EF_SP          26
+#define EF_PS          27
+#define EF_PC          28
+#define EF_GP          29
+#define EF_A0          30
+#define EF_A1          31
+#define EF_A2          32
+
+#define EF_SIZE                (33*8)
+#define HWEF_SIZE      (6*8)           /* size of PAL frame (PS-A2) */
+
+#define EF_SSIZE       (EF_SIZE - HWEF_SIZE)
+
+/*
+ * Map register number into core file offset.
+ */
+#define CORE_REG(reg, ubase) \
+       (((unsigned long *)((unsigned long)(ubase)))[reg])
+
+#endif /* __reg_h__ */
diff --git a/arch/alpha/include/asm/regdef.h b/arch/alpha/include/asm/regdef.h
new file mode 100644 (file)
index 0000000..142df9c
--- /dev/null
@@ -0,0 +1,44 @@
+#ifndef __alpha_regdef_h__
+#define __alpha_regdef_h__
+
+#define v0     $0      /* function return value */
+
+#define t0     $1      /* temporary registers (caller-saved) */
+#define t1     $2
+#define t2     $3
+#define t3     $4
+#define t4     $5
+#define t5     $6
+#define t6     $7
+#define t7     $8
+
+#define        s0      $9      /* saved-registers (callee-saved registers) */
+#define        s1      $10
+#define        s2      $11
+#define        s3      $12
+#define        s4      $13
+#define        s5      $14
+#define        s6      $15
+#define        fp      s6      /* frame-pointer (s6 in frame-less procedures) */
+
+#define a0     $16     /* argument registers (caller-saved) */
+#define a1     $17
+#define a2     $18
+#define a3     $19
+#define a4     $20
+#define a5     $21
+
+#define t8     $22     /* more temps (caller-saved) */
+#define t9     $23
+#define t10    $24
+#define t11    $25
+#define ra     $26     /* return address register */
+#define t12    $27
+
+#define pv     t12     /* procedure-variable register */
+#define AT     $at     /* assembler temporary */
+#define gp     $29     /* global pointer */
+#define sp     $30     /* stack pointer */
+#define zero   $31     /* reads as zero, writes are noops */
+
+#endif /* __alpha_regdef_h__ */
diff --git a/arch/alpha/include/asm/resource.h b/arch/alpha/include/asm/resource.h
new file mode 100644 (file)
index 0000000..c10874f
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef _ALPHA_RESOURCE_H
+#define _ALPHA_RESOURCE_H
+
+/*
+ * Alpha/Linux-specific ordering of these four resource limit IDs,
+ * the rest comes from the generic header:
+ */
+#define RLIMIT_NOFILE          6       /* max number of open files */
+#define RLIMIT_AS              7       /* address space limit */
+#define RLIMIT_NPROC           8       /* max number of processes */
+#define RLIMIT_MEMLOCK         9       /* max locked-in-memory address space */
+
+/*
+ * SuS says limits have to be unsigned.  Fine, it's unsigned, but
+ * we retain the old value for compatibility, especially with DU. 
+ * When you run into the 2^63 barrier, you call me.
+ */
+#define RLIM_INFINITY          0x7ffffffffffffffful
+
+#include <asm-generic/resource.h>
+
+#endif /* _ALPHA_RESOURCE_H */
diff --git a/arch/alpha/include/asm/rtc.h b/arch/alpha/include/asm/rtc.h
new file mode 100644 (file)
index 0000000..4e854b1
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef _ALPHA_RTC_H
+#define _ALPHA_RTC_H
+
+/*
+ * Alpha uses the default access methods for the RTC.
+ */
+
+#include <asm-generic/rtc.h>
+
+#endif
diff --git a/arch/alpha/include/asm/rwsem.h b/arch/alpha/include/asm/rwsem.h
new file mode 100644 (file)
index 0000000..1570c0b
--- /dev/null
@@ -0,0 +1,259 @@
+#ifndef _ALPHA_RWSEM_H
+#define _ALPHA_RWSEM_H
+
+/*
+ * Written by Ivan Kokshaysky <ink@jurassic.park.msu.ru>, 2001.
+ * Based on asm-alpha/semaphore.h and asm-i386/rwsem.h
+ */
+
+#ifndef _LINUX_RWSEM_H
+#error "please don't include asm/rwsem.h directly, use linux/rwsem.h instead"
+#endif
+
+#ifdef __KERNEL__
+
+#include <linux/compiler.h>
+#include <linux/list.h>
+#include <linux/spinlock.h>
+
+struct rwsem_waiter;
+
+extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
+extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
+extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *);
+extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
+
+/*
+ * the semaphore definition
+ */
+struct rw_semaphore {
+       long                    count;
+#define RWSEM_UNLOCKED_VALUE           0x0000000000000000L
+#define RWSEM_ACTIVE_BIAS              0x0000000000000001L
+#define RWSEM_ACTIVE_MASK              0x00000000ffffffffL
+#define RWSEM_WAITING_BIAS             (-0x0000000100000000L)
+#define RWSEM_ACTIVE_READ_BIAS         RWSEM_ACTIVE_BIAS
+#define RWSEM_ACTIVE_WRITE_BIAS                (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
+       spinlock_t              wait_lock;
+       struct list_head        wait_list;
+};
+
+#define __RWSEM_INITIALIZER(name) \
+       { RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, \
+       LIST_HEAD_INIT((name).wait_list) }
+
+#define DECLARE_RWSEM(name) \
+       struct rw_semaphore name = __RWSEM_INITIALIZER(name)
+
+static inline void init_rwsem(struct rw_semaphore *sem)
+{
+       sem->count = RWSEM_UNLOCKED_VALUE;
+       spin_lock_init(&sem->wait_lock);
+       INIT_LIST_HEAD(&sem->wait_list);
+}
+
+static inline void __down_read(struct rw_semaphore *sem)
+{
+       long oldcount;
+#ifndef        CONFIG_SMP
+       oldcount = sem->count;
+       sem->count += RWSEM_ACTIVE_READ_BIAS;
+#else
+       long temp;
+       __asm__ __volatile__(
+       "1:     ldq_l   %0,%1\n"
+       "       addq    %0,%3,%2\n"
+       "       stq_c   %2,%1\n"
+       "       beq     %2,2f\n"
+       "       mb\n"
+       ".subsection 2\n"
+       "2:     br      1b\n"
+       ".previous"
+       :"=&r" (oldcount), "=m" (sem->count), "=&r" (temp)
+       :"Ir" (RWSEM_ACTIVE_READ_BIAS), "m" (sem->count) : "memory");
+#endif
+       if (unlikely(oldcount < 0))
+               rwsem_down_read_failed(sem);
+}
+
+/*
+ * trylock for reading -- returns 1 if successful, 0 if contention
+ */
+static inline int __down_read_trylock(struct rw_semaphore *sem)
+{
+       long old, new, res;
+
+       res = sem->count;
+       do {
+               new = res + RWSEM_ACTIVE_READ_BIAS;
+               if (new <= 0)
+                       break;
+               old = res;
+               res = cmpxchg(&sem->count, old, new);
+       } while (res != old);
+       return res >= 0 ? 1 : 0;
+}
+
+static inline void __down_write(struct rw_semaphore *sem)
+{
+       long oldcount;
+#ifndef        CONFIG_SMP
+       oldcount = sem->count;
+       sem->count += RWSEM_ACTIVE_WRITE_BIAS;
+#else
+       long temp;
+       __asm__ __volatile__(
+       "1:     ldq_l   %0,%1\n"
+       "       addq    %0,%3,%2\n"
+       "       stq_c   %2,%1\n"
+       "       beq     %2,2f\n"
+       "       mb\n"
+       ".subsection 2\n"
+       "2:     br      1b\n"
+       ".previous"
+       :"=&r" (oldcount), "=m" (sem->count), "=&r" (temp)
+       :"Ir" (RWSEM_ACTIVE_WRITE_BIAS), "m" (sem->count) : "memory");
+#endif
+       if (unlikely(oldcount))
+               rwsem_down_write_failed(sem);
+}
+
+/*
+ * trylock for writing -- returns 1 if successful, 0 if contention
+ */
+static inline int __down_write_trylock(struct rw_semaphore *sem)
+{
+       long ret = cmpxchg(&sem->count, RWSEM_UNLOCKED_VALUE,
+                          RWSEM_ACTIVE_WRITE_BIAS);
+       if (ret == RWSEM_UNLOCKED_VALUE)
+               return 1;
+       return 0;
+}
+
+static inline void __up_read(struct rw_semaphore *sem)
+{
+       long oldcount;
+#ifndef        CONFIG_SMP
+       oldcount = sem->count;
+       sem->count -= RWSEM_ACTIVE_READ_BIAS;
+#else
+       long temp;
+       __asm__ __volatile__(
+       "       mb\n"
+       "1:     ldq_l   %0,%1\n"
+       "       subq    %0,%3,%2\n"
+       "       stq_c   %2,%1\n"
+       "       beq     %2,2f\n"
+       ".subsection 2\n"
+       "2:     br      1b\n"
+       ".previous"
+       :"=&r" (oldcount), "=m" (sem->count), "=&r" (temp)
+       :"Ir" (RWSEM_ACTIVE_READ_BIAS), "m" (sem->count) : "memory");
+#endif
+       if (unlikely(oldcount < 0))
+               if ((int)oldcount - RWSEM_ACTIVE_READ_BIAS == 0)
+                       rwsem_wake(sem);
+}
+
+static inline void __up_write(struct rw_semaphore *sem)
+{
+       long count;
+#ifndef        CONFIG_SMP
+       sem->count -= RWSEM_ACTIVE_WRITE_BIAS;
+       count = sem->count;
+#else
+       long temp;
+       __asm__ __volatile__(
+       "       mb\n"
+       "1:     ldq_l   %0,%1\n"
+       "       subq    %0,%3,%2\n"
+       "       stq_c   %2,%1\n"
+       "       beq     %2,2f\n"
+       "       subq    %0,%3,%0\n"
+       ".subsection 2\n"
+       "2:     br      1b\n"
+       ".previous"
+       :"=&r" (count), "=m" (sem->count), "=&r" (temp)
+       :"Ir" (RWSEM_ACTIVE_WRITE_BIAS), "m" (sem->count) : "memory");
+#endif
+       if (unlikely(count))
+               if ((int)count == 0)
+                       rwsem_wake(sem);
+}
+
+/*
+ * downgrade write lock to read lock
+ */
+static inline void __downgrade_write(struct rw_semaphore *sem)
+{
+       long oldcount;
+#ifndef        CONFIG_SMP
+       oldcount = sem->count;
+       sem->count -= RWSEM_WAITING_BIAS;
+#else
+       long temp;
+       __asm__ __volatile__(
+       "1:     ldq_l   %0,%1\n"
+       "       addq    %0,%3,%2\n"
+       "       stq_c   %2,%1\n"
+       "       beq     %2,2f\n"
+       "       mb\n"
+       ".subsection 2\n"
+       "2:     br      1b\n"
+       ".previous"
+       :"=&r" (oldcount), "=m" (sem->count), "=&r" (temp)
+       :"Ir" (-RWSEM_WAITING_BIAS), "m" (sem->count) : "memory");
+#endif
+       if (unlikely(oldcount < 0))
+               rwsem_downgrade_wake(sem);
+}
+
+static inline void rwsem_atomic_add(long val, struct rw_semaphore *sem)
+{
+#ifndef        CONFIG_SMP
+       sem->count += val;
+#else
+       long temp;
+       __asm__ __volatile__(
+       "1:     ldq_l   %0,%1\n"
+       "       addq    %0,%2,%0\n"
+       "       stq_c   %0,%1\n"
+       "       beq     %0,2f\n"
+       ".subsection 2\n"
+       "2:     br      1b\n"
+       ".previous"
+       :"=&r" (temp), "=m" (sem->count)
+       :"Ir" (val), "m" (sem->count));
+#endif
+}
+
+static inline long rwsem_atomic_update(long val, struct rw_semaphore *sem)
+{
+#ifndef        CONFIG_SMP
+       sem->count += val;
+       return sem->count;
+#else
+       long ret, temp;
+       __asm__ __volatile__(
+       "1:     ldq_l   %0,%1\n"
+       "       addq    %0,%3,%2\n"
+       "       addq    %0,%3,%0\n"
+       "       stq_c   %2,%1\n"
+       "       beq     %2,2f\n"
+       ".subsection 2\n"
+       "2:     br      1b\n"
+       ".previous"
+       :"=&r" (ret), "=m" (sem->count), "=&r" (temp)
+       :"Ir" (val), "m" (sem->count));
+
+       return ret;
+#endif
+}
+
+static inline int rwsem_is_locked(struct rw_semaphore *sem)
+{
+       return (sem->count != 0);
+}
+
+#endif /* __KERNEL__ */
+#endif /* _ALPHA_RWSEM_H */
diff --git a/arch/alpha/include/asm/scatterlist.h b/arch/alpha/include/asm/scatterlist.h
new file mode 100644 (file)
index 0000000..440747c
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef _ALPHA_SCATTERLIST_H
+#define _ALPHA_SCATTERLIST_H
+
+#include <asm/page.h>
+#include <asm/types.h>
+  
+struct scatterlist {
+#ifdef CONFIG_DEBUG_SG
+       unsigned long sg_magic;
+#endif
+       unsigned long page_link;
+       unsigned int offset;
+
+       unsigned int length;
+
+       dma_addr_t dma_address;
+       __u32 dma_length;
+};
+
+#define sg_dma_address(sg)     ((sg)->dma_address)
+#define sg_dma_len(sg)         ((sg)->dma_length)
+
+#define ISA_DMA_THRESHOLD (~0UL)
+
+#endif /* !(_ALPHA_SCATTERLIST_H) */
diff --git a/arch/alpha/include/asm/sections.h b/arch/alpha/include/asm/sections.h
new file mode 100644 (file)
index 0000000..43b40ed
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef _ALPHA_SECTIONS_H
+#define _ALPHA_SECTIONS_H
+
+/* nothing to see, move along */
+#include <asm-generic/sections.h>
+
+#endif
diff --git a/arch/alpha/include/asm/segment.h b/arch/alpha/include/asm/segment.h
new file mode 100644 (file)
index 0000000..0453d97
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_SEGMENT_H
+#define __ALPHA_SEGMENT_H
+
+/* Only here because we have some old header files that expect it.. */
+
+#endif
diff --git a/arch/alpha/include/asm/sembuf.h b/arch/alpha/include/asm/sembuf.h
new file mode 100644 (file)
index 0000000..7b38b15
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef _ALPHA_SEMBUF_H
+#define _ALPHA_SEMBUF_H
+
+/* 
+ * The semid64_ds structure for alpha architecture.
+ * Note extra padding because this structure is passed back and forth
+ * between kernel and user space.
+ *
+ * Pad space is left for:
+ * - 2 miscellaneous 64-bit values
+ */
+
+struct semid64_ds {
+       struct ipc64_perm sem_perm;             /* permissions .. see ipc.h */
+       __kernel_time_t sem_otime;              /* last semop time */
+       __kernel_time_t sem_ctime;              /* last change time */
+       unsigned long   sem_nsems;              /* no. of semaphores in array */
+       unsigned long   __unused1;
+       unsigned long   __unused2;
+};
+
+#endif /* _ALPHA_SEMBUF_H */
diff --git a/arch/alpha/include/asm/serial.h b/arch/alpha/include/asm/serial.h
new file mode 100644 (file)
index 0000000..9d263e8
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * include/asm-alpha/serial.h
+ */
+
+
+/*
+ * This assumes you have a 1.8432 MHz clock for your UART.
+ *
+ * It'd be nice if someone built a serial card with a 24.576 MHz
+ * clock, since the 16550A is capable of handling a top speed of 1.5
+ * megabits/second; but this requires the faster clock.
+ */
+#define BASE_BAUD ( 1843200 / 16 )
+
+/* Standard COM flags (except for COM4, because of the 8514 problem) */
+#ifdef CONFIG_SERIAL_DETECT_IRQ
+#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ)
+#define STD_COM4_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_AUTO_IRQ)
+#else
+#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
+#define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF
+#endif
+
+#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 */     \
+       { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS },      /* ttyS2 */     \
+       { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS },     /* ttyS3 */
diff --git a/arch/alpha/include/asm/setup.h b/arch/alpha/include/asm/setup.h
new file mode 100644 (file)
index 0000000..2e023a4
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_SETUP_H
+#define __ALPHA_SETUP_H
+
+#define COMMAND_LINE_SIZE      256
+
+#endif
diff --git a/arch/alpha/include/asm/sfp-machine.h b/arch/alpha/include/asm/sfp-machine.h
new file mode 100644 (file)
index 0000000..5fe63af
--- /dev/null
@@ -0,0 +1,82 @@
+/* Machine-dependent software floating-point definitions.
+   Alpha kernel version.
+   Copyright (C) 1997,1998,1999 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson (rth@cygnus.com),
+                 Jakub Jelinek (jakub@redhat.com) and
+                 David S. Miller (davem@redhat.com).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If
+   not, write to the Free Software Foundation, Inc.,
+   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifndef _SFP_MACHINE_H
+#define _SFP_MACHINE_H
+   
+#define _FP_W_TYPE_SIZE                64
+#define _FP_W_TYPE             unsigned long
+#define _FP_WS_TYPE            signed long
+#define _FP_I_TYPE             long
+
+#define _FP_MUL_MEAT_S(R,X,Y)                                  \
+  _FP_MUL_MEAT_1_imm(_FP_WFRACBITS_S,R,X,Y)
+#define _FP_MUL_MEAT_D(R,X,Y)                                  \
+  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_Q(R,X,Y)                                  \
+  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
+
+#define _FP_DIV_MEAT_S(R,X,Y)  _FP_DIV_MEAT_1_imm(S,R,X,Y,_FP_DIV_HELP_imm)
+#define _FP_DIV_MEAT_D(R,X,Y)  _FP_DIV_MEAT_1_udiv(D,R,X,Y)
+#define _FP_DIV_MEAT_Q(R,X,Y)  _FP_DIV_MEAT_2_udiv(Q,R,X,Y)
+
+#define _FP_NANFRAC_S          _FP_QNANBIT_S
+#define _FP_NANFRAC_D          _FP_QNANBIT_D
+#define _FP_NANFRAC_Q          _FP_QNANBIT_Q
+#define _FP_NANSIGN_S          1
+#define _FP_NANSIGN_D          1
+#define _FP_NANSIGN_Q          1
+
+#define _FP_KEEPNANFRACP 1
+
+/* Alpha Architecture Handbook, 4.7.10.4 sais that
+ * we should prefer any type of NaN in Fb, then Fa.
+ */
+#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)                     \
+  do {                                                         \
+    R##_s = Y##_s;                                             \
+    _FP_FRAC_COPY_##wc(R,X);                                   \
+    R##_c = FP_CLS_NAN;                                                \
+  } while (0)
+
+/* Obtain the current rounding mode. */
+#define FP_ROUNDMODE   mode
+#define FP_RND_NEAREST (FPCR_DYN_NORMAL >> FPCR_DYN_SHIFT)
+#define FP_RND_ZERO    (FPCR_DYN_CHOPPED >> FPCR_DYN_SHIFT)
+#define FP_RND_PINF    (FPCR_DYN_PLUS >> FPCR_DYN_SHIFT)
+#define FP_RND_MINF    (FPCR_DYN_MINUS >> FPCR_DYN_SHIFT)
+
+/* Exception flags. */
+#define FP_EX_INVALID          IEEE_TRAP_ENABLE_INV
+#define FP_EX_OVERFLOW         IEEE_TRAP_ENABLE_OVF
+#define FP_EX_UNDERFLOW                IEEE_TRAP_ENABLE_UNF
+#define FP_EX_DIVZERO          IEEE_TRAP_ENABLE_DZE
+#define FP_EX_INEXACT          IEEE_TRAP_ENABLE_INE
+#define FP_EX_DENORM           IEEE_TRAP_ENABLE_DNO
+
+#define FP_DENORM_ZERO         (swcr & IEEE_MAP_DMZ)
+
+/* We write the results always */
+#define FP_INHIBIT_RESULTS 0
+
+#endif
diff --git a/arch/alpha/include/asm/shmbuf.h b/arch/alpha/include/asm/shmbuf.h
new file mode 100644 (file)
index 0000000..37ee84f
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef _ALPHA_SHMBUF_H
+#define _ALPHA_SHMBUF_H
+
+/* 
+ * The shmid64_ds structure for alpha architecture.
+ * Note extra padding because this structure is passed back and forth
+ * between kernel and user space.
+ *
+ * Pad space is left for:
+ * - 2 miscellaneous 64-bit values
+ */
+
+struct shmid64_ds {
+       struct ipc64_perm       shm_perm;       /* operation perms */
+       size_t                  shm_segsz;      /* size of segment (bytes) */
+       __kernel_time_t         shm_atime;      /* last attach time */
+       __kernel_time_t         shm_dtime;      /* last detach time */
+       __kernel_time_t         shm_ctime;      /* last change time */
+       __kernel_pid_t          shm_cpid;       /* pid of creator */
+       __kernel_pid_t          shm_lpid;       /* pid of last operator */
+       unsigned long           shm_nattch;     /* no. of current attaches */
+       unsigned long           __unused1;
+       unsigned long           __unused2;
+};
+
+struct shminfo64 {
+       unsigned long   shmmax;
+       unsigned long   shmmin;
+       unsigned long   shmmni;
+       unsigned long   shmseg;
+       unsigned long   shmall;
+       unsigned long   __unused1;
+       unsigned long   __unused2;
+       unsigned long   __unused3;
+       unsigned long   __unused4;
+};
+
+#endif /* _ALPHA_SHMBUF_H */
diff --git a/arch/alpha/include/asm/shmparam.h b/arch/alpha/include/asm/shmparam.h
new file mode 100644 (file)
index 0000000..cc901d5
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _ASMAXP_SHMPARAM_H
+#define _ASMAXP_SHMPARAM_H
+
+#define        SHMLBA PAGE_SIZE                 /* attach addr a multiple of this */
+
+#endif /* _ASMAXP_SHMPARAM_H */
diff --git a/arch/alpha/include/asm/sigcontext.h b/arch/alpha/include/asm/sigcontext.h
new file mode 100644 (file)
index 0000000..323cdb0
--- /dev/null
@@ -0,0 +1,34 @@
+#ifndef _ASMAXP_SIGCONTEXT_H
+#define _ASMAXP_SIGCONTEXT_H
+
+struct sigcontext {
+       /*
+        * What should we have here? I'd probably better use the same
+        * stack layout as OSF/1, just in case we ever want to try
+        * running their binaries.. 
+        *
+        * This is the basic layout, but I don't know if we'll ever
+        * actually fill in all the values..
+        */
+        long           sc_onstack;
+        long           sc_mask;
+        long           sc_pc;
+        long           sc_ps;
+        long           sc_regs[32];
+        long           sc_ownedfp;
+        long           sc_fpregs[32];
+        unsigned long  sc_fpcr;
+        unsigned long  sc_fp_control;
+        unsigned long  sc_reserved1, sc_reserved2;
+        unsigned long  sc_ssize;
+        char *         sc_sbase;
+        unsigned long  sc_traparg_a0;
+        unsigned long  sc_traparg_a1;
+        unsigned long  sc_traparg_a2;
+        unsigned long  sc_fp_trap_pc;
+        unsigned long  sc_fp_trigger_sum;
+        unsigned long  sc_fp_trigger_inst;
+};
+
+
+#endif
diff --git a/arch/alpha/include/asm/siginfo.h b/arch/alpha/include/asm/siginfo.h
new file mode 100644 (file)
index 0000000..9822362
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef _ALPHA_SIGINFO_H
+#define _ALPHA_SIGINFO_H
+
+#define __ARCH_SI_PREAMBLE_SIZE                (4 * sizeof(int))
+#define __ARCH_SI_TRAPNO
+
+#include <asm-generic/siginfo.h>
+
+#endif
diff --git a/arch/alpha/include/asm/signal.h b/arch/alpha/include/asm/signal.h
new file mode 100644 (file)
index 0000000..13c2305
--- /dev/null
@@ -0,0 +1,172 @@
+#ifndef _ASMAXP_SIGNAL_H
+#define _ASMAXP_SIGNAL_H
+
+#include <linux/types.h>
+
+/* Avoid too many header ordering problems.  */
+struct siginfo;
+
+#ifdef __KERNEL__
+/* Digital Unix defines 64 signals.  Most things should be clean enough
+   to redefine this at will, if care is taken to make libc match.  */
+
+#define _NSIG          64
+#define _NSIG_BPW      64
+#define _NSIG_WORDS    (_NSIG / _NSIG_BPW)
+
+typedef unsigned long old_sigset_t;            /* at least 32 bits */
+
+typedef struct {
+       unsigned long sig[_NSIG_WORDS];
+} sigset_t;
+
+#else
+/* Here we must cater to libcs that poke about in kernel headers.  */
+
+#define NSIG           32
+typedef unsigned long sigset_t;
+
+#endif /* __KERNEL__ */
+
+
+/*
+ * Linux/AXP has different signal numbers that Linux/i386: I'm trying
+ * to make it OSF/1 binary compatible, at least for normal binaries.
+ */
+#define SIGHUP          1
+#define SIGINT          2
+#define SIGQUIT                 3
+#define SIGILL          4
+#define SIGTRAP                 5
+#define SIGABRT                 6
+#define SIGEMT          7
+#define SIGFPE          8
+#define SIGKILL                 9
+#define SIGBUS         10
+#define SIGSEGV                11
+#define SIGSYS         12
+#define SIGPIPE                13
+#define SIGALRM                14
+#define SIGTERM                15
+#define SIGURG         16
+#define SIGSTOP                17
+#define SIGTSTP                18
+#define SIGCONT                19
+#define SIGCHLD                20
+#define SIGTTIN                21
+#define SIGTTOU                22
+#define SIGIO          23
+#define SIGXCPU                24
+#define SIGXFSZ                25
+#define SIGVTALRM      26
+#define SIGPROF                27
+#define SIGWINCH       28
+#define SIGINFO                29
+#define SIGUSR1                30
+#define SIGUSR2                31
+
+#define SIGPOLL        SIGIO
+#define SIGPWR SIGINFO
+#define SIGIOT SIGABRT
+
+/* These should not be considered constants from userland.  */
+#define SIGRTMIN       32
+#define SIGRTMAX       _NSIG
+
+/*
+ * SA_FLAGS values:
+ *
+ * SA_ONSTACK indicates that a registered stack_t will be used.
+ * SA_RESTART flag to get restarting signals (which were the default long ago)
+ * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
+ * SA_RESETHAND clears the handler when the signal is delivered.
+ * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
+ * SA_NODEFER prevents the current signal from being masked in the handler.
+ *
+ * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
+ * Unix names RESETHAND and NODEFER respectively.
+ */
+
+#define SA_ONSTACK     0x00000001
+#define SA_RESTART     0x00000002
+#define SA_NOCLDSTOP   0x00000004
+#define SA_NODEFER     0x00000008
+#define SA_RESETHAND   0x00000010
+#define SA_NOCLDWAIT   0x00000020
+#define SA_SIGINFO     0x00000040
+
+#define SA_ONESHOT     SA_RESETHAND
+#define SA_NOMASK      SA_NODEFER
+
+/* 
+ * sigaltstack controls
+ */
+#define SS_ONSTACK     1
+#define SS_DISABLE     2
+
+#define MINSIGSTKSZ    4096
+#define SIGSTKSZ       16384
+
+#define SIG_BLOCK          1   /* for blocking signals */
+#define SIG_UNBLOCK        2   /* for unblocking signals */
+#define SIG_SETMASK        3   /* for setting the signal mask */
+
+#include <asm-generic/signal.h>
+
+#ifdef __KERNEL__
+struct osf_sigaction {
+       __sighandler_t  sa_handler;
+       old_sigset_t    sa_mask;
+       int             sa_flags;
+};
+
+struct sigaction {
+       __sighandler_t  sa_handler;
+       unsigned long   sa_flags;
+       sigset_t        sa_mask;        /* mask last for extensibility */
+};
+
+struct k_sigaction {
+       struct sigaction sa;
+       __sigrestore_t ka_restorer;
+};
+#else
+/* Here we must cater to libcs that poke about in kernel headers.  */
+
+struct sigaction {
+       union {
+         __sighandler_t        _sa_handler;
+         void (*_sa_sigaction)(int, struct siginfo *, void *);
+       } _u;
+       sigset_t        sa_mask;
+       int             sa_flags;
+};
+
+#define sa_handler     _u._sa_handler
+#define sa_sigaction   _u._sa_sigaction
+
+#endif /* __KERNEL__ */
+
+typedef struct sigaltstack {
+       void __user *ss_sp;
+       int ss_flags;
+       size_t ss_size;
+} stack_t;
+
+/* sigstack(2) is deprecated, and will be withdrawn in a future version
+   of the X/Open CAE Specification.  Use sigaltstack instead.  It is only
+   implemented here for OSF/1 compatibility.  */
+
+struct sigstack {
+       void __user *ss_sp;
+       int ss_onstack;
+};
+
+#ifdef __KERNEL__
+#include <asm/sigcontext.h>
+
+#define ptrace_signal_deliver(regs, cookie) do { } while (0)
+
+#endif
+
+#endif
diff --git a/arch/alpha/include/asm/smp.h b/arch/alpha/include/asm/smp.h
new file mode 100644 (file)
index 0000000..544c69a
--- /dev/null
@@ -0,0 +1,62 @@
+#ifndef __ASM_SMP_H
+#define __ASM_SMP_H
+
+#include <linux/threads.h>
+#include <linux/cpumask.h>
+#include <linux/bitops.h>
+#include <asm/pal.h>
+
+/* HACK: Cabrio WHAMI return value is bogus if more than 8 bits used.. :-( */
+
+static __inline__ unsigned char
+__hard_smp_processor_id(void)
+{
+       register unsigned char __r0 __asm__("$0");
+       __asm__ __volatile__(
+               "call_pal %1 #whami"
+               : "=r"(__r0)
+               :"i" (PAL_whami)
+               : "$1", "$22", "$23", "$24", "$25");
+       return __r0;
+}
+
+#ifdef CONFIG_SMP
+
+#include <asm/irq.h>
+
+struct cpuinfo_alpha {
+       unsigned long loops_per_jiffy;
+       unsigned long last_asn;
+       int need_new_asn;
+       int asn_lock;
+       unsigned long ipi_count;
+       unsigned long prof_multiplier;
+       unsigned long prof_counter;
+       unsigned char mcheck_expected;
+       unsigned char mcheck_taken;
+       unsigned char mcheck_extra;
+} __attribute__((aligned(64)));
+
+extern struct cpuinfo_alpha cpu_data[NR_CPUS];
+
+#define PROC_CHANGE_PENALTY     20
+
+#define hard_smp_processor_id()        __hard_smp_processor_id()
+#define raw_smp_processor_id() (current_thread_info()->cpu)
+
+extern int smp_num_cpus;
+#define cpu_possible_map       cpu_present_map
+
+extern void arch_send_call_function_single_ipi(int cpu);
+extern void arch_send_call_function_ipi(cpumask_t mask);
+
+#else /* CONFIG_SMP */
+
+#define hard_smp_processor_id()                0
+#define smp_call_function_on_cpu(func,info,wait,cpu)    ({ 0; })
+
+#endif /* CONFIG_SMP */
+
+#define NO_PROC_ID     (-1)
+
+#endif
diff --git a/arch/alpha/include/asm/socket.h b/arch/alpha/include/asm/socket.h
new file mode 100644 (file)
index 0000000..a1057c2
--- /dev/null
@@ -0,0 +1,70 @@
+#ifndef _ASM_SOCKET_H
+#define _ASM_SOCKET_H
+
+#include <asm/sockios.h>
+
+/* For setsockopt(2) */
+/*
+ * Note: we only bother about making the SOL_SOCKET options
+ * same as OSF/1, as that's all that "normal" programs are
+ * likely to set.  We don't necessarily want to be binary
+ * compatible with _everything_. 
+ */
+#define SOL_SOCKET     0xffff
+
+#define SO_DEBUG       0x0001
+#define SO_REUSEADDR   0x0004
+#define SO_KEEPALIVE   0x0008
+#define SO_DONTROUTE   0x0010
+#define SO_BROADCAST   0x0020
+#define SO_LINGER      0x0080
+#define SO_OOBINLINE   0x0100
+/* To add :#define SO_REUSEPORT 0x0200 */
+
+#define SO_TYPE                0x1008
+#define SO_ERROR       0x1007
+#define SO_SNDBUF      0x1001
+#define SO_RCVBUF      0x1002
+#define SO_SNDBUFFORCE 0x100a
+#define SO_RCVBUFFORCE 0x100b
+#define        SO_RCVLOWAT     0x1010
+#define        SO_SNDLOWAT     0x1011
+#define        SO_RCVTIMEO     0x1012
+#define        SO_SNDTIMEO     0x1013
+#define SO_ACCEPTCONN  0x1014
+
+/* linux-specific, might as well be the same as on i386 */
+#define SO_NO_CHECK    11
+#define SO_PRIORITY    12
+#define SO_BSDCOMPAT   14
+
+#define SO_PASSCRED    17
+#define SO_PEERCRED    18
+#define SO_BINDTODEVICE 25
+
+/* Socket filtering */
+#define SO_ATTACH_FILTER        26
+#define SO_DETACH_FILTER        27
+
+#define SO_PEERNAME            28
+#define SO_TIMESTAMP           29
+#define SCM_TIMESTAMP          SO_TIMESTAMP
+
+#define SO_PEERSEC             30
+#define SO_PASSSEC             34
+#define SO_TIMESTAMPNS         35
+#define SCM_TIMESTAMPNS                SO_TIMESTAMPNS
+
+/* Security levels - as per NRL IPv6 - don't actually do anything */
+#define SO_SECURITY_AUTHENTICATION             19
+#define SO_SECURITY_ENCRYPTION_TRANSPORT       20
+#define SO_SECURITY_ENCRYPTION_NETWORK         21
+
+#define SO_MARK                        36
+
+/* O_NONBLOCK clashes with the bits used for socket types.  Therefore we
+ * have to define SOCK_NONBLOCK to a different value here.
+ */
+#define SOCK_NONBLOCK  0x40000000
+
+#endif /* _ASM_SOCKET_H */
diff --git a/arch/alpha/include/asm/sockios.h b/arch/alpha/include/asm/sockios.h
new file mode 100644 (file)
index 0000000..7932c7a
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef _ASM_ALPHA_SOCKIOS_H
+#define _ASM_ALPHA_SOCKIOS_H
+
+/* Socket-level I/O control calls. */
+
+#define FIOGETOWN      _IOR('f', 123, int)
+#define FIOSETOWN      _IOW('f', 124, int)
+
+#define SIOCATMARK     _IOR('s', 7, int)
+#define SIOCSPGRP      _IOW('s', 8, pid_t)
+#define SIOCGPGRP      _IOR('s', 9, pid_t)
+
+#define SIOCGSTAMP     0x8906          /* Get stamp (timeval) */
+#define SIOCGSTAMPNS   0x8907          /* Get stamp (timespec) */
+
+#endif /* _ASM_ALPHA_SOCKIOS_H */
diff --git a/arch/alpha/include/asm/spinlock.h b/arch/alpha/include/asm/spinlock.h
new file mode 100644 (file)
index 0000000..aeeb125
--- /dev/null
@@ -0,0 +1,173 @@
+#ifndef _ALPHA_SPINLOCK_H
+#define _ALPHA_SPINLOCK_H
+
+#include <asm/system.h>
+#include <linux/kernel.h>
+#include <asm/current.h>
+
+/*
+ * Simple spin lock operations.  There are two variants, one clears IRQ's
+ * on the local processor, one does not.
+ *
+ * We make no fairness assumptions. They have a cost.
+ */
+
+#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
+#define __raw_spin_is_locked(x)        ((x)->lock != 0)
+#define __raw_spin_unlock_wait(x) \
+               do { cpu_relax(); } while ((x)->lock)
+
+static inline void __raw_spin_unlock(raw_spinlock_t * lock)
+{
+       mb();
+       lock->lock = 0;
+}
+
+static inline void __raw_spin_lock(raw_spinlock_t * lock)
+{
+       long tmp;
+
+       __asm__ __volatile__(
+       "1:     ldl_l   %0,%1\n"
+       "       bne     %0,2f\n"
+       "       lda     %0,1\n"
+       "       stl_c   %0,%1\n"
+       "       beq     %0,2f\n"
+       "       mb\n"
+       ".subsection 2\n"
+       "2:     ldl     %0,%1\n"
+       "       bne     %0,2b\n"
+       "       br      1b\n"
+       ".previous"
+       : "=&r" (tmp), "=m" (lock->lock)
+       : "m"(lock->lock) : "memory");
+}
+
+static inline int __raw_spin_trylock(raw_spinlock_t *lock)
+{
+       return !test_and_set_bit(0, &lock->lock);
+}
+
+/***********************************************************/
+
+static inline int __raw_read_can_lock(raw_rwlock_t *lock)
+{
+       return (lock->lock & 1) == 0;
+}
+
+static inline int __raw_write_can_lock(raw_rwlock_t *lock)
+{
+       return lock->lock == 0;
+}
+
+static inline void __raw_read_lock(raw_rwlock_t *lock)
+{
+       long regx;
+
+       __asm__ __volatile__(
+       "1:     ldl_l   %1,%0\n"
+       "       blbs    %1,6f\n"
+       "       subl    %1,2,%1\n"
+       "       stl_c   %1,%0\n"
+       "       beq     %1,6f\n"
+       "       mb\n"
+       ".subsection 2\n"
+       "6:     ldl     %1,%0\n"
+       "       blbs    %1,6b\n"
+       "       br      1b\n"
+       ".previous"
+       : "=m" (*lock), "=&r" (regx)
+       : "m" (*lock) : "memory");
+}
+
+static inline void __raw_write_lock(raw_rwlock_t *lock)
+{
+       long regx;
+
+       __asm__ __volatile__(
+       "1:     ldl_l   %1,%0\n"
+       "       bne     %1,6f\n"
+       "       lda     %1,1\n"
+       "       stl_c   %1,%0\n"
+       "       beq     %1,6f\n"
+       "       mb\n"
+       ".subsection 2\n"
+       "6:     ldl     %1,%0\n"
+       "       bne     %1,6b\n"
+       "       br      1b\n"
+       ".previous"
+       : "=m" (*lock), "=&r" (regx)
+       : "m" (*lock) : "memory");
+}
+
+static inline int __raw_read_trylock(raw_rwlock_t * lock)
+{
+       long regx;
+       int success;
+
+       __asm__ __volatile__(
+       "1:     ldl_l   %1,%0\n"
+       "       lda     %2,0\n"
+       "       blbs    %1,2f\n"
+       "       subl    %1,2,%2\n"
+       "       stl_c   %2,%0\n"
+       "       beq     %2,6f\n"
+       "2:     mb\n"
+       ".subsection 2\n"
+       "6:     br      1b\n"
+       ".previous"
+       : "=m" (*lock), "=&r" (regx), "=&r" (success)
+       : "m" (*lock) : "memory");
+
+       return success;
+}
+
+static inline int __raw_write_trylock(raw_rwlock_t * lock)
+{
+       long regx;
+       int success;
+
+       __asm__ __volatile__(
+       "1:     ldl_l   %1,%0\n"
+       "       lda     %2,0\n"
+       "       bne     %1,2f\n"
+       "       lda     %2,1\n"
+       "       stl_c   %2,%0\n"
+       "       beq     %2,6f\n"
+       "2:     mb\n"
+       ".subsection 2\n"
+       "6:     br      1b\n"
+       ".previous"
+       : "=m" (*lock), "=&r" (regx), "=&r" (success)
+       : "m" (*lock) : "memory");
+
+       return success;
+}
+
+static inline void __raw_read_unlock(raw_rwlock_t * lock)
+{
+       long regx;
+       __asm__ __volatile__(
+       "       mb\n"
+       "1:     ldl_l   %1,%0\n"
+       "       addl    %1,2,%1\n"
+       "       stl_c   %1,%0\n"
+       "       beq     %1,6f\n"
+       ".subsection 2\n"
+       "6:     br      1b\n"
+       ".previous"
+       : "=m" (*lock), "=&r" (regx)
+       : "m" (*lock) : "memory");
+}
+
+static inline void __raw_write_unlock(raw_rwlock_t * lock)
+{
+       mb();
+       lock->lock = 0;
+}
+
+#define _raw_spin_relax(lock)  cpu_relax()
+#define _raw_read_relax(lock)  cpu_relax()
+#define _raw_write_relax(lock) cpu_relax()
+
+#endif /* _ALPHA_SPINLOCK_H */
diff --git a/arch/alpha/include/asm/spinlock_types.h b/arch/alpha/include/asm/spinlock_types.h
new file mode 100644 (file)
index 0000000..8141eb5
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef _ALPHA_SPINLOCK_TYPES_H
+#define _ALPHA_SPINLOCK_TYPES_H
+
+#ifndef __LINUX_SPINLOCK_TYPES_H
+# error "please don't include this file directly"
+#endif
+
+typedef struct {
+       volatile unsigned int lock;
+} raw_spinlock_t;
+
+#define __RAW_SPIN_LOCK_UNLOCKED       { 0 }
+
+typedef struct {
+       volatile unsigned int lock;
+} raw_rwlock_t;
+
+#define __RAW_RW_LOCK_UNLOCKED         { 0 }
+
+#endif
diff --git a/arch/alpha/include/asm/stat.h b/arch/alpha/include/asm/stat.h
new file mode 100644 (file)
index 0000000..07ad3e6
--- /dev/null
@@ -0,0 +1,48 @@
+#ifndef _ALPHA_STAT_H
+#define _ALPHA_STAT_H
+
+struct stat {
+       unsigned int    st_dev;
+       unsigned int    st_ino;
+       unsigned int    st_mode;
+       unsigned int    st_nlink;
+       unsigned int    st_uid;
+       unsigned int    st_gid;
+       unsigned int    st_rdev;
+       long            st_size;
+       unsigned long   st_atime;
+       unsigned long   st_mtime;
+       unsigned long   st_ctime;
+       unsigned int    st_blksize;
+       unsigned int    st_blocks;
+       unsigned int    st_flags;
+       unsigned int    st_gen;
+};
+
+/* The stat64 structure increases the size of dev_t, blkcnt_t, adds
+   nanosecond resolution times, and padding for expansion.  */
+
+struct stat64 {
+       unsigned long   st_dev;
+       unsigned long   st_ino;
+       unsigned long   st_rdev;
+       long            st_size;
+       unsigned long   st_blocks;
+
+       unsigned int    st_mode;
+       unsigned int    st_uid;
+       unsigned int    st_gid;
+       unsigned int    st_blksize;
+       unsigned int    st_nlink;
+       unsigned int    __pad0;
+
+       unsigned long   st_atime;
+       unsigned long   st_atime_nsec; 
+       unsigned long   st_mtime;
+       unsigned long   st_mtime_nsec;
+       unsigned long   st_ctime;
+       unsigned long   st_ctime_nsec;
+       long            __unused[3];
+};
+
+#endif
diff --git a/arch/alpha/include/asm/statfs.h b/arch/alpha/include/asm/statfs.h
new file mode 100644 (file)
index 0000000..ad15830
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _ALPHA_STATFS_H
+#define _ALPHA_STATFS_H
+
+#include <asm-generic/statfs.h>
+
+#endif
diff --git a/arch/alpha/include/asm/string.h b/arch/alpha/include/asm/string.h
new file mode 100644 (file)
index 0000000..b02b8a2
--- /dev/null
@@ -0,0 +1,66 @@
+#ifndef __ALPHA_STRING_H__
+#define __ALPHA_STRING_H__
+
+#ifdef __KERNEL__
+
+/*
+ * GCC of any recent vintage doesn't do stupid things with bcopy.
+ * EGCS 1.1 knows all about expanding memcpy inline, others don't.
+ *
+ * Similarly for a memset with data = 0.
+ */
+
+#define __HAVE_ARCH_MEMCPY
+extern void * memcpy(void *, const void *, size_t);
+#define __HAVE_ARCH_MEMMOVE
+extern void * memmove(void *, const void *, size_t);
+
+/* For backward compatibility with modules.  Unused otherwise.  */
+extern void * __memcpy(void *, const void *, size_t);
+
+#define memcpy __builtin_memcpy
+
+#define __HAVE_ARCH_MEMSET
+extern void * __constant_c_memset(void *, unsigned long, size_t);
+extern void * __memset(void *, int, size_t);
+extern void * memset(void *, int, size_t);
+
+#define memset(s, c, n)                                                            \
+(__builtin_constant_p(c)                                                   \
+ ? (__builtin_constant_p(n) && (c) == 0                                            \
+    ? __builtin_memset((s),0,(n))                                          \
+    : __constant_c_memset((s),0x0101010101010101UL*(unsigned char)(c),(n))) \
+ : __memset((s),(c),(n)))
+
+#define __HAVE_ARCH_STRCPY
+extern char * strcpy(char *,const char *);
+#define __HAVE_ARCH_STRNCPY
+extern char * strncpy(char *, const char *, size_t);
+#define __HAVE_ARCH_STRCAT
+extern char * strcat(char *, const char *);
+#define __HAVE_ARCH_STRNCAT
+extern char * strncat(char *, const char *, size_t);
+#define __HAVE_ARCH_STRCHR
+extern char * strchr(const char *,int);
+#define __HAVE_ARCH_STRRCHR
+extern char * strrchr(const char *,int);
+#define __HAVE_ARCH_STRLEN
+extern size_t strlen(const char *);
+#define __HAVE_ARCH_MEMCHR
+extern void * memchr(const void *, int, size_t);
+
+/* The following routine is like memset except that it writes 16-bit
+   aligned values.  The DEST and COUNT parameters must be even for 
+   correct operation.  */
+
+#define __HAVE_ARCH_MEMSETW
+extern void * __memsetw(void *dest, unsigned short, size_t count);
+
+#define memsetw(s, c, n)                                                \
+(__builtin_constant_p(c)                                                \
+ ? __constant_c_memset((s),0x0001000100010001UL*(unsigned short)(c),(n)) \
+ : __memsetw((s),(c),(n)))
+
+#endif /* __KERNEL__ */
+
+#endif /* __ALPHA_STRING_H__ */
diff --git a/arch/alpha/include/asm/suspend.h b/arch/alpha/include/asm/suspend.h
new file mode 100644 (file)
index 0000000..c7042d5
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_SUSPEND_H
+#define __ALPHA_SUSPEND_H
+
+/* Dummy include. */
+
+#endif  /* __ALPHA_SUSPEND_H */
diff --git a/arch/alpha/include/asm/sysinfo.h b/arch/alpha/include/asm/sysinfo.h
new file mode 100644 (file)
index 0000000..086aba2
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * include/asm-alpha/sysinfo.h
+ */
+
+#ifndef __ASM_ALPHA_SYSINFO_H
+#define __ASM_ALPHA_SYSINFO_H
+
+/* This defines the subset of the OSF/1 getsysinfo/setsysinfo calls
+   that we support.  */
+
+#define GSI_UACPROC                    8
+#define GSI_IEEE_FP_CONTROL            45
+#define GSI_IEEE_STATE_AT_SIGNAL       46
+#define GSI_PROC_TYPE                  60
+#define GSI_GET_HWRPB                  101
+
+#define SSI_NVPAIRS                    1
+#define SSI_IEEE_FP_CONTROL            14
+#define SSI_IEEE_STATE_AT_SIGNAL       15
+#define SSI_IEEE_IGNORE_STATE_AT_SIGNAL        16
+#define SSI_IEEE_RAISE_EXCEPTION       1001    /* linux specific */
+
+#define SSIN_UACPROC                   6
+
+#define UAC_BITMASK                    7
+#define UAC_NOPRINT                    1
+#define UAC_NOFIX                      2
+#define UAC_SIGBUS                     4
+
+
+#ifdef __KERNEL__
+
+/* This is the shift that is applied to the UAC bits as stored in the
+   per-thread flags.  See thread_info.h.  */
+#define UAC_SHIFT                      6
+
+#endif
+
+#endif /* __ASM_ALPHA_SYSINFO_H */
diff --git a/arch/alpha/include/asm/system.h b/arch/alpha/include/asm/system.h
new file mode 100644 (file)
index 0000000..afe20fa
--- /dev/null
@@ -0,0 +1,829 @@
+#ifndef __ALPHA_SYSTEM_H
+#define __ALPHA_SYSTEM_H
+
+#include <asm/pal.h>
+#include <asm/page.h>
+#include <asm/barrier.h>
+
+/*
+ * System defines.. Note that this is included both from .c and .S
+ * files, so it does only defines, not any C code.
+ */
+
+/*
+ * We leave one page for the initial stack page, and one page for
+ * the initial process structure. Also, the console eats 3 MB for
+ * the initial bootloader (one of which we can reclaim later).
+ */
+#define BOOT_PCB       0x20000000
+#define BOOT_ADDR      0x20000000
+/* Remove when official MILO sources have ELF support: */
+#define BOOT_SIZE      (16*1024)
+
+#ifdef CONFIG_ALPHA_LEGACY_START_ADDRESS
+#define KERNEL_START_PHYS      0x300000 /* Old bootloaders hardcoded this.  */
+#else
+#define KERNEL_START_PHYS      0x1000000 /* required: Wildfire/Titan/Marvel */
+#endif
+
+#define KERNEL_START   (PAGE_OFFSET+KERNEL_START_PHYS)
+#define SWAPPER_PGD    KERNEL_START
+#define INIT_STACK     (PAGE_OFFSET+KERNEL_START_PHYS+0x02000)
+#define EMPTY_PGT      (PAGE_OFFSET+KERNEL_START_PHYS+0x04000)
+#define EMPTY_PGE      (PAGE_OFFSET+KERNEL_START_PHYS+0x08000)
+#define ZERO_PGE       (PAGE_OFFSET+KERNEL_START_PHYS+0x0A000)
+
+#define START_ADDR     (PAGE_OFFSET+KERNEL_START_PHYS+0x10000)
+
+/*
+ * This is setup by the secondary bootstrap loader.  Because
+ * the zero page is zeroed out as soon as the vm system is
+ * initialized, we need to copy things out into a more permanent
+ * place.
+ */
+#define PARAM                  ZERO_PGE
+#define COMMAND_LINE           ((char*)(PARAM + 0x0000))
+#define INITRD_START           (*(unsigned long *) (PARAM+0x100))
+#define INITRD_SIZE            (*(unsigned long *) (PARAM+0x108))
+
+#ifndef __ASSEMBLY__
+#include <linux/kernel.h>
+#define AT_VECTOR_SIZE_ARCH 4 /* entries in ARCH_DLINFO */
+
+/*
+ * This is the logout header that should be common to all platforms
+ * (assuming they are running OSF/1 PALcode, I guess).
+ */
+struct el_common {
+       unsigned int    size;           /* size in bytes of logout area */
+       unsigned int    sbz1    : 30;   /* should be zero */
+       unsigned int    err2    :  1;   /* second error */
+       unsigned int    retry   :  1;   /* retry flag */
+       unsigned int    proc_offset;    /* processor-specific offset */
+       unsigned int    sys_offset;     /* system-specific offset */
+       unsigned int    code;           /* machine check code */
+       unsigned int    frame_rev;      /* frame revision */
+};
+
+/* Machine Check Frame for uncorrectable errors (Large format)
+ *      --- This is used to log uncorrectable errors such as
+ *          double bit ECC errors.
+ *      --- These errors are detected by both processor and systems.
+ */
+struct el_common_EV5_uncorrectable_mcheck {
+        unsigned long   shadow[8];        /* Shadow reg. 8-14, 25           */
+        unsigned long   paltemp[24];      /* PAL TEMP REGS.                 */
+        unsigned long   exc_addr;         /* Address of excepting instruction*/
+        unsigned long   exc_sum;          /* Summary of arithmetic traps.   */
+        unsigned long   exc_mask;         /* Exception mask (from exc_sum). */
+        unsigned long   pal_base;         /* Base address for PALcode.      */
+        unsigned long   isr;              /* Interrupt Status Reg.          */
+        unsigned long   icsr;             /* CURRENT SETUP OF EV5 IBOX      */
+        unsigned long   ic_perr_stat;     /* I-CACHE Reg. <11> set Data parity
+                                                         <12> set TAG parity*/
+        unsigned long   dc_perr_stat;     /* D-CACHE error Reg. Bits set to 1:
+                                                     <2> Data error in bank 0
+                                                     <3> Data error in bank 1
+                                                     <4> Tag error in bank 0
+                                                     <5> Tag error in bank 1 */
+        unsigned long   va;               /* Effective VA of fault or miss. */
+        unsigned long   mm_stat;          /* Holds the reason for D-stream 
+                                             fault or D-cache parity errors */
+        unsigned long   sc_addr;          /* Address that was being accessed
+                                             when EV5 detected Secondary cache
+                                             failure.                 */
+        unsigned long   sc_stat;          /* Helps determine if the error was
+                                             TAG/Data parity(Secondary Cache)*/
+        unsigned long   bc_tag_addr;      /* Contents of EV5 BC_TAG_ADDR    */
+        unsigned long   ei_addr;          /* Physical address of any transfer
+                                             that is logged in EV5 EI_STAT */
+        unsigned long   fill_syndrome;    /* For correcting ECC errors.     */
+        unsigned long   ei_stat;          /* Helps identify reason of any 
+                                             processor uncorrectable error
+                                             at its external interface.     */
+        unsigned long   ld_lock;          /* Contents of EV5 LD_LOCK register*/
+};
+
+struct el_common_EV6_mcheck {
+       unsigned int FrameSize;         /* Bytes, including this field */
+       unsigned int FrameFlags;        /* <31> = Retry, <30> = Second Error */
+       unsigned int CpuOffset;         /* Offset to CPU-specific info */
+       unsigned int SystemOffset;      /* Offset to system-specific info */
+       unsigned int MCHK_Code;
+       unsigned int MCHK_Frame_Rev;
+       unsigned long I_STAT;           /* EV6 Internal Processor Registers */
+       unsigned long DC_STAT;          /* (See the 21264 Spec) */
+       unsigned long C_ADDR;
+       unsigned long DC1_SYNDROME;
+       unsigned long DC0_SYNDROME;
+       unsigned long C_STAT;
+       unsigned long C_STS;
+       unsigned long MM_STAT;
+       unsigned long EXC_ADDR;
+       unsigned long IER_CM;
+       unsigned long ISUM;
+       unsigned long RESERVED0;
+       unsigned long PAL_BASE;
+       unsigned long I_CTL;
+       unsigned long PCTX;
+};
+
+extern void halt(void) __attribute__((noreturn));
+#define __halt() __asm__ __volatile__ ("call_pal %0 #halt" : : "i" (PAL_halt))
+
+#define switch_to(P,N,L)                                                \
+  do {                                                                  \
+    (L) = alpha_switch_to(virt_to_phys(&task_thread_info(N)->pcb), (P)); \
+    check_mmu_context();                                                \
+  } while (0)
+
+struct task_struct;
+extern struct task_struct *alpha_switch_to(unsigned long, struct task_struct*);
+
+#define imb() \
+__asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory")
+
+#define draina() \
+__asm__ __volatile__ ("call_pal %0 #draina" : : "i" (PAL_draina) : "memory")
+
+enum implver_enum {
+       IMPLVER_EV4,
+       IMPLVER_EV5,
+       IMPLVER_EV6
+};
+
+#ifdef CONFIG_ALPHA_GENERIC
+#define implver()                              \
+({ unsigned long __implver;                    \
+   __asm__ ("implver %0" : "=r"(__implver));   \
+   (enum implver_enum) __implver; })
+#else
+/* Try to eliminate some dead code.  */
+#ifdef CONFIG_ALPHA_EV4
+#define implver() IMPLVER_EV4
+#endif
+#ifdef CONFIG_ALPHA_EV5
+#define implver() IMPLVER_EV5
+#endif
+#if defined(CONFIG_ALPHA_EV6)
+#define implver() IMPLVER_EV6
+#endif
+#endif
+
+enum amask_enum {
+       AMASK_BWX = (1UL << 0),
+       AMASK_FIX = (1UL << 1),
+       AMASK_CIX = (1UL << 2),
+       AMASK_MAX = (1UL << 8),
+       AMASK_PRECISE_TRAP = (1UL << 9),
+};
+
+#define amask(mask)                                            \
+({ unsigned long __amask, __input = (mask);                    \
+   __asm__ ("amask %1,%0" : "=r"(__amask) : "rI"(__input));    \
+   __amask; })
+
+#define __CALL_PAL_R0(NAME, TYPE)                              \
+extern inline TYPE NAME(void)                                  \
+{                                                              \
+       register TYPE __r0 __asm__("$0");                       \
+       __asm__ __volatile__(                                   \
+               "call_pal %1 # " #NAME                          \
+               :"=r" (__r0)                                    \
+               :"i" (PAL_ ## NAME)                             \
+               :"$1", "$16", "$22", "$23", "$24", "$25");      \
+       return __r0;                                            \
+}
+
+#define __CALL_PAL_W1(NAME, TYPE0)                             \
+extern inline void NAME(TYPE0 arg0)                            \
+{                                                              \
+       register TYPE0 __r16 __asm__("$16") = arg0;             \
+       __asm__ __volatile__(                                   \
+               "call_pal %1 # "#NAME                           \
+               : "=r"(__r16)                                   \
+               : "i"(PAL_ ## NAME), "0"(__r16)                 \
+               : "$1", "$22", "$23", "$24", "$25");            \
+}
+
+#define __CALL_PAL_W2(NAME, TYPE0, TYPE1)                      \
+extern inline void NAME(TYPE0 arg0, TYPE1 arg1)                        \
+{                                                              \
+       register TYPE0 __r16 __asm__("$16") = arg0;             \
+       register TYPE1 __r17 __asm__("$17") = arg1;             \
+       __asm__ __volatile__(                                   \
+               "call_pal %2 # "#NAME                           \
+               : "=r"(__r16), "=r"(__r17)                      \
+               : "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17)     \
+               : "$1", "$22", "$23", "$24", "$25");            \
+}
+
+#define __CALL_PAL_RW1(NAME, RTYPE, TYPE0)                     \
+extern inline RTYPE NAME(TYPE0 arg0)                           \
+{                                                              \
+       register RTYPE __r0 __asm__("$0");                      \
+       register TYPE0 __r16 __asm__("$16") = arg0;             \
+       __asm__ __volatile__(                                   \
+               "call_pal %2 # "#NAME                           \
+               : "=r"(__r16), "=r"(__r0)                       \
+               : "i"(PAL_ ## NAME), "0"(__r16)                 \
+               : "$1", "$22", "$23", "$24", "$25");            \
+       return __r0;                                            \
+}
+
+#define __CALL_PAL_RW2(NAME, RTYPE, TYPE0, TYPE1)              \
+extern inline RTYPE NAME(TYPE0 arg0, TYPE1 arg1)               \
+{                                                              \
+       register RTYPE __r0 __asm__("$0");                      \
+       register TYPE0 __r16 __asm__("$16") = arg0;             \
+       register TYPE1 __r17 __asm__("$17") = arg1;             \
+       __asm__ __volatile__(                                   \
+               "call_pal %3 # "#NAME                           \
+               : "=r"(__r16), "=r"(__r17), "=r"(__r0)          \
+               : "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17)     \
+               : "$1", "$22", "$23", "$24", "$25");            \
+       return __r0;                                            \
+}
+
+__CALL_PAL_W1(cflush, unsigned long);
+__CALL_PAL_R0(rdmces, unsigned long);
+__CALL_PAL_R0(rdps, unsigned long);
+__CALL_PAL_R0(rdusp, unsigned long);
+__CALL_PAL_RW1(swpipl, unsigned long, unsigned long);
+__CALL_PAL_R0(whami, unsigned long);
+__CALL_PAL_W2(wrent, void*, unsigned long);
+__CALL_PAL_W1(wripir, unsigned long);
+__CALL_PAL_W1(wrkgp, unsigned long);
+__CALL_PAL_W1(wrmces, unsigned long);
+__CALL_PAL_RW2(wrperfmon, unsigned long, unsigned long, unsigned long);
+__CALL_PAL_W1(wrusp, unsigned long);
+__CALL_PAL_W1(wrvptptr, unsigned long);
+
+#define IPL_MIN                0
+#define IPL_SW0                1
+#define IPL_SW1                2
+#define IPL_DEV0       3
+#define IPL_DEV1       4
+#define IPL_TIMER      5
+#define IPL_PERF       6
+#define IPL_POWERFAIL  6
+#define IPL_MCHECK     7
+#define IPL_MAX                7
+
+#ifdef CONFIG_ALPHA_BROKEN_IRQ_MASK
+#undef IPL_MIN
+#define IPL_MIN                __min_ipl
+extern int __min_ipl;
+#endif
+
+#define getipl()               (rdps() & 7)
+#define setipl(ipl)            ((void) swpipl(ipl))
+
+#define local_irq_disable()                    do { setipl(IPL_MAX); barrier(); } while(0)
+#define local_irq_enable()                     do { barrier(); setipl(IPL_MIN); } while(0)
+#define local_save_flags(flags)        ((flags) = rdps())
+#define local_irq_save(flags)  do { (flags) = swpipl(IPL_MAX); barrier(); } while(0)
+#define local_irq_restore(flags)       do { barrier(); setipl(flags); barrier(); } while(0)
+
+#define irqs_disabled()        (getipl() == IPL_MAX)
+
+/*
+ * TB routines..
+ */
+#define __tbi(nr,arg,arg1...)                                  \
+({                                                             \
+       register unsigned long __r16 __asm__("$16") = (nr);     \
+       register unsigned long __r17 __asm__("$17"); arg;       \
+       __asm__ __volatile__(                                   \
+               "call_pal %3 #__tbi"                            \
+               :"=r" (__r16),"=r" (__r17)                      \
+               :"0" (__r16),"i" (PAL_tbi) ,##arg1              \
+               :"$0", "$1", "$22", "$23", "$24", "$25");       \
+})
+
+#define tbi(x,y)       __tbi(x,__r17=(y),"1" (__r17))
+#define tbisi(x)       __tbi(1,__r17=(x),"1" (__r17))
+#define tbisd(x)       __tbi(2,__r17=(x),"1" (__r17))
+#define tbis(x)                __tbi(3,__r17=(x),"1" (__r17))
+#define tbiap()                __tbi(-1, /* no second argument */)
+#define tbia()         __tbi(-2, /* no second argument */)
+
+/*
+ * Atomic exchange.
+ * Since it can be used to implement critical sections
+ * it must clobber "memory" (also for interrupts in UP).
+ */
+
+static inline unsigned long
+__xchg_u8(volatile char *m, unsigned long val)
+{
+       unsigned long ret, tmp, addr64;
+
+       __asm__ __volatile__(
+       "       andnot  %4,7,%3\n"
+       "       insbl   %1,%4,%1\n"
+       "1:     ldq_l   %2,0(%3)\n"
+       "       extbl   %2,%4,%0\n"
+       "       mskbl   %2,%4,%2\n"
+       "       or      %1,%2,%2\n"
+       "       stq_c   %2,0(%3)\n"
+       "       beq     %2,2f\n"
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       ".subsection 2\n"
+       "2:     br      1b\n"
+       ".previous"
+       : "=&r" (ret), "=&r" (val), "=&r" (tmp), "=&r" (addr64)
+       : "r" ((long)m), "1" (val) : "memory");
+
+       return ret;
+}
+
+static inline unsigned long
+__xchg_u16(volatile short *m, unsigned long val)
+{
+       unsigned long ret, tmp, addr64;
+
+       __asm__ __volatile__(
+       "       andnot  %4,7,%3\n"
+       "       inswl   %1,%4,%1\n"
+       "1:     ldq_l   %2,0(%3)\n"
+       "       extwl   %2,%4,%0\n"
+       "       mskwl   %2,%4,%2\n"
+       "       or      %1,%2,%2\n"
+       "       stq_c   %2,0(%3)\n"
+       "       beq     %2,2f\n"
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       ".subsection 2\n"
+       "2:     br      1b\n"
+       ".previous"
+       : "=&r" (ret), "=&r" (val), "=&r" (tmp), "=&r" (addr64)
+       : "r" ((long)m), "1" (val) : "memory");
+
+       return ret;
+}
+
+static inline unsigned long
+__xchg_u32(volatile int *m, unsigned long val)
+{
+       unsigned long dummy;
+
+       __asm__ __volatile__(
+       "1:     ldl_l %0,%4\n"
+       "       bis $31,%3,%1\n"
+       "       stl_c %1,%2\n"
+       "       beq %1,2f\n"
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       : "=&r" (val), "=&r" (dummy), "=m" (*m)
+       : "rI" (val), "m" (*m) : "memory");
+
+       return val;
+}
+
+static inline unsigned long
+__xchg_u64(volatile long *m, unsigned long val)
+{
+       unsigned long dummy;
+
+       __asm__ __volatile__(
+       "1:     ldq_l %0,%4\n"
+       "       bis $31,%3,%1\n"
+       "       stq_c %1,%2\n"
+       "       beq %1,2f\n"
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       : "=&r" (val), "=&r" (dummy), "=m" (*m)
+       : "rI" (val), "m" (*m) : "memory");
+
+       return val;
+}
+
+/* This function doesn't exist, so you'll get a linker error
+   if something tries to do an invalid xchg().  */
+extern void __xchg_called_with_bad_pointer(void);
+
+#define __xchg(ptr, x, size) \
+({ \
+       unsigned long __xchg__res; \
+       volatile void *__xchg__ptr = (ptr); \
+       switch (size) { \
+               case 1: __xchg__res = __xchg_u8(__xchg__ptr, x); break; \
+               case 2: __xchg__res = __xchg_u16(__xchg__ptr, x); break; \
+               case 4: __xchg__res = __xchg_u32(__xchg__ptr, x); break; \
+               case 8: __xchg__res = __xchg_u64(__xchg__ptr, x); break; \
+               default: __xchg_called_with_bad_pointer(); __xchg__res = x; \
+       } \
+       __xchg__res; \
+})
+
+#define xchg(ptr,x)                                                         \
+  ({                                                                        \
+     __typeof__(*(ptr)) _x_ = (x);                                          \
+     (__typeof__(*(ptr))) __xchg((ptr), (unsigned long)_x_, sizeof(*(ptr))); \
+  })
+
+static inline unsigned long
+__xchg_u8_local(volatile char *m, unsigned long val)
+{
+       unsigned long ret, tmp, addr64;
+
+       __asm__ __volatile__(
+       "       andnot  %4,7,%3\n"
+       "       insbl   %1,%4,%1\n"
+       "1:     ldq_l   %2,0(%3)\n"
+       "       extbl   %2,%4,%0\n"
+       "       mskbl   %2,%4,%2\n"
+       "       or      %1,%2,%2\n"
+       "       stq_c   %2,0(%3)\n"
+       "       beq     %2,2f\n"
+       ".subsection 2\n"
+       "2:     br      1b\n"
+       ".previous"
+       : "=&r" (ret), "=&r" (val), "=&r" (tmp), "=&r" (addr64)
+       : "r" ((long)m), "1" (val) : "memory");
+
+       return ret;
+}
+
+static inline unsigned long
+__xchg_u16_local(volatile short *m, unsigned long val)
+{
+       unsigned long ret, tmp, addr64;
+
+       __asm__ __volatile__(
+       "       andnot  %4,7,%3\n"
+       "       inswl   %1,%4,%1\n"
+       "1:     ldq_l   %2,0(%3)\n"
+       "       extwl   %2,%4,%0\n"
+       "       mskwl   %2,%4,%2\n"
+       "       or      %1,%2,%2\n"
+       "       stq_c   %2,0(%3)\n"
+       "       beq     %2,2f\n"
+       ".subsection 2\n"
+       "2:     br      1b\n"
+       ".previous"
+       : "=&r" (ret), "=&r" (val), "=&r" (tmp), "=&r" (addr64)
+       : "r" ((long)m), "1" (val) : "memory");
+
+       return ret;
+}
+
+static inline unsigned long
+__xchg_u32_local(volatile int *m, unsigned long val)
+{
+       unsigned long dummy;
+
+       __asm__ __volatile__(
+       "1:     ldl_l %0,%4\n"
+       "       bis $31,%3,%1\n"
+       "       stl_c %1,%2\n"
+       "       beq %1,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       : "=&r" (val), "=&r" (dummy), "=m" (*m)
+       : "rI" (val), "m" (*m) : "memory");
+
+       return val;
+}
+
+static inline unsigned long
+__xchg_u64_local(volatile long *m, unsigned long val)
+{
+       unsigned long dummy;
+
+       __asm__ __volatile__(
+       "1:     ldq_l %0,%4\n"
+       "       bis $31,%3,%1\n"
+       "       stq_c %1,%2\n"
+       "       beq %1,2f\n"
+       ".subsection 2\n"
+       "2:     br 1b\n"
+       ".previous"
+       : "=&r" (val), "=&r" (dummy), "=m" (*m)
+       : "rI" (val), "m" (*m) : "memory");
+
+       return val;
+}
+
+#define __xchg_local(ptr, x, size) \
+({ \
+       unsigned long __xchg__res; \
+       volatile void *__xchg__ptr = (ptr); \
+       switch (size) { \
+               case 1: __xchg__res = __xchg_u8_local(__xchg__ptr, x); break; \
+               case 2: __xchg__res = __xchg_u16_local(__xchg__ptr, x); break; \
+               case 4: __xchg__res = __xchg_u32_local(__xchg__ptr, x); break; \
+               case 8: __xchg__res = __xchg_u64_local(__xchg__ptr, x); break; \
+               default: __xchg_called_with_bad_pointer(); __xchg__res = x; \
+       } \
+       __xchg__res; \
+})
+
+#define xchg_local(ptr,x)                                                   \
+  ({                                                                        \
+     __typeof__(*(ptr)) _x_ = (x);                                          \
+     (__typeof__(*(ptr))) __xchg_local((ptr), (unsigned long)_x_,           \
+               sizeof(*(ptr))); \
+  })
+
+/* 
+ * Atomic compare and exchange.  Compare OLD with MEM, if identical,
+ * store NEW in MEM.  Return the initial value in MEM.  Success is
+ * indicated by comparing RETURN with OLD.
+ *
+ * The memory barrier should be placed in SMP only when we actually
+ * make the change. If we don't change anything (so if the returned
+ * prev is equal to old) then we aren't acquiring anything new and
+ * we don't need any memory barrier as far I can tell.
+ */
+
+#define __HAVE_ARCH_CMPXCHG 1
+
+static inline unsigned long
+__cmpxchg_u8(volatile char *m, long old, long new)
+{
+       unsigned long prev, tmp, cmp, addr64;
+
+       __asm__ __volatile__(
+       "       andnot  %5,7,%4\n"
+       "       insbl   %1,%5,%1\n"
+       "1:     ldq_l   %2,0(%4)\n"
+       "       extbl   %2,%5,%0\n"
+       "       cmpeq   %0,%6,%3\n"
+       "       beq     %3,2f\n"
+       "       mskbl   %2,%5,%2\n"
+       "       or      %1,%2,%2\n"
+       "       stq_c   %2,0(%4)\n"
+       "       beq     %2,3f\n"
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       "2:\n"
+       ".subsection 2\n"
+       "3:     br      1b\n"
+       ".previous"
+       : "=&r" (prev), "=&r" (new), "=&r" (tmp), "=&r" (cmp), "=&r" (addr64)
+       : "r" ((long)m), "Ir" (old), "1" (new) : "memory");
+
+       return prev;
+}
+
+static inline unsigned long
+__cmpxchg_u16(volatile short *m, long old, long new)
+{
+       unsigned long prev, tmp, cmp, addr64;
+
+       __asm__ __volatile__(
+       "       andnot  %5,7,%4\n"
+       "       inswl   %1,%5,%1\n"
+       "1:     ldq_l   %2,0(%4)\n"
+       "       extwl   %2,%5,%0\n"
+       "       cmpeq   %0,%6,%3\n"
+       "       beq     %3,2f\n"
+       "       mskwl   %2,%5,%2\n"
+       "       or      %1,%2,%2\n"
+       "       stq_c   %2,0(%4)\n"
+       "       beq     %2,3f\n"
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       "2:\n"
+       ".subsection 2\n"
+       "3:     br      1b\n"
+       ".previous"
+       : "=&r" (prev), "=&r" (new), "=&r" (tmp), "=&r" (cmp), "=&r" (addr64)
+       : "r" ((long)m), "Ir" (old), "1" (new) : "memory");
+
+       return prev;
+}
+
+static inline unsigned long
+__cmpxchg_u32(volatile int *m, int old, int new)
+{
+       unsigned long prev, cmp;
+
+       __asm__ __volatile__(
+       "1:     ldl_l %0,%5\n"
+       "       cmpeq %0,%3,%1\n"
+       "       beq %1,2f\n"
+       "       mov %4,%1\n"
+       "       stl_c %1,%2\n"
+       "       beq %1,3f\n"
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       "2:\n"
+       ".subsection 2\n"
+       "3:     br 1b\n"
+       ".previous"
+       : "=&r"(prev), "=&r"(cmp), "=m"(*m)
+       : "r"((long) old), "r"(new), "m"(*m) : "memory");
+
+       return prev;
+}
+
+static inline unsigned long
+__cmpxchg_u64(volatile long *m, unsigned long old, unsigned long new)
+{
+       unsigned long prev, cmp;
+
+       __asm__ __volatile__(
+       "1:     ldq_l %0,%5\n"
+       "       cmpeq %0,%3,%1\n"
+       "       beq %1,2f\n"
+       "       mov %4,%1\n"
+       "       stq_c %1,%2\n"
+       "       beq %1,3f\n"
+#ifdef CONFIG_SMP
+       "       mb\n"
+#endif
+       "2:\n"
+       ".subsection 2\n"
+       "3:     br 1b\n"
+       ".previous"
+       : "=&r"(prev), "=&r"(cmp), "=m"(*m)
+       : "r"((long) old), "r"(new), "m"(*m) : "memory");
+
+       return prev;
+}
+
+/* This function doesn't exist, so you'll get a linker error
+   if something tries to do an invalid cmpxchg().  */
+extern void __cmpxchg_called_with_bad_pointer(void);
+
+static __always_inline unsigned long
+__cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)
+{
+       switch (size) {
+               case 1:
+                       return __cmpxchg_u8(ptr, old, new);
+               case 2:
+                       return __cmpxchg_u16(ptr, old, new);
+               case 4:
+                       return __cmpxchg_u32(ptr, old, new);
+               case 8:
+                       return __cmpxchg_u64(ptr, old, new);
+       }
+       __cmpxchg_called_with_bad_pointer();
+       return old;
+}
+
+#define cmpxchg(ptr, o, n)                                              \
+  ({                                                                    \
+     __typeof__(*(ptr)) _o_ = (o);                                      \
+     __typeof__(*(ptr)) _n_ = (n);                                      \
+     (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,          \
+                                   (unsigned long)_n_, sizeof(*(ptr))); \
+  })
+#define cmpxchg64(ptr, o, n)                                            \
+  ({                                                                    \
+       BUILD_BUG_ON(sizeof(*(ptr)) != 8);                               \
+       cmpxchg((ptr), (o), (n));                                        \
+  })
+
+static inline unsigned long
+__cmpxchg_u8_local(volatile char *m, long old, long new)
+{
+       unsigned long prev, tmp, cmp, addr64;
+
+       __asm__ __volatile__(
+       "       andnot  %5,7,%4\n"
+       "       insbl   %1,%5,%1\n"
+       "1:     ldq_l   %2,0(%4)\n"
+       "       extbl   %2,%5,%0\n"
+       "       cmpeq   %0,%6,%3\n"
+       "       beq     %3,2f\n"
+       "       mskbl   %2,%5,%2\n"
+       "       or      %1,%2,%2\n"
+       "       stq_c   %2,0(%4)\n"
+       "       beq     %2,3f\n"
+       "2:\n"
+       ".subsection 2\n"
+       "3:     br      1b\n"
+       ".previous"
+       : "=&r" (prev), "=&r" (new), "=&r" (tmp), "=&r" (cmp), "=&r" (addr64)
+       : "r" ((long)m), "Ir" (old), "1" (new) : "memory");
+
+       return prev;
+}
+
+static inline unsigned long
+__cmpxchg_u16_local(volatile short *m, long old, long new)
+{
+       unsigned long prev, tmp, cmp, addr64;
+
+       __asm__ __volatile__(
+       "       andnot  %5,7,%4\n"
+       "       inswl   %1,%5,%1\n"
+       "1:     ldq_l   %2,0(%4)\n"
+       "       extwl   %2,%5,%0\n"
+       "       cmpeq   %0,%6,%3\n"
+       "       beq     %3,2f\n"
+       "       mskwl   %2,%5,%2\n"
+       "       or      %1,%2,%2\n"
+       "       stq_c   %2,0(%4)\n"
+       "       beq     %2,3f\n"
+       "2:\n"
+       ".subsection 2\n"
+       "3:     br      1b\n"
+       ".previous"
+       : "=&r" (prev), "=&r" (new), "=&r" (tmp), "=&r" (cmp), "=&r" (addr64)
+       : "r" ((long)m), "Ir" (old), "1" (new) : "memory");
+
+       return prev;
+}
+
+static inline unsigned long
+__cmpxchg_u32_local(volatile int *m, int old, int new)
+{
+       unsigned long prev, cmp;
+
+       __asm__ __volatile__(
+       "1:     ldl_l %0,%5\n"
+       "       cmpeq %0,%3,%1\n"
+       "       beq %1,2f\n"
+       "       mov %4,%1\n"
+       "       stl_c %1,%2\n"
+       "       beq %1,3f\n"
+       "2:\n"
+       ".subsection 2\n"
+       "3:     br 1b\n"
+       ".previous"
+       : "=&r"(prev), "=&r"(cmp), "=m"(*m)
+       : "r"((long) old), "r"(new), "m"(*m) : "memory");
+
+       return prev;
+}
+
+static inline unsigned long
+__cmpxchg_u64_local(volatile long *m, unsigned long old, unsigned long new)
+{
+       unsigned long prev, cmp;
+
+       __asm__ __volatile__(
+       "1:     ldq_l %0,%5\n"
+       "       cmpeq %0,%3,%1\n"
+       "       beq %1,2f\n"
+       "       mov %4,%1\n"
+       "       stq_c %1,%2\n"
+       "       beq %1,3f\n"
+       "2:\n"
+       ".subsection 2\n"
+       "3:     br 1b\n"
+       ".previous"
+       : "=&r"(prev), "=&r"(cmp), "=m"(*m)
+       : "r"((long) old), "r"(new), "m"(*m) : "memory");
+
+       return prev;
+}
+
+static __always_inline unsigned long
+__cmpxchg_local(volatile void *ptr, unsigned long old, unsigned long new,
+               int size)
+{
+       switch (size) {
+               case 1:
+                       return __cmpxchg_u8_local(ptr, old, new);
+               case 2:
+                       return __cmpxchg_u16_local(ptr, old, new);
+               case 4:
+                       return __cmpxchg_u32_local(ptr, old, new);
+               case 8:
+                       return __cmpxchg_u64_local(ptr, old, new);
+       }
+       __cmpxchg_called_with_bad_pointer();
+       return old;
+}
+
+#define cmpxchg_local(ptr, o, n)                                        \
+  ({                                                                    \
+     __typeof__(*(ptr)) _o_ = (o);                                      \
+     __typeof__(*(ptr)) _n_ = (n);                                      \
+     (__typeof__(*(ptr))) __cmpxchg_local((ptr), (unsigned long)_o_,    \
+                                   (unsigned long)_n_, sizeof(*(ptr))); \
+  })
+#define cmpxchg64_local(ptr, o, n)                                      \
+  ({                                                                    \
+       BUILD_BUG_ON(sizeof(*(ptr)) != 8);                               \
+       cmpxchg_local((ptr), (o), (n));                                  \
+  })
+
+
+#endif /* __ASSEMBLY__ */
+
+#define arch_align_stack(x) (x)
+
+#endif
diff --git a/arch/alpha/include/asm/termbits.h b/arch/alpha/include/asm/termbits.h
new file mode 100644 (file)
index 0000000..ad854a4
--- /dev/null
@@ -0,0 +1,200 @@
+#ifndef _ALPHA_TERMBITS_H
+#define _ALPHA_TERMBITS_H
+
+#include <linux/posix_types.h>
+
+typedef unsigned char  cc_t;
+typedef unsigned int   speed_t;
+typedef unsigned int   tcflag_t;
+
+/*
+ * termios type and macro definitions.  Be careful about adding stuff
+ * to this file since it's used in GNU libc and there are strict rules
+ * concerning namespace pollution.
+ */
+
+#define NCCS 19
+struct termios {
+       tcflag_t c_iflag;               /* input mode flags */
+       tcflag_t c_oflag;               /* output mode flags */
+       tcflag_t c_cflag;               /* control mode flags */
+       tcflag_t c_lflag;               /* local mode flags */
+       cc_t c_cc[NCCS];                /* control characters */
+       cc_t c_line;                    /* line discipline (== c_cc[19]) */
+       speed_t c_ispeed;               /* input speed */
+       speed_t c_ospeed;               /* output speed */
+};
+
+/* Alpha has matching termios and ktermios */
+
+struct ktermios {
+       tcflag_t c_iflag;               /* input mode flags */
+       tcflag_t c_oflag;               /* output mode flags */
+       tcflag_t c_cflag;               /* control mode flags */
+       tcflag_t c_lflag;               /* local mode flags */
+       cc_t c_cc[NCCS];                /* control characters */
+       cc_t c_line;                    /* line discipline (== c_cc[19]) */
+       speed_t c_ispeed;               /* input speed */
+       speed_t c_ospeed;               /* output speed */
+};
+
+/* c_cc characters */
+#define VEOF 0
+#define VEOL 1
+#define VEOL2 2
+#define VERASE 3
+#define VWERASE 4
+#define VKILL 5
+#define VREPRINT 6
+#define VSWTC 7
+#define VINTR 8
+#define VQUIT 9
+#define VSUSP 10
+#define VSTART 12
+#define VSTOP 13
+#define VLNEXT 14
+#define VDISCARD 15
+#define VMIN 16
+#define VTIME 17
+
+/* c_iflag bits */
+#define IGNBRK 0000001
+#define BRKINT 0000002
+#define IGNPAR 0000004
+#define PARMRK 0000010
+#define INPCK  0000020
+#define ISTRIP 0000040
+#define INLCR  0000100
+#define IGNCR  0000200
+#define ICRNL  0000400
+#define IXON   0001000
+#define IXOFF  0002000
+#define IXANY  0004000
+#define IUCLC  0010000
+#define IMAXBEL        0020000
+#define IUTF8  0040000
+
+/* c_oflag bits */
+#define OPOST  0000001
+#define ONLCR  0000002
+#define OLCUC  0000004
+
+#define OCRNL  0000010
+#define ONOCR  0000020
+#define ONLRET 0000040
+
+#define OFILL  00000100
+#define OFDEL  00000200
+#define NLDLY  00001400
+#define   NL0  00000000
+#define   NL1  00000400
+#define   NL2  00001000
+#define   NL3  00001400
+#define TABDLY 00006000
+#define   TAB0 00000000
+#define   TAB1 00002000
+#define   TAB2 00004000
+#define   TAB3 00006000
+#define CRDLY  00030000
+#define   CR0  00000000
+#define   CR1  00010000
+#define   CR2  00020000
+#define   CR3  00030000
+#define FFDLY  00040000
+#define   FF0  00000000
+#define   FF1  00040000
+#define BSDLY  00100000
+#define   BS0  00000000
+#define   BS1  00100000
+#define VTDLY  00200000
+#define   VT0  00000000
+#define   VT1  00200000
+#define XTABS  01000000 /* Hmm.. Linux/i386 considers this part of TABDLY.. */
+
+/* c_cflag bit meaning */
+#define CBAUD  0000037
+#define  B0    0000000         /* hang up */
+#define  B50   0000001
+#define  B75   0000002
+#define  B110  0000003
+#define  B134  0000004
+#define  B150  0000005
+#define  B200  0000006
+#define  B300  0000007
+#define  B600  0000010
+#define  B1200 0000011
+#define  B1800 0000012
+#define  B2400 0000013
+#define  B4800 0000014
+#define  B9600 0000015
+#define  B19200        0000016
+#define  B38400        0000017
+#define EXTA B19200
+#define EXTB B38400
+#define CBAUDEX 0000000
+#define  B57600   00020
+#define  B115200  00021
+#define  B230400  00022
+#define  B460800  00023
+#define  B500000  00024
+#define  B576000  00025
+#define  B921600  00026
+#define B1000000  00027
+#define B1152000  00030
+#define B1500000  00031
+#define B2000000  00032
+#define B2500000  00033
+#define B3000000  00034
+#define B3500000  00035
+#define B4000000  00036
+
+#define CSIZE  00001400
+#define   CS5  00000000
+#define   CS6  00000400
+#define   CS7  00001000
+#define   CS8  00001400
+
+#define CSTOPB 00002000
+#define CREAD  00004000
+#define PARENB 00010000
+#define PARODD 00020000
+#define HUPCL  00040000
+
+#define CLOCAL 00100000
+#define CMSPAR   010000000000          /* mark or space (stick) parity */
+#define CRTSCTS          020000000000          /* flow control */
+
+/* c_lflag bits */
+#define ISIG   0x00000080
+#define ICANON 0x00000100
+#define XCASE  0x00004000
+#define ECHO   0x00000008
+#define ECHOE  0x00000002
+#define ECHOK  0x00000004
+#define ECHONL 0x00000010
+#define NOFLSH 0x80000000
+#define TOSTOP 0x00400000
+#define ECHOCTL        0x00000040
+#define ECHOPRT        0x00000020
+#define ECHOKE 0x00000001
+#define FLUSHO 0x00800000
+#define PENDIN 0x20000000
+#define IEXTEN 0x00000400
+
+/* Values for the ACTION argument to `tcflow'.  */
+#define        TCOOFF          0
+#define        TCOON           1
+#define        TCIOFF          2
+#define        TCION           3
+
+/* Values for the QUEUE_SELECTOR argument to `tcflush'.  */
+#define        TCIFLUSH        0
+#define        TCOFLUSH        1
+#define        TCIOFLUSH       2
+
+/* Values for the OPTIONAL_ACTIONS argument to `tcsetattr'.  */
+#define        TCSANOW         0
+#define        TCSADRAIN       1
+#define        TCSAFLUSH       2
+
+#endif /* _ALPHA_TERMBITS_H */
diff --git a/arch/alpha/include/asm/termios.h b/arch/alpha/include/asm/termios.h
new file mode 100644 (file)
index 0000000..fa13716
--- /dev/null
@@ -0,0 +1,146 @@
+#ifndef _ALPHA_TERMIOS_H
+#define _ALPHA_TERMIOS_H
+
+#include <asm/ioctls.h>
+#include <asm/termbits.h>
+
+struct sgttyb {
+       char    sg_ispeed;
+       char    sg_ospeed;
+       char    sg_erase;
+       char    sg_kill;
+       short   sg_flags;
+};
+
+struct tchars {
+       char    t_intrc;
+       char    t_quitc;
+       char    t_startc;
+       char    t_stopc;
+       char    t_eofc;
+       char    t_brkc;
+};
+
+struct ltchars {
+       char    t_suspc;
+       char    t_dsuspc;
+       char    t_rprntc;
+       char    t_flushc;
+       char    t_werasc;
+       char    t_lnextc;
+};
+
+struct winsize {
+       unsigned short ws_row;
+       unsigned short ws_col;
+       unsigned short ws_xpixel;
+       unsigned short ws_ypixel;
+};
+
+#define NCC 8
+struct termio {
+       unsigned short c_iflag;         /* input mode flags */
+       unsigned short c_oflag;         /* output mode flags */
+       unsigned short c_cflag;         /* control mode flags */
+       unsigned short c_lflag;         /* local mode flags */
+       unsigned char c_line;           /* line discipline */
+       unsigned char c_cc[NCC];        /* control characters */
+};
+
+/*
+ * c_cc characters in the termio structure.  Oh, how I love being
+ * backwardly compatible.  Notice that character 4 and 5 are
+ * interpreted differently depending on whether ICANON is set in
+ * c_lflag.  If it's set, they are used as _VEOF and _VEOL, otherwise
+ * as _VMIN and V_TIME.  This is for compatibility with OSF/1 (which
+ * is compatible with sysV)...
+ */
+#define _VINTR 0
+#define _VQUIT 1
+#define _VERASE        2
+#define _VKILL 3
+#define _VEOF  4
+#define _VMIN  4
+#define _VEOL  5
+#define _VTIME 5
+#define _VEOL2 6
+#define _VSWTC 7
+
+#ifdef __KERNEL__
+/*     eof=^D          eol=\0          eol2=\0         erase=del
+       werase=^W       kill=^U         reprint=^R      sxtc=\0
+       intr=^C         quit=^\         susp=^Z         <OSF/1 VDSUSP>
+       start=^Q        stop=^S         lnext=^V        discard=^U
+       vmin=\1         vtime=\0
+*/
+#define INIT_C_CC "\004\000\000\177\027\025\022\000\003\034\032\000\021\023\026\025\001\000"
+
+/*
+ * Translate a "termio" structure into a "termios". Ugh.
+ */
+
+#define user_termio_to_kernel_termios(a_termios, u_termio)                     \
+({                                                                             \
+       struct ktermios *k_termios = (a_termios);                               \
+       struct termio k_termio;                                                 \
+       int canon, ret;                                                         \
+                                                                               \
+       ret = copy_from_user(&k_termio, u_termio, sizeof(k_termio));            \
+       if (!ret) {                                                             \
+               /* Overwrite only the low bits.  */                             \
+               *(unsigned short *)&k_termios->c_iflag = k_termio.c_iflag;      \
+               *(unsigned short *)&k_termios->c_oflag = k_termio.c_oflag;      \
+               *(unsigned short *)&k_termios->c_cflag = k_termio.c_cflag;      \
+               *(unsigned short *)&k_termios->c_lflag = k_termio.c_lflag;      \
+               canon = k_termio.c_lflag & ICANON;                              \
+                                                                               \
+               k_termios->c_cc[VINTR]  = k_termio.c_cc[_VINTR];                \
+               k_termios->c_cc[VQUIT]  = k_termio.c_cc[_VQUIT];                \
+               k_termios->c_cc[VERASE] = k_termio.c_cc[_VERASE];               \
+               k_termios->c_cc[VKILL]  = k_termio.c_cc[_VKILL];                \
+               k_termios->c_cc[VEOL2]  = k_termio.c_cc[_VEOL2];                \
+               k_termios->c_cc[VSWTC]  = k_termio.c_cc[_VSWTC];                \
+               k_termios->c_cc[canon ? VEOF : VMIN]  = k_termio.c_cc[_VEOF];   \
+               k_termios->c_cc[canon ? VEOL : VTIME] = k_termio.c_cc[_VEOL];   \
+       }                                                                       \
+       ret;                                                                    \
+})
+
+/*
+ * Translate a "termios" structure into a "termio". Ugh.
+ *
+ * Note the "fun" _VMIN overloading.
+ */
+#define kernel_termios_to_user_termio(u_termio, a_termios)             \
+({                                                                     \
+       struct ktermios *k_termios = (a_termios);                       \
+       struct termio k_termio;                                         \
+       int canon;                                                      \
+                                                                       \
+       k_termio.c_iflag = k_termios->c_iflag;                          \
+       k_termio.c_oflag = k_termios->c_oflag;                          \
+       k_termio.c_cflag = k_termios->c_cflag;                          \
+       canon = (k_termio.c_lflag = k_termios->c_lflag) & ICANON;       \
+                                                                       \
+       k_termio.c_line = k_termios->c_line;                            \
+       k_termio.c_cc[_VINTR]  = k_termios->c_cc[VINTR];                \
+       k_termio.c_cc[_VQUIT]  = k_termios->c_cc[VQUIT];                \
+       k_termio.c_cc[_VERASE] = k_termios->c_cc[VERASE];               \
+       k_termio.c_cc[_VKILL]  = k_termios->c_cc[VKILL];                \
+       k_termio.c_cc[_VEOF]   = k_termios->c_cc[canon ? VEOF : VMIN];  \
+       k_termio.c_cc[_VEOL]   = k_termios->c_cc[canon ? VEOL : VTIME]; \
+       k_termio.c_cc[_VEOL2]  = k_termios->c_cc[VEOL2];                \
+       k_termio.c_cc[_VSWTC]  = k_termios->c_cc[VSWTC];                \
+                                                                       \
+       copy_to_user(u_termio, &k_termio, sizeof(k_termio));            \
+})
+
+#define user_termios_to_kernel_termios(k, u) \
+       copy_from_user(k, u, sizeof(struct termios))
+
+#define kernel_termios_to_user_termios(u, k) \
+       copy_to_user(u, k, sizeof(struct termios))
+
+#endif /* __KERNEL__ */
+
+#endif /* _ALPHA_TERMIOS_H */
diff --git a/arch/alpha/include/asm/thread_info.h b/arch/alpha/include/asm/thread_info.h
new file mode 100644 (file)
index 0000000..15fda43
--- /dev/null
@@ -0,0 +1,114 @@
+#ifndef _ALPHA_THREAD_INFO_H
+#define _ALPHA_THREAD_INFO_H
+
+#ifdef __KERNEL__
+
+#ifndef __ASSEMBLY__
+#include <asm/processor.h>
+#include <asm/types.h>
+#include <asm/hwrpb.h>
+#endif
+
+#ifndef __ASSEMBLY__
+struct thread_info {
+       struct pcb_struct       pcb;            /* palcode state */
+
+       struct task_struct      *task;          /* main task structure */
+       unsigned int            flags;          /* low level flags */
+       unsigned int            ieee_state;     /* see fpu.h */
+
+       struct exec_domain      *exec_domain;   /* execution domain */
+       mm_segment_t            addr_limit;     /* thread address space */
+       unsigned                cpu;            /* current CPU */
+       int                     preempt_count; /* 0 => preemptable, <0 => BUG */
+
+       int bpt_nsaved;
+       unsigned long bpt_addr[2];              /* breakpoint handling  */
+       unsigned int bpt_insn[2];
+
+       struct restart_block    restart_block;
+};
+
+/*
+ * Macros/functions for gaining access to the thread information structure.
+ */
+#define INIT_THREAD_INFO(tsk)                  \
+{                                              \
+       .task           = &tsk,                 \
+       .exec_domain    = &default_exec_domain, \
+       .addr_limit     = KERNEL_DS,            \
+       .restart_block = {                      \
+               .fn = do_no_restart_syscall,    \
+       },                                      \
+}
+
+#define init_thread_info       (init_thread_union.thread_info)
+#define init_stack             (init_thread_union.stack)
+
+/* How to get the thread information struct from C.  */
+register struct thread_info *__current_thread_info __asm__("$8");
+#define current_thread_info()  __current_thread_info
+
+/* Thread information allocation.  */
+#define THREAD_SIZE_ORDER 1
+#define THREAD_SIZE (2*PAGE_SIZE)
+
+#endif /* __ASSEMBLY__ */
+
+#define PREEMPT_ACTIVE         0x40000000
+
+/*
+ * Thread information flags:
+ * - these are process state flags and used from assembly
+ * - pending work-to-be-done flags come first to fit in and immediate operand.
+ *
+ * TIF_SYSCALL_TRACE is known to be 0 via blbs.
+ */
+#define TIF_SYSCALL_TRACE      0       /* syscall trace active */
+#define TIF_SIGPENDING         1       /* signal pending */
+#define TIF_NEED_RESCHED       2       /* rescheduling necessary */
+#define TIF_POLLING_NRFLAG     3       /* poll_idle is polling NEED_RESCHED */
+#define TIF_DIE_IF_KERNEL      4       /* dik recursion lock */
+#define TIF_UAC_NOPRINT                5       /* see sysinfo.h */
+#define TIF_UAC_NOFIX          6
+#define TIF_UAC_SIGBUS         7
+#define TIF_MEMDIE             8
+#define TIF_RESTORE_SIGMASK    9       /* restore signal mask in do_signal */
+
+#define _TIF_SYSCALL_TRACE     (1<<TIF_SYSCALL_TRACE)
+#define _TIF_SIGPENDING                (1<<TIF_SIGPENDING)
+#define _TIF_NEED_RESCHED      (1<<TIF_NEED_RESCHED)
+#define _TIF_POLLING_NRFLAG    (1<<TIF_POLLING_NRFLAG)
+#define _TIF_RESTORE_SIGMASK   (1<<TIF_RESTORE_SIGMASK)
+
+/* Work to do on interrupt/exception return.  */
+#define _TIF_WORK_MASK         (_TIF_SIGPENDING | _TIF_NEED_RESCHED)
+
+/* Work to do on any return to userspace.  */
+#define _TIF_ALLWORK_MASK      (_TIF_WORK_MASK         \
+                                | _TIF_SYSCALL_TRACE)
+
+#define ALPHA_UAC_SHIFT                6
+#define ALPHA_UAC_MASK         (1 << TIF_UAC_NOPRINT | 1 << TIF_UAC_NOFIX | \
+                                1 << TIF_UAC_SIGBUS)
+
+#define SET_UNALIGN_CTL(task,value)    ({                                   \
+       task_thread_info(task)->flags = ((task_thread_info(task)->flags &    \
+               ~ALPHA_UAC_MASK)                                             \
+               | (((value) << ALPHA_UAC_SHIFT)       & (1<<TIF_UAC_NOPRINT))\
+               | (((value) << (ALPHA_UAC_SHIFT + 1)) & (1<<TIF_UAC_SIGBUS)) \
+               | (((value) << (ALPHA_UAC_SHIFT - 1)) & (1<<TIF_UAC_NOFIX)));\
+       0; })
+
+#define GET_UNALIGN_CTL(task,value)    ({                              \
+       put_user((task_thread_info(task)->flags & (1 << TIF_UAC_NOPRINT))\
+                 >> ALPHA_UAC_SHIFT                                    \
+                | (task_thread_info(task)->flags & (1 << TIF_UAC_SIGBUS))\
+                >> (ALPHA_UAC_SHIFT + 1)                               \
+                | (task_thread_info(task)->flags & (1 << TIF_UAC_NOFIX))\
+                >> (ALPHA_UAC_SHIFT - 1),                              \
+                (int __user *)(value));                                \
+       })
+
+#endif /* __KERNEL__ */
+#endif /* _ALPHA_THREAD_INFO_H */
diff --git a/arch/alpha/include/asm/timex.h b/arch/alpha/include/asm/timex.h
new file mode 100644 (file)
index 0000000..afa0c45
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * linux/include/asm-alpha/timex.h
+ *
+ * ALPHA architecture timex specifications
+ */
+#ifndef _ASMALPHA_TIMEX_H
+#define _ASMALPHA_TIMEX_H
+
+/* With only one or two oddballs, we use the RTC as the ticker, selecting
+   the 32.768kHz reference clock, which nicely divides down to our HZ.  */
+#define CLOCK_TICK_RATE        32768
+
+/*
+ * Standard way to access the cycle counter.
+ * Currently only used on SMP for scheduling.
+ *
+ * Only the low 32 bits are available as a continuously counting entity. 
+ * But this only means we'll force a reschedule every 8 seconds or so,
+ * which isn't an evil thing.
+ */
+
+typedef unsigned int cycles_t;
+
+static inline cycles_t get_cycles (void)
+{
+       cycles_t ret;
+       __asm__ __volatile__ ("rpcc %0" : "=r"(ret));
+       return ret;
+}
+
+#endif
diff --git a/arch/alpha/include/asm/tlb.h b/arch/alpha/include/asm/tlb.h
new file mode 100644 (file)
index 0000000..c136365
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef _ALPHA_TLB_H
+#define _ALPHA_TLB_H
+
+#define tlb_start_vma(tlb, vma)                        do { } while (0)
+#define tlb_end_vma(tlb, vma)                  do { } while (0)
+#define __tlb_remove_tlb_entry(tlb, pte, addr) do { } while (0)
+
+#define tlb_flush(tlb)                         flush_tlb_mm((tlb)->mm)
+
+#include <asm-generic/tlb.h>
+
+#define __pte_free_tlb(tlb, pte)                       pte_free((tlb)->mm, pte)
+#define __pmd_free_tlb(tlb, pmd)                       pmd_free((tlb)->mm, pmd)
+#endif
diff --git a/arch/alpha/include/asm/tlbflush.h b/arch/alpha/include/asm/tlbflush.h
new file mode 100644 (file)
index 0000000..9d87aaa
--- /dev/null
@@ -0,0 +1,151 @@
+#ifndef _ALPHA_TLBFLUSH_H
+#define _ALPHA_TLBFLUSH_H
+
+#include <linux/mm.h>
+#include <asm/compiler.h>
+#include <asm/pgalloc.h>
+
+#ifndef __EXTERN_INLINE
+#define __EXTERN_INLINE extern inline
+#define __MMU_EXTERN_INLINE
+#endif
+
+extern void __load_new_mm_context(struct mm_struct *);
+
+
+/* Use a few helper functions to hide the ugly broken ASN
+   numbers on early Alphas (ev4 and ev45).  */
+
+__EXTERN_INLINE void
+ev4_flush_tlb_current(struct mm_struct *mm)
+{
+       __load_new_mm_context(mm);
+       tbiap();
+}
+
+__EXTERN_INLINE void
+ev5_flush_tlb_current(struct mm_struct *mm)
+{
+       __load_new_mm_context(mm);
+}
+
+/* Flush just one page in the current TLB set.  We need to be very
+   careful about the icache here, there is no way to invalidate a
+   specific icache page.  */
+
+__EXTERN_INLINE void
+ev4_flush_tlb_current_page(struct mm_struct * mm,
+                          struct vm_area_struct *vma,
+                          unsigned long addr)
+{
+       int tbi_flag = 2;
+       if (vma->vm_flags & VM_EXEC) {
+               __load_new_mm_context(mm);
+               tbi_flag = 3;
+       }
+       tbi(tbi_flag, addr);
+}
+
+__EXTERN_INLINE void
+ev5_flush_tlb_current_page(struct mm_struct * mm,
+                          struct vm_area_struct *vma,
+                          unsigned long addr)
+{
+       if (vma->vm_flags & VM_EXEC)
+               __load_new_mm_context(mm);
+       else
+               tbi(2, addr);
+}
+
+
+#ifdef CONFIG_ALPHA_GENERIC
+# define flush_tlb_current             alpha_mv.mv_flush_tlb_current
+# define flush_tlb_current_page                alpha_mv.mv_flush_tlb_current_page
+#else
+# ifdef CONFIG_ALPHA_EV4
+#  define flush_tlb_current            ev4_flush_tlb_current
+#  define flush_tlb_current_page       ev4_flush_tlb_current_page
+# else
+#  define flush_tlb_current            ev5_flush_tlb_current
+#  define flush_tlb_current_page       ev5_flush_tlb_current_page
+# endif
+#endif
+
+#ifdef __MMU_EXTERN_INLINE
+#undef __EXTERN_INLINE
+#undef __MMU_EXTERN_INLINE
+#endif
+
+/* Flush current user mapping.  */
+static inline void
+flush_tlb(void)
+{
+       flush_tlb_current(current->active_mm);
+}
+
+/* Flush someone else's user mapping.  */
+static inline void
+flush_tlb_other(struct mm_struct *mm)
+{
+       unsigned long *mmc = &mm->context[smp_processor_id()];
+       /* Check it's not zero first to avoid cacheline ping pong
+          when possible.  */
+       if (*mmc) *mmc = 0;
+}
+
+#ifndef CONFIG_SMP
+/* Flush everything (kernel mapping may also have changed
+   due to vmalloc/vfree).  */
+static inline void flush_tlb_all(void)
+{
+       tbia();
+}
+
+/* Flush a specified user mapping.  */
+static inline void
+flush_tlb_mm(struct mm_struct *mm)
+{
+       if (mm == current->active_mm)
+               flush_tlb_current(mm);
+       else
+               flush_tlb_other(mm);
+}
+
+/* Page-granular tlb flush.  */
+static inline void
+flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
+{
+       struct mm_struct *mm = vma->vm_mm;
+
+       if (mm == current->active_mm)
+               flush_tlb_current_page(mm, vma, addr);
+       else
+               flush_tlb_other(mm);
+}
+
+/* Flush a specified range of user mapping.  On the Alpha we flush
+   the whole user tlb.  */
+static inline void
+flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
+               unsigned long end)
+{
+       flush_tlb_mm(vma->vm_mm);
+}
+
+#else /* CONFIG_SMP */
+
+extern void flush_tlb_all(void);
+extern void flush_tlb_mm(struct mm_struct *);
+extern void flush_tlb_page(struct vm_area_struct *, unsigned long);
+extern void flush_tlb_range(struct vm_area_struct *, unsigned long,
+                           unsigned long);
+
+#endif /* CONFIG_SMP */
+
+static inline void flush_tlb_kernel_range(unsigned long start,
+                                       unsigned long end)
+{
+       flush_tlb_all();
+}
+
+#endif /* _ALPHA_TLBFLUSH_H */
diff --git a/arch/alpha/include/asm/topology.h b/arch/alpha/include/asm/topology.h
new file mode 100644 (file)
index 0000000..149532e
--- /dev/null
@@ -0,0 +1,47 @@
+#ifndef _ASM_ALPHA_TOPOLOGY_H
+#define _ASM_ALPHA_TOPOLOGY_H
+
+#include <linux/smp.h>
+#include <linux/threads.h>
+#include <asm/machvec.h>
+
+#ifdef CONFIG_NUMA
+static inline int cpu_to_node(int cpu)
+{
+       int node;
+       
+       if (!alpha_mv.cpuid_to_nid)
+               return 0;
+
+       node = alpha_mv.cpuid_to_nid(cpu);
+
+#ifdef DEBUG_NUMA
+       BUG_ON(node < 0);
+#endif
+
+       return node;
+}
+
+static inline cpumask_t node_to_cpumask(int node)
+{
+       cpumask_t node_cpu_mask = CPU_MASK_NONE;
+       int cpu;
+
+       for_each_online_cpu(cpu) {
+               if (cpu_to_node(cpu) == node)
+                       cpu_set(cpu, node_cpu_mask);
+       }
+
+#ifdef DEBUG_NUMA
+       printk("node %d: cpu_mask: %016lx\n", node, node_cpu_mask);
+#endif
+
+       return node_cpu_mask;
+}
+
+#define pcibus_to_cpumask(bus) (cpu_online_map)
+
+#endif /* !CONFIG_NUMA */
+# include <asm-generic/topology.h>
+
+#endif /* _ASM_ALPHA_TOPOLOGY_H */
diff --git a/arch/alpha/include/asm/types.h b/arch/alpha/include/asm/types.h
new file mode 100644 (file)
index 0000000..c154135
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef _ALPHA_TYPES_H
+#define _ALPHA_TYPES_H
+
+/*
+ * This file is never included by application software unless
+ * explicitly requested (e.g., via linux/types.h) in which case the
+ * application is Linux specific so (user-) name space pollution is
+ * not a major issue.  However, for interoperability, libraries still
+ * need to be careful to avoid a name clashes.
+ */
+#include <asm-generic/int-l64.h>
+
+#ifndef __ASSEMBLY__
+
+typedef unsigned int umode_t;
+
+#endif /* __ASSEMBLY__ */
+
+/*
+ * These aren't exported outside the kernel to avoid name space clashes
+ */
+#ifdef __KERNEL__
+
+#define BITS_PER_LONG 64
+
+#ifndef __ASSEMBLY__
+
+typedef u64 dma_addr_t;
+typedef u64 dma64_addr_t;
+
+#endif /* __ASSEMBLY__ */
+#endif /* __KERNEL__ */
+#endif /* _ALPHA_TYPES_H */
diff --git a/arch/alpha/include/asm/uaccess.h b/arch/alpha/include/asm/uaccess.h
new file mode 100644 (file)
index 0000000..22de3b4
--- /dev/null
@@ -0,0 +1,511 @@
+#ifndef __ALPHA_UACCESS_H
+#define __ALPHA_UACCESS_H
+
+#include <linux/errno.h>
+#include <linux/sched.h>
+
+
+/*
+ * The fs value determines whether argument validity checking should be
+ * performed or not.  If get_fs() == USER_DS, checking is performed, with
+ * get_fs() == KERNEL_DS, checking is bypassed.
+ *
+ * Or at least it did once upon a time.  Nowadays it is a mask that
+ * defines which bits of the address space are off limits.  This is a
+ * wee bit faster than the above.
+ *
+ * For historical reasons, these macros are grossly misnamed.
+ */
+
+#define KERNEL_DS      ((mm_segment_t) { 0UL })
+#define USER_DS                ((mm_segment_t) { -0x40000000000UL })
+
+#define VERIFY_READ    0
+#define VERIFY_WRITE   1
+
+#define get_fs()  (current_thread_info()->addr_limit)
+#define get_ds()  (KERNEL_DS)
+#define set_fs(x) (current_thread_info()->addr_limit = (x))
+
+#define segment_eq(a,b)        ((a).seg == (b).seg)
+
+/*
+ * Is a address valid? This does a straightforward calculation rather
+ * than tests.
+ *
+ * Address valid if:
+ *  - "addr" doesn't have any high-bits set
+ *  - AND "size" doesn't have any high-bits set
+ *  - AND "addr+size" doesn't have any high-bits set
+ *  - OR we are in kernel mode.
+ */
+#define __access_ok(addr,size,segment) \
+       (((segment).seg & (addr | size | (addr+size))) == 0)
+
+#define access_ok(type,addr,size)                              \
+({                                                             \
+       __chk_user_ptr(addr);                                   \
+       __access_ok(((unsigned long)(addr)),(size),get_fs());   \
+})
+
+/*
+ * These are the main single-value transfer routines.  They automatically
+ * use the right size if we just have the right pointer type.
+ *
+ * As the alpha uses the same address space for kernel and user
+ * data, we can just do these as direct assignments.  (Of course, the
+ * exception handling means that it's no longer "just"...)
+ *
+ * Careful to not
+ * (a) re-use the arguments for side effects (sizeof/typeof is ok)
+ * (b) require any knowledge of processes at this stage
+ */
+#define put_user(x,ptr) \
+  __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)),get_fs())
+#define get_user(x,ptr) \
+  __get_user_check((x),(ptr),sizeof(*(ptr)),get_fs())
+
+/*
+ * The "__xxx" versions do not do address space checking, useful when
+ * doing multiple accesses to the same area (the programmer has to do the
+ * checks by hand with "access_ok()")
+ */
+#define __put_user(x,ptr) \
+  __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
+#define __get_user(x,ptr) \
+  __get_user_nocheck((x),(ptr),sizeof(*(ptr)))
+  
+/*
+ * The "lda %1, 2b-1b(%0)" bits are magic to get the assembler to
+ * encode the bits we need for resolving the exception.  See the
+ * more extensive comments with fixup_inline_exception below for
+ * more information.
+ */
+
+extern void __get_user_unknown(void);
+
+#define __get_user_nocheck(x,ptr,size)                         \
+({                                                             \
+       long __gu_err = 0;                                      \
+       unsigned long __gu_val;                                 \
+       __chk_user_ptr(ptr);                                    \
+       switch (size) {                                         \
+         case 1: __get_user_8(ptr); break;                     \
+         case 2: __get_user_16(ptr); break;                    \
+         case 4: __get_user_32(ptr); break;                    \
+         case 8: __get_user_64(ptr); break;                    \
+         default: __get_user_unknown(); break;                 \
+       }                                                       \
+       (x) = (__typeof__(*(ptr))) __gu_val;                    \
+       __gu_err;                                               \
+})
+
+#define __get_user_check(x,ptr,size,segment)                           \
+({                                                                     \
+       long __gu_err = -EFAULT;                                        \
+       unsigned long __gu_val = 0;                                     \
+       const __typeof__(*(ptr)) __user *__gu_addr = (ptr);             \
+       if (__access_ok((unsigned long)__gu_addr,size,segment)) {       \
+               __gu_err = 0;                                           \
+               switch (size) {                                         \
+                 case 1: __get_user_8(__gu_addr); break;               \
+                 case 2: __get_user_16(__gu_addr); break;              \
+                 case 4: __get_user_32(__gu_addr); break;              \
+                 case 8: __get_user_64(__gu_addr); break;              \
+                 default: __get_user_unknown(); break;                 \
+               }                                                       \
+       }                                                               \
+       (x) = (__typeof__(*(ptr))) __gu_val;                            \
+       __gu_err;                                                       \
+})
+
+struct __large_struct { unsigned long buf[100]; };
+#define __m(x) (*(struct __large_struct __user *)(x))
+
+#define __get_user_64(addr)                            \
+       __asm__("1: ldq %0,%2\n"                        \
+       "2:\n"                                          \
+       ".section __ex_table,\"a\"\n"                   \
+       "       .long 1b - .\n"                         \
+       "       lda %0, 2b-1b(%1)\n"                    \
+       ".previous"                                     \
+               : "=r"(__gu_val), "=r"(__gu_err)        \
+               : "m"(__m(addr)), "1"(__gu_err))
+
+#define __get_user_32(addr)                            \
+       __asm__("1: ldl %0,%2\n"                        \
+       "2:\n"                                          \
+       ".section __ex_table,\"a\"\n"                   \
+       "       .long 1b - .\n"                         \
+       "       lda %0, 2b-1b(%1)\n"                    \
+       ".previous"                                     \
+               : "=r"(__gu_val), "=r"(__gu_err)        \
+               : "m"(__m(addr)), "1"(__gu_err))
+
+#ifdef __alpha_bwx__
+/* Those lucky bastards with ev56 and later CPUs can do byte/word moves.  */
+
+#define __get_user_16(addr)                            \
+       __asm__("1: ldwu %0,%2\n"                       \
+       "2:\n"                                          \
+       ".section __ex_table,\"a\"\n"                   \
+       "       .long 1b - .\n"                         \
+       "       lda %0, 2b-1b(%1)\n"                    \
+       ".previous"                                     \
+               : "=r"(__gu_val), "=r"(__gu_err)        \
+               : "m"(__m(addr)), "1"(__gu_err))
+
+#define __get_user_8(addr)                             \
+       __asm__("1: ldbu %0,%2\n"                       \
+       "2:\n"                                          \
+       ".section __ex_table,\"a\"\n"                   \
+       "       .long 1b - .\n"                         \
+       "       lda %0, 2b-1b(%1)\n"                    \
+       ".previous"                                     \
+               : "=r"(__gu_val), "=r"(__gu_err)        \
+               : "m"(__m(addr)), "1"(__gu_err))
+#else
+/* Unfortunately, we can't get an unaligned access trap for the sub-word
+   load, so we have to do a general unaligned operation.  */
+
+#define __get_user_16(addr)                                            \
+{                                                                      \
+       long __gu_tmp;                                                  \
+       __asm__("1: ldq_u %0,0(%3)\n"                                   \
+       "2:     ldq_u %1,1(%3)\n"                                       \
+       "       extwl %0,%3,%0\n"                                       \
+       "       extwh %1,%3,%1\n"                                       \
+       "       or %0,%1,%0\n"                                          \
+       "3:\n"                                                          \
+       ".section __ex_table,\"a\"\n"                                   \
+       "       .long 1b - .\n"                                         \
+       "       lda %0, 3b-1b(%2)\n"                                    \
+       "       .long 2b - .\n"                                         \
+       "       lda %0, 3b-2b(%2)\n"                                    \
+       ".previous"                                                     \
+               : "=&r"(__gu_val), "=&r"(__gu_tmp), "=r"(__gu_err)      \
+               : "r"(addr), "2"(__gu_err));                            \
+}
+
+#define __get_user_8(addr)                                             \
+       __asm__("1: ldq_u %0,0(%2)\n"                                   \
+       "       extbl %0,%2,%0\n"                                       \
+       "2:\n"                                                          \
+       ".section __ex_table,\"a\"\n"                                   \
+       "       .long 1b - .\n"                                         \
+       "       lda %0, 2b-1b(%1)\n"                                    \
+       ".previous"                                                     \
+               : "=&r"(__gu_val), "=r"(__gu_err)                       \
+               : "r"(addr), "1"(__gu_err))
+#endif
+
+extern void __put_user_unknown(void);
+
+#define __put_user_nocheck(x,ptr,size)                         \
+({                                                             \
+       long __pu_err = 0;                                      \
+       __chk_user_ptr(ptr);                                    \
+       switch (size) {                                         \
+         case 1: __put_user_8(x,ptr); break;                   \
+         case 2: __put_user_16(x,ptr); break;                  \
+         case 4: __put_user_32(x,ptr); break;                  \
+         case 8: __put_user_64(x,ptr); break;                  \
+         default: __put_user_unknown(); break;                 \
+       }                                                       \
+       __pu_err;                                               \
+})
+
+#define __put_user_check(x,ptr,size,segment)                           \
+({                                                                     \
+       long __pu_err = -EFAULT;                                        \
+       __typeof__(*(ptr)) __user *__pu_addr = (ptr);                   \
+       if (__access_ok((unsigned long)__pu_addr,size,segment)) {       \
+               __pu_err = 0;                                           \
+               switch (size) {                                         \
+                 case 1: __put_user_8(x,__pu_addr); break;             \
+                 case 2: __put_user_16(x,__pu_addr); break;            \
+                 case 4: __put_user_32(x,__pu_addr); break;            \
+                 case 8: __put_user_64(x,__pu_addr); break;            \
+                 default: __put_user_unknown(); break;                 \
+               }                                                       \
+       }                                                               \
+       __pu_err;                                                       \
+})
+
+/*
+ * The "__put_user_xx()" macros tell gcc they read from memory
+ * instead of writing: this is because they do not write to
+ * any memory gcc knows about, so there are no aliasing issues
+ */
+#define __put_user_64(x,addr)                                  \
+__asm__ __volatile__("1: stq %r2,%1\n"                         \
+       "2:\n"                                                  \
+       ".section __ex_table,\"a\"\n"                           \
+       "       .long 1b - .\n"                                 \
+       "       lda $31,2b-1b(%0)\n"                            \
+       ".previous"                                             \
+               : "=r"(__pu_err)                                \
+               : "m" (__m(addr)), "rJ" (x), "0"(__pu_err))
+
+#define __put_user_32(x,addr)                                  \
+__asm__ __volatile__("1: stl %r2,%1\n"                         \
+       "2:\n"                                                  \
+       ".section __ex_table,\"a\"\n"                           \
+       "       .long 1b - .\n"                                 \
+       "       lda $31,2b-1b(%0)\n"                            \
+       ".previous"                                             \
+               : "=r"(__pu_err)                                \
+               : "m"(__m(addr)), "rJ"(x), "0"(__pu_err))
+
+#ifdef __alpha_bwx__
+/* Those lucky bastards with ev56 and later CPUs can do byte/word moves.  */
+
+#define __put_user_16(x,addr)                                  \
+__asm__ __volatile__("1: stw %r2,%1\n"                         \
+       "2:\n"                                                  \
+       ".section __ex_table,\"a\"\n"                           \
+       "       .long 1b - .\n"                                 \
+       "       lda $31,2b-1b(%0)\n"                            \
+       ".previous"                                             \
+               : "=r"(__pu_err)                                \
+               : "m"(__m(addr)), "rJ"(x), "0"(__pu_err))
+
+#define __put_user_8(x,addr)                                   \
+__asm__ __volatile__("1: stb %r2,%1\n"                         \
+       "2:\n"                                                  \
+       ".section __ex_table,\"a\"\n"                           \
+       "       .long 1b - .\n"                                 \
+       "       lda $31,2b-1b(%0)\n"                            \
+       ".previous"                                             \
+               : "=r"(__pu_err)                                \
+               : "m"(__m(addr)), "rJ"(x), "0"(__pu_err))
+#else
+/* Unfortunately, we can't get an unaligned access trap for the sub-word
+   write, so we have to do a general unaligned operation.  */
+
+#define __put_user_16(x,addr)                                  \
+{                                                              \
+       long __pu_tmp1, __pu_tmp2, __pu_tmp3, __pu_tmp4;        \
+       __asm__ __volatile__(                                   \
+       "1:     ldq_u %2,1(%5)\n"                               \
+       "2:     ldq_u %1,0(%5)\n"                               \
+       "       inswh %6,%5,%4\n"                               \
+       "       inswl %6,%5,%3\n"                               \
+       "       mskwh %2,%5,%2\n"                               \
+       "       mskwl %1,%5,%1\n"                               \
+       "       or %2,%4,%2\n"                                  \
+       "       or %1,%3,%1\n"                                  \
+       "3:     stq_u %2,1(%5)\n"                               \
+       "4:     stq_u %1,0(%5)\n"                               \
+       "5:\n"                                                  \
+       ".section __ex_table,\"a\"\n"                           \
+       "       .long 1b - .\n"                                 \
+       "       lda $31, 5b-1b(%0)\n"                           \
+       "       .long 2b - .\n"                                 \
+       "       lda $31, 5b-2b(%0)\n"                           \
+       "       .long 3b - .\n"                                 \
+       "       lda $31, 5b-3b(%0)\n"                           \
+       "       .long 4b - .\n"                                 \
+       "       lda $31, 5b-4b(%0)\n"                           \
+       ".previous"                                             \
+               : "=r"(__pu_err), "=&r"(__pu_tmp1),             \
+                 "=&r"(__pu_tmp2), "=&r"(__pu_tmp3),           \
+                 "=&r"(__pu_tmp4)                              \
+               : "r"(addr), "r"((unsigned long)(x)), "0"(__pu_err)); \
+}
+
+#define __put_user_8(x,addr)                                   \
+{                                                              \
+       long __pu_tmp1, __pu_tmp2;                              \
+       __asm__ __volatile__(                                   \
+       "1:     ldq_u %1,0(%4)\n"                               \
+       "       insbl %3,%4,%2\n"                               \
+       "       mskbl %1,%4,%1\n"                               \
+       "       or %1,%2,%1\n"                                  \
+       "2:     stq_u %1,0(%4)\n"                               \
+       "3:\n"                                                  \
+       ".section __ex_table,\"a\"\n"                           \
+       "       .long 1b - .\n"                                 \
+       "       lda $31, 3b-1b(%0)\n"                           \
+       "       .long 2b - .\n"                                 \
+       "       lda $31, 3b-2b(%0)\n"                           \
+       ".previous"                                             \
+               : "=r"(__pu_err),                               \
+                 "=&r"(__pu_tmp1), "=&r"(__pu_tmp2)            \
+               : "r"((unsigned long)(x)), "r"(addr), "0"(__pu_err)); \
+}
+#endif
+
+
+/*
+ * Complex access routines
+ */
+
+/* This little bit of silliness is to get the GP loaded for a function
+   that ordinarily wouldn't.  Otherwise we could have it done by the macro
+   directly, which can be optimized the linker.  */
+#ifdef MODULE
+#define __module_address(sym)          "r"(sym),
+#define __module_call(ra, arg, sym)    "jsr $" #ra ",(%" #arg ")," #sym
+#else
+#define __module_address(sym)
+#define __module_call(ra, arg, sym)    "bsr $" #ra "," #sym " !samegp"
+#endif
+
+extern void __copy_user(void);
+
+extern inline long
+__copy_tofrom_user_nocheck(void *to, const void *from, long len)
+{
+       register void * __cu_to __asm__("$6") = to;
+       register const void * __cu_from __asm__("$7") = from;
+       register long __cu_len __asm__("$0") = len;
+
+       __asm__ __volatile__(
+               __module_call(28, 3, __copy_user)
+               : "=r" (__cu_len), "=r" (__cu_from), "=r" (__cu_to)
+               : __module_address(__copy_user)
+                 "0" (__cu_len), "1" (__cu_from), "2" (__cu_to)
+               : "$1","$2","$3","$4","$5","$28","memory");
+
+       return __cu_len;
+}
+
+extern inline long
+__copy_tofrom_user(void *to, const void *from, long len, const void __user *validate)
+{
+       if (__access_ok((unsigned long)validate, len, get_fs()))
+               len = __copy_tofrom_user_nocheck(to, from, len);
+       return len;
+}
+
+#define __copy_to_user(to,from,n)                                      \
+({                                                                     \
+       __chk_user_ptr(to);                                             \
+       __copy_tofrom_user_nocheck((__force void *)(to),(from),(n));    \
+})
+#define __copy_from_user(to,from,n)                                    \
+({                                                                     \
+       __chk_user_ptr(from);                                           \
+       __copy_tofrom_user_nocheck((to),(__force void *)(from),(n));    \
+})
+
+#define __copy_to_user_inatomic __copy_to_user
+#define __copy_from_user_inatomic __copy_from_user
+
+
+extern inline long
+copy_to_user(void __user *to, const void *from, long n)
+{
+       return __copy_tofrom_user((__force void *)to, from, n, to);
+}
+
+extern inline long
+copy_from_user(void *to, const void __user *from, long n)
+{
+       return __copy_tofrom_user(to, (__force void *)from, n, from);
+}
+
+extern void __do_clear_user(void);
+
+extern inline long
+__clear_user(void __user *to, long len)
+{
+       register void __user * __cl_to __asm__("$6") = to;
+       register long __cl_len __asm__("$0") = len;
+       __asm__ __volatile__(
+               __module_call(28, 2, __do_clear_user)
+               : "=r"(__cl_len), "=r"(__cl_to)
+               : __module_address(__do_clear_user)
+                 "0"(__cl_len), "1"(__cl_to)
+               : "$1","$2","$3","$4","$5","$28","memory");
+       return __cl_len;
+}
+
+extern inline long
+clear_user(void __user *to, long len)
+{
+       if (__access_ok((unsigned long)to, len, get_fs()))
+               len = __clear_user(to, len);
+       return len;
+}
+
+#undef __module_address
+#undef __module_call
+
+/* Returns: -EFAULT if exception before terminator, N if the entire
+   buffer filled, else strlen.  */
+
+extern long __strncpy_from_user(char *__to, const char __user *__from, long __to_len);
+
+extern inline long
+strncpy_from_user(char *to, const char __user *from, long n)
+{
+       long ret = -EFAULT;
+       if (__access_ok((unsigned long)from, 0, get_fs()))
+               ret = __strncpy_from_user(to, from, n);
+       return ret;
+}
+
+/* Returns: 0 if bad, string length+1 (memory size) of string if ok */
+extern long __strlen_user(const char __user *);
+
+extern inline long strlen_user(const char __user *str)
+{
+       return access_ok(VERIFY_READ,str,0) ? __strlen_user(str) : 0;
+}
+
+/* Returns: 0 if exception before NUL or reaching the supplied limit (N),
+ * a value greater than N if the limit would be exceeded, else strlen.  */
+extern long __strnlen_user(const char __user *, long);
+
+extern inline long strnlen_user(const char __user *str, long n)
+{
+       return access_ok(VERIFY_READ,str,0) ? __strnlen_user(str, n) : 0;
+}
+
+/*
+ * About the exception table:
+ *
+ * - insn is a 32-bit pc-relative offset from the faulting insn.
+ * - nextinsn is a 16-bit offset off of the faulting instruction
+ *   (not off of the *next* instruction as branches are).
+ * - errreg is the register in which to place -EFAULT.
+ * - valreg is the final target register for the load sequence
+ *   and will be zeroed.
+ *
+ * Either errreg or valreg may be $31, in which case nothing happens.
+ *
+ * The exception fixup information "just so happens" to be arranged
+ * as in a MEM format instruction.  This lets us emit our three
+ * values like so:
+ *
+ *      lda valreg, nextinsn(errreg)
+ *
+ */
+
+struct exception_table_entry
+{
+       signed int insn;
+       union exception_fixup {
+               unsigned unit;
+               struct {
+                       signed int nextinsn : 16;
+                       unsigned int errreg : 5;
+                       unsigned int valreg : 5;
+               } bits;
+       } fixup;
+};
+
+/* Returns the new pc */
+#define fixup_exception(map_reg, fixup, pc)                    \
+({                                                             \
+       if ((fixup)->fixup.bits.valreg != 31)                   \
+               map_reg((fixup)->fixup.bits.valreg) = 0;        \
+       if ((fixup)->fixup.bits.errreg != 31)                   \
+               map_reg((fixup)->fixup.bits.errreg) = -EFAULT;  \
+       (pc) + (fixup)->fixup.bits.nextinsn;                    \
+})
+
+
+#endif /* __ALPHA_UACCESS_H */
diff --git a/arch/alpha/include/asm/ucontext.h b/arch/alpha/include/asm/ucontext.h
new file mode 100644 (file)
index 0000000..47578ab
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef _ASMAXP_UCONTEXT_H
+#define _ASMAXP_UCONTEXT_H
+
+struct ucontext {
+       unsigned long     uc_flags;
+       struct ucontext  *uc_link;
+       old_sigset_t      uc_osf_sigmask;
+       stack_t           uc_stack;
+       struct sigcontext uc_mcontext;
+       sigset_t          uc_sigmask;   /* mask last for extensibility */
+};
+
+#endif /* !_ASMAXP_UCONTEXT_H */
diff --git a/arch/alpha/include/asm/unaligned.h b/arch/alpha/include/asm/unaligned.h
new file mode 100644 (file)
index 0000000..3787c60
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _ASM_ALPHA_UNALIGNED_H
+#define _ASM_ALPHA_UNALIGNED_H
+
+#include <linux/unaligned/le_struct.h>
+#include <linux/unaligned/be_byteshift.h>
+#include <linux/unaligned/generic.h>
+
+#define get_unaligned __get_unaligned_le
+#define put_unaligned __put_unaligned_le
+
+#endif /* _ASM_ALPHA_UNALIGNED_H */
diff --git a/arch/alpha/include/asm/unistd.h b/arch/alpha/include/asm/unistd.h
new file mode 100644 (file)
index 0000000..5b5c174
--- /dev/null
@@ -0,0 +1,464 @@
+#ifndef _ALPHA_UNISTD_H
+#define _ALPHA_UNISTD_H
+
+#define __NR_osf_syscall         0     /* not implemented */
+#define __NR_exit                1
+#define __NR_fork                2
+#define __NR_read                3
+#define __NR_write               4
+#define __NR_osf_old_open        5     /* not implemented */
+#define __NR_close               6
+#define __NR_osf_wait4           7
+#define __NR_osf_old_creat       8     /* not implemented */
+#define __NR_link                9
+#define __NR_unlink             10
+#define __NR_osf_execve                 11     /* not implemented */
+#define __NR_chdir              12
+#define __NR_fchdir             13
+#define __NR_mknod              14
+#define __NR_chmod              15
+#define __NR_chown              16
+#define __NR_brk                17
+#define __NR_osf_getfsstat      18     /* not implemented */
+#define __NR_lseek              19
+#define __NR_getxpid            20
+#define __NR_osf_mount          21
+#define __NR_umount             22
+#define __NR_setuid             23
+#define __NR_getxuid            24
+#define __NR_exec_with_loader   25     /* not implemented */
+#define __NR_ptrace             26
+#define __NR_osf_nrecvmsg       27     /* not implemented */
+#define __NR_osf_nsendmsg       28     /* not implemented */
+#define __NR_osf_nrecvfrom      29     /* not implemented */
+#define __NR_osf_naccept        30     /* not implemented */
+#define __NR_osf_ngetpeername   31     /* not implemented */
+#define __NR_osf_ngetsockname   32     /* not implemented */
+#define __NR_access             33
+#define __NR_osf_chflags        34     /* not implemented */
+#define __NR_osf_fchflags       35     /* not implemented */
+#define __NR_sync               36
+#define __NR_kill               37
+#define __NR_osf_old_stat       38     /* not implemented */
+#define __NR_setpgid            39
+#define __NR_osf_old_lstat      40     /* not implemented */
+#define __NR_dup                41
+#define __NR_pipe               42
+#define __NR_osf_set_program_attributes        43
+#define __NR_osf_profil                 44     /* not implemented */
+#define __NR_open               45
+#define __NR_osf_old_sigaction  46     /* not implemented */
+#define __NR_getxgid            47
+#define __NR_osf_sigprocmask    48
+#define __NR_osf_getlogin       49     /* not implemented */
+#define __NR_osf_setlogin       50     /* not implemented */
+#define __NR_acct               51
+#define __NR_sigpending                 52
+
+#define __NR_ioctl              54
+#define __NR_osf_reboot                 55     /* not implemented */
+#define __NR_osf_revoke                 56     /* not implemented */
+#define __NR_symlink            57
+#define __NR_readlink           58
+#define __NR_execve             59
+#define __NR_umask              60
+#define __NR_chroot             61
+#define __NR_osf_old_fstat      62     /* not implemented */
+#define __NR_getpgrp            63
+#define __NR_getpagesize        64
+#define __NR_osf_mremap                 65     /* not implemented */
+#define __NR_vfork              66
+#define __NR_stat               67
+#define __NR_lstat              68
+#define __NR_osf_sbrk           69     /* not implemented */
+#define __NR_osf_sstk           70     /* not implemented */
+#define __NR_mmap               71     /* OSF/1 mmap is superset of Linux */
+#define __NR_osf_old_vadvise    72     /* not implemented */
+#define __NR_munmap             73
+#define __NR_mprotect           74
+#define __NR_madvise            75
+#define __NR_vhangup            76
+#define __NR_osf_kmodcall       77     /* not implemented */
+#define __NR_osf_mincore        78     /* not implemented */
+#define __NR_getgroups          79
+#define __NR_setgroups          80
+#define __NR_osf_old_getpgrp    81     /* not implemented */
+#define __NR_setpgrp            82     /* BSD alias for setpgid */
+#define __NR_osf_setitimer      83
+#define __NR_osf_old_wait       84     /* not implemented */
+#define __NR_osf_table          85     /* not implemented */
+#define __NR_osf_getitimer      86
+#define __NR_gethostname        87
+#define __NR_sethostname        88
+#define __NR_getdtablesize      89
+#define __NR_dup2               90
+#define __NR_fstat              91
+#define __NR_fcntl              92
+#define __NR_osf_select                 93
+#define __NR_poll               94
+#define __NR_fsync              95
+#define __NR_setpriority        96
+#define __NR_socket             97
+#define __NR_connect            98
+#define __NR_accept             99
+#define __NR_getpriority       100
+#define __NR_send              101
+#define __NR_recv              102
+#define __NR_sigreturn         103
+#define __NR_bind              104
+#define __NR_setsockopt                105
+#define __NR_listen            106
+#define __NR_osf_plock         107     /* not implemented */
+#define __NR_osf_old_sigvec    108     /* not implemented */
+#define __NR_osf_old_sigblock  109     /* not implemented */
+#define __NR_osf_old_sigsetmask        110     /* not implemented */
+#define __NR_sigsuspend                111
+#define __NR_osf_sigstack      112
+#define __NR_recvmsg           113
+#define __NR_sendmsg           114
+#define __NR_osf_old_vtrace    115     /* not implemented */
+#define __NR_osf_gettimeofday  116
+#define __NR_osf_getrusage     117
+#define __NR_getsockopt                118
+
+#define __NR_readv             120
+#define __NR_writev            121
+#define __NR_osf_settimeofday  122
+#define __NR_fchown            123
+#define __NR_fchmod            124
+#define __NR_recvfrom          125
+#define __NR_setreuid          126
+#define __NR_setregid          127
+#define __NR_rename            128
+#define __NR_truncate          129
+#define __NR_ftruncate         130
+#define __NR_flock             131
+#define __NR_setgid            132
+#define __NR_sendto            133
+#define __NR_shutdown          134
+#define __NR_socketpair                135
+#define __NR_mkdir             136
+#define __NR_rmdir             137
+#define __NR_osf_utimes                138
+#define __NR_osf_old_sigreturn 139     /* not implemented */
+#define __NR_osf_adjtime       140     /* not implemented */
+#define __NR_getpeername       141
+#define __NR_osf_gethostid     142     /* not implemented */
+#define __NR_osf_sethostid     143     /* not implemented */
+#define __NR_getrlimit         144
+#define __NR_setrlimit         145
+#define __NR_osf_old_killpg    146     /* not implemented */
+#define __NR_setsid            147
+#define __NR_quotactl          148
+#define __NR_osf_oldquota      149     /* not implemented */
+#define __NR_getsockname       150
+
+#define __NR_osf_pid_block     153     /* not implemented */
+#define __NR_osf_pid_unblock   154     /* not implemented */
+
+#define __NR_sigaction         156
+#define __NR_osf_sigwaitprim   157     /* not implemented */
+#define __NR_osf_nfssvc                158     /* not implemented */
+#define __NR_osf_getdirentries 159
+#define __NR_osf_statfs                160
+#define __NR_osf_fstatfs       161
+
+#define __NR_osf_asynch_daemon 163     /* not implemented */
+#define __NR_osf_getfh         164     /* not implemented */   
+#define __NR_osf_getdomainname 165
+#define __NR_setdomainname     166
+
+#define __NR_osf_exportfs      169     /* not implemented */
+
+#define __NR_osf_alt_plock     181     /* not implemented */
+
+#define __NR_osf_getmnt                184     /* not implemented */
+
+#define __NR_osf_alt_sigpending        187     /* not implemented */
+#define __NR_osf_alt_setsid    188     /* not implemented */
+
+#define __NR_osf_swapon                199
+#define __NR_msgctl            200
+#define __NR_msgget            201
+#define __NR_msgrcv            202
+#define __NR_msgsnd            203
+#define __NR_semctl            204
+#define __NR_semget            205
+#define __NR_semop             206
+#define __NR_osf_utsname       207
+#define __NR_lchown            208
+#define __NR_osf_shmat         209
+#define __NR_shmctl            210
+#define __NR_shmdt             211
+#define __NR_shmget            212
+#define __NR_osf_mvalid                213     /* not implemented */
+#define __NR_osf_getaddressconf        214     /* not implemented */
+#define __NR_osf_msleep                215     /* not implemented */
+#define __NR_osf_mwakeup       216     /* not implemented */
+#define __NR_msync             217
+#define __NR_osf_signal                218     /* not implemented */
+#define __NR_osf_utc_gettime   219     /* not implemented */
+#define __NR_osf_utc_adjtime   220     /* not implemented */
+
+#define __NR_osf_security      222     /* not implemented */
+#define __NR_osf_kloadcall     223     /* not implemented */
+
+#define __NR_getpgid           233
+#define __NR_getsid            234
+#define __NR_sigaltstack       235
+#define __NR_osf_waitid                236     /* not implemented */
+#define __NR_osf_priocntlset   237     /* not implemented */
+#define __NR_osf_sigsendset    238     /* not implemented */
+#define __NR_osf_set_speculative       239     /* not implemented */
+#define __NR_osf_msfs_syscall  240     /* not implemented */
+#define __NR_osf_sysinfo       241
+#define __NR_osf_uadmin                242     /* not implemented */
+#define __NR_osf_fuser         243     /* not implemented */
+#define __NR_osf_proplist_syscall    244
+#define __NR_osf_ntp_adjtime   245     /* not implemented */
+#define __NR_osf_ntp_gettime   246     /* not implemented */
+#define __NR_osf_pathconf      247     /* not implemented */
+#define __NR_osf_fpathconf     248     /* not implemented */
+
+#define __NR_osf_uswitch       250     /* not implemented */
+#define __NR_osf_usleep_thread 251
+#define __NR_osf_audcntl       252     /* not implemented */
+#define __NR_osf_audgen                253     /* not implemented */
+#define __NR_sysfs             254
+#define __NR_osf_subsys_info   255     /* not implemented */
+#define __NR_osf_getsysinfo    256
+#define __NR_osf_setsysinfo    257
+#define __NR_osf_afs_syscall   258     /* not implemented */
+#define __NR_osf_swapctl       259     /* not implemented */
+#define __NR_osf_memcntl       260     /* not implemented */
+#define __NR_osf_fdatasync     261     /* not implemented */
+
+/*
+ * Ignore legacy syscalls that we don't use.
+ */
+#define __IGNORE_alarm
+#define __IGNORE_creat
+#define __IGNORE_getegid
+#define __IGNORE_geteuid
+#define __IGNORE_getgid
+#define __IGNORE_getpid
+#define __IGNORE_getppid
+#define __IGNORE_getuid
+#define __IGNORE_pause
+#define __IGNORE_time
+#define __IGNORE_utime
+
+/*
+ * Linux-specific system calls begin at 300
+ */
+#define __NR_bdflush           300
+#define __NR_sethae            301
+#define __NR_mount             302
+#define __NR_old_adjtimex      303
+#define __NR_swapoff           304
+#define __NR_getdents          305
+#define __NR_create_module     306
+#define __NR_init_module       307
+#define __NR_delete_module     308
+#define __NR_get_kernel_syms   309
+#define __NR_syslog            310
+#define __NR_reboot            311
+#define __NR_clone             312
+#define __NR_uselib            313
+#define __NR_mlock             314
+#define __NR_munlock           315
+#define __NR_mlockall          316
+#define __NR_munlockall                317
+#define __NR_sysinfo           318
+#define __NR__sysctl           319
+/* 320 was sys_idle.  */
+#define __NR_oldumount         321
+#define __NR_swapon            322
+#define __NR_times             323
+#define __NR_personality       324
+#define __NR_setfsuid          325
+#define __NR_setfsgid          326
+#define __NR_ustat             327
+#define __NR_statfs            328
+#define __NR_fstatfs           329
+#define __NR_sched_setparam            330
+#define __NR_sched_getparam            331
+#define __NR_sched_setscheduler                332
+#define __NR_sched_getscheduler                333
+#define __NR_sched_yield               334
+#define __NR_sched_get_priority_max    335
+#define __NR_sched_get_priority_min    336
+#define __NR_sched_rr_get_interval     337
+#define __NR_afs_syscall               338
+#define __NR_uname                     339
+#define __NR_nanosleep                 340
+#define __NR_mremap                    341
+#define __NR_nfsservctl                        342
+#define __NR_setresuid                 343
+#define __NR_getresuid                 344
+#define __NR_pciconfig_read            345
+#define __NR_pciconfig_write           346
+#define __NR_query_module              347
+#define __NR_prctl                     348
+#define __NR_pread64                   349
+#define __NR_pwrite64                  350
+#define __NR_rt_sigreturn              351
+#define __NR_rt_sigaction              352
+#define __NR_rt_sigprocmask            353
+#define __NR_rt_sigpending             354
+#define __NR_rt_sigtimedwait           355
+#define __NR_rt_sigqueueinfo           356
+#define __NR_rt_sigsuspend             357
+#define __NR_select                    358
+#define __NR_gettimeofday              359
+#define __NR_settimeofday              360
+#define __NR_getitimer                 361
+#define __NR_setitimer                 362
+#define __NR_utimes                    363
+#define __NR_getrusage                 364
+#define __NR_wait4                     365
+#define __NR_adjtimex                  366
+#define __NR_getcwd                    367
+#define __NR_capget                    368
+#define __NR_capset                    369
+#define __NR_sendfile                  370
+#define __NR_setresgid                 371
+#define __NR_getresgid                 372
+#define __NR_dipc                      373
+#define __NR_pivot_root                        374
+#define __NR_mincore                   375
+#define __NR_pciconfig_iobase          376
+#define __NR_getdents64                        377
+#define __NR_gettid                    378
+#define __NR_readahead                 379
+/* 380 is unused */
+#define __NR_tkill                     381
+#define __NR_setxattr                  382
+#define __NR_lsetxattr                 383
+#define __NR_fsetxattr                 384
+#define __NR_getxattr                  385
+#define __NR_lgetxattr                 386
+#define __NR_fgetxattr                 387
+#define __NR_listxattr                 388
+#define __NR_llistxattr                        389
+#define __NR_flistxattr                        390
+#define __NR_removexattr               391
+#define __NR_lremovexattr              392
+#define __NR_fremovexattr              393
+#define __NR_futex                     394
+#define __NR_sched_setaffinity         395     
+#define __NR_sched_getaffinity         396
+#define __NR_tuxcall                   397
+#define __NR_io_setup                  398
+#define __NR_io_destroy                        399
+#define __NR_io_getevents              400
+#define __NR_io_submit                 401
+#define __NR_io_cancel                 402
+#define __NR_exit_group                        405
+#define __NR_lookup_dcookie            406
+#define __NR_epoll_create              407
+#define __NR_epoll_ctl                 408
+#define __NR_epoll_wait                        409
+/* Feb 2007: These three sys_epoll defines shouldn't be here but culling
+ * them would break userspace apps ... we'll kill them off in 2010 :) */
+#define __NR_sys_epoll_create          __NR_epoll_create
+#define __NR_sys_epoll_ctl             __NR_epoll_ctl
+#define __NR_sys_epoll_wait            __NR_epoll_wait
+#define __NR_remap_file_pages          410
+#define __NR_set_tid_address           411
+#define __NR_restart_syscall           412
+#define __NR_fadvise64                 413
+#define __NR_timer_create              414
+#define __NR_timer_settime             415
+#define __NR_timer_gettime             416
+#define __NR_timer_getoverrun          417
+#define __NR_timer_delete              418
+#define __NR_clock_settime             419
+#define __NR_clock_gettime             420
+#define __NR_clock_getres              421
+#define __NR_clock_nanosleep           422
+#define __NR_semtimedop                        423
+#define __NR_tgkill                    424
+#define __NR_stat64                    425
+#define __NR_lstat64                   426
+#define __NR_fstat64                   427
+#define __NR_vserver                   428
+#define __NR_mbind                     429
+#define __NR_get_mempolicy             430
+#define __NR_set_mempolicy             431
+#define __NR_mq_open                   432
+#define __NR_mq_unlink                 433
+#define __NR_mq_timedsend              434
+#define __NR_mq_timedreceive           435
+#define __NR_mq_notify                 436
+#define __NR_mq_getsetattr             437
+#define __NR_waitid                    438
+#define __NR_add_key                   439
+#define __NR_request_key               440
+#define __NR_keyctl                    441
+#define __NR_ioprio_set                        442
+#define __NR_ioprio_get                        443
+#define __NR_inotify_init              444
+#define __NR_inotify_add_watch         445
+#define __NR_inotify_rm_watch          446
+#define __NR_fdatasync                 447
+#define __NR_kexec_load                        448
+#define __NR_migrate_pages             449
+#define __NR_openat                    450
+#define __NR_mkdirat                   451
+#define __NR_mknodat                   452
+#define __NR_fchownat                  453
+#define __NR_futimesat                 454
+#define __NR_fstatat64                 455
+#define __NR_unlinkat                  456
+#define __NR_renameat                  457
+#define __NR_linkat                    458
+#define __NR_symlinkat                 459
+#define __NR_readlinkat                        460
+#define __NR_fchmodat                  461
+#define __NR_faccessat                 462
+#define __NR_pselect6                  463
+#define __NR_ppoll                     464
+#define __NR_unshare                   465
+#define __NR_set_robust_list           466
+#define __NR_get_robust_list           467
+#define __NR_splice                    468
+#define __NR_sync_file_range           469
+#define __NR_tee                       470
+#define __NR_vmsplice                  471
+#define __NR_move_pages                        472
+#define __NR_getcpu                    473
+#define __NR_epoll_pwait               474
+#define __NR_utimensat                 475
+#define __NR_signalfd                  476
+#define __NR_timerfd                   477
+#define __NR_eventfd                   478
+
+#ifdef __KERNEL__
+
+#define NR_SYSCALLS                    479
+
+#define __ARCH_WANT_IPC_PARSE_VERSION
+#define __ARCH_WANT_OLD_READDIR
+#define __ARCH_WANT_STAT64
+#define __ARCH_WANT_SYS_GETHOSTNAME
+#define __ARCH_WANT_SYS_FADVISE64
+#define __ARCH_WANT_SYS_GETPGRP
+#define __ARCH_WANT_SYS_OLD_GETRLIMIT
+#define __ARCH_WANT_SYS_OLDUMOUNT
+#define __ARCH_WANT_SYS_SIGPENDING
+
+/* "Conditional" syscalls.  What we want is
+
+       __attribute__((weak,alias("sys_ni_syscall")))
+
+   but that raises the problem of what type to give the symbol.  If we use
+   a prototype, it'll conflict with the definition given in this file and
+   others.  If we use __typeof, we discover that not all symbols actually
+   have declarations.  If we use no prototype, then we get warnings from
+   -Wstrict-prototypes.  Ho hum.  */
+
+#define cond_syscall(x)  asm(".weak\t" #x "\n" #x " = sys_ni_syscall")
+
+#endif /* __KERNEL__ */
+#endif /* _ALPHA_UNISTD_H */
diff --git a/arch/alpha/include/asm/user.h b/arch/alpha/include/asm/user.h
new file mode 100644 (file)
index 0000000..a4eb6a4
--- /dev/null
@@ -0,0 +1,53 @@
+#ifndef _ALPHA_USER_H
+#define _ALPHA_USER_H
+
+#include <linux/sched.h>
+#include <linux/ptrace.h>
+
+#include <asm/page.h>
+#include <asm/reg.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, NOT the osf-core).  The file contents
+ * are as follows:
+ *
+ *  upage: 1 page consisting of a user struct that tells gdb
+ *     what is present in the file.  Directly after this is a
+ *     copy of the task_struct, which is currently not used by gdb,
+ *     but it may come in handy at some point.  All of the registers
+ *     are stored as part of the upage.  The upage should always be
+ *     only one page long.
+ *  data: The data segment follows next.  We use current->end_text to
+ *     current->brk to pick up all of the user variables, plus any memory
+ *     that may have been sbrk'ed.  No attempt is made to determine if a
+ *     page is demand-zero or if a page is totally unused, we just cover
+ *     the entire range.  All of the addresses are rounded in such a way
+ *     that an integral number of pages is written.
+ *  stack: We need the stack information in order to get a meaningful
+ *     backtrace.  We need to write the data from usp to
+ *     current->start_stack, so we round each of these in order to be able
+ *     to write an integer number of pages.
+ */
+struct user {
+       unsigned long   regs[EF_SIZE/8+32];     /* integer and fp regs */
+       size_t          u_tsize;                /* text size (pages) */
+       size_t          u_dsize;                /* data size (pages) */
+       size_t          u_ssize;                /* stack size (pages) */
+       unsigned long   start_code;             /* text starting address */
+       unsigned long   start_data;             /* data starting address */
+       unsigned long   start_stack;            /* stack starting address */
+       long int        signal;                 /* signal causing core dump */
+       unsigned long   u_ar0;                  /* help gdb find registers */
+       unsigned long   magic;                  /* identifies a core file */
+       char            u_comm[32];             /* user command name */
+};
+
+#define NBPG                   PAGE_SIZE
+#define UPAGES                 1
+#define HOST_TEXT_START_ADDR   (u.start_code)
+#define HOST_DATA_START_ADDR   (u.start_data)
+#define HOST_STACK_END_ADDR    (u.start_stack + u.u_ssize * NBPG)
+
+#endif /* _ALPHA_USER_H */
diff --git a/arch/alpha/include/asm/vga.h b/arch/alpha/include/asm/vga.h
new file mode 100644 (file)
index 0000000..c00106b
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ *     Access to VGA videoram
+ *
+ *     (c) 1998 Martin Mares <mj@ucw.cz>
+ */
+
+#ifndef _LINUX_ASM_VGA_H_
+#define _LINUX_ASM_VGA_H_
+
+#include <asm/io.h>
+
+#define VT_BUF_HAVE_RW
+#define VT_BUF_HAVE_MEMSETW
+#define VT_BUF_HAVE_MEMCPYW
+
+static inline void scr_writew(u16 val, volatile u16 *addr)
+{
+       if (__is_ioaddr(addr))
+               __raw_writew(val, (volatile u16 __iomem *) addr);
+       else
+               *addr = val;
+}
+
+static inline u16 scr_readw(volatile const u16 *addr)
+{
+       if (__is_ioaddr(addr))
+               return __raw_readw((volatile const u16 __iomem *) addr);
+       else
+               return *addr;
+}
+
+static inline void scr_memsetw(u16 *s, u16 c, unsigned int count)
+{
+       if (__is_ioaddr(s))
+               memsetw_io((u16 __iomem *) s, c, count);
+       else
+               memsetw(s, c, count);
+}
+
+/* Do not trust that the usage will be correct; analyze the arguments.  */
+extern void scr_memcpyw(u16 *d, const u16 *s, unsigned int count);
+
+/* ??? These are currently only used for downloading character sets.  As
+   such, they don't need memory barriers.  Is this all they are intended
+   to be used for?  */
+#define vga_readb(a)   readb((u8 __iomem *)(a))
+#define vga_writeb(v,a)        writeb(v, (u8 __iomem *)(a))
+
+#ifdef CONFIG_VGA_HOSE
+#include <linux/ioport.h>
+#include <linux/pci.h>
+
+extern struct pci_controller *pci_vga_hose;
+
+# define __is_port_vga(a)       \
+       (((a) >= 0x3b0) && ((a) < 0x3e0) && \
+        ((a) != 0x3b3) && ((a) != 0x3d3))
+
+# define __is_mem_vga(a) \
+       (((a) >= 0xa0000) && ((a) <= 0xc0000))
+
+# define FIXUP_IOADDR_VGA(a) do {                       \
+       if (pci_vga_hose && __is_port_vga(a))     \
+               (a) += pci_vga_hose->io_space->start;     \
+ } while(0)
+
+# define FIXUP_MEMADDR_VGA(a) do {                       \
+       if (pci_vga_hose && __is_mem_vga(a))     \
+               (a) += pci_vga_hose->mem_space->start; \
+ } while(0)
+
+#else /* CONFIG_VGA_HOSE */
+# define pci_vga_hose 0
+# define __is_port_vga(a) 0
+# define __is_mem_vga(a) 0
+# define FIXUP_IOADDR_VGA(a)
+# define FIXUP_MEMADDR_VGA(a)
+#endif /* CONFIG_VGA_HOSE */
+
+#define VGA_MAP_MEM(x,s)       ((unsigned long) ioremap(x, s))
+
+#endif
diff --git a/arch/alpha/include/asm/xor.h b/arch/alpha/include/asm/xor.h
new file mode 100644 (file)
index 0000000..5ee1c2b
--- /dev/null
@@ -0,0 +1,855 @@
+/*
+ * include/asm-alpha/xor.h
+ *
+ * Optimized RAID-5 checksumming functions for alpha EV5 and EV6
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * (for example /usr/src/linux/COPYING); if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+extern void xor_alpha_2(unsigned long, unsigned long *, unsigned long *);
+extern void xor_alpha_3(unsigned long, unsigned long *, unsigned long *,
+                       unsigned long *);
+extern void xor_alpha_4(unsigned long, unsigned long *, unsigned long *,
+                       unsigned long *, unsigned long *);
+extern void xor_alpha_5(unsigned long, unsigned long *, unsigned long *,
+                       unsigned long *, unsigned long *, unsigned long *);
+
+extern void xor_alpha_prefetch_2(unsigned long, unsigned long *,
+                                unsigned long *);
+extern void xor_alpha_prefetch_3(unsigned long, unsigned long *,
+                                unsigned long *, unsigned long *);
+extern void xor_alpha_prefetch_4(unsigned long, unsigned long *,
+                                unsigned long *, unsigned long *,
+                                unsigned long *);
+extern void xor_alpha_prefetch_5(unsigned long, unsigned long *,
+                                unsigned long *, unsigned long *,
+                                unsigned long *, unsigned long *);
+
+asm("                                                          \n\
+       .text                                                   \n\
+       .align 3                                                \n\
+       .ent xor_alpha_2                                        \n\
+xor_alpha_2:                                                   \n\
+       .prologue 0                                             \n\
+       srl $16, 6, $16                                         \n\
+       .align 4                                                \n\
+2:                                                             \n\
+       ldq $0,0($17)                                           \n\
+       ldq $1,0($18)                                           \n\
+       ldq $2,8($17)                                           \n\
+       ldq $3,8($18)                                           \n\
+                                                               \n\
+       ldq $4,16($17)                                          \n\
+       ldq $5,16($18)                                          \n\
+       ldq $6,24($17)                                          \n\
+       ldq $7,24($18)                                          \n\
+                                                               \n\
+       ldq $19,32($17)                                         \n\
+       ldq $20,32($18)                                         \n\
+       ldq $21,40($17)                                         \n\
+       ldq $22,40($18)                                         \n\
+                                                               \n\
+       ldq $23,48($17)                                         \n\
+       ldq $24,48($18)                                         \n\
+       ldq $25,56($17)                                         \n\
+       xor $0,$1,$0            # 7 cycles from $1 load         \n\
+                                                               \n\
+       ldq $27,56($18)                                         \n\
+       xor $2,$3,$2                                            \n\
+       stq $0,0($17)                                           \n\
+       xor $4,$5,$4                                            \n\
+                                                               \n\
+       stq $2,8($17)                                           \n\
+       xor $6,$7,$6                                            \n\
+       stq $4,16($17)                                          \n\
+       xor $19,$20,$19                                         \n\
+                                                               \n\
+       stq $6,24($17)                                          \n\
+       xor $21,$22,$21                                         \n\
+       stq $19,32($17)                                         \n\
+       xor $23,$24,$23                                         \n\
+                                                               \n\
+       stq $21,40($17)                                         \n\
+       xor $25,$27,$25                                         \n\
+       stq $23,48($17)                                         \n\
+       subq $16,1,$16                                          \n\
+                                                               \n\
+       stq $25,56($17)                                         \n\
+       addq $17,64,$17                                         \n\
+       addq $18,64,$18                                         \n\
+       bgt $16,2b                                              \n\
+                                                               \n\
+       ret                                                     \n\
+       .end xor_alpha_2                                        \n\
+                                                               \n\
+       .align 3                                                \n\
+       .ent xor_alpha_3                                        \n\
+xor_alpha_3:                                                   \n\
+       .prologue 0                                             \n\
+       srl $16, 6, $16                                         \n\
+       .align 4                                                \n\
+3:                                                             \n\
+       ldq $0,0($17)                                           \n\
+       ldq $1,0($18)                                           \n\
+       ldq $2,0($19)                                           \n\
+       ldq $3,8($17)                                           \n\
+                                                               \n\
+       ldq $4,8($18)                                           \n\
+       ldq $6,16($17)                                          \n\
+       ldq $7,16($18)                                          \n\
+       ldq $21,24($17)                                         \n\
+                                                               \n\
+       ldq $22,24($18)                                         \n\
+       ldq $24,32($17)                                         \n\
+       ldq $25,32($18)                                         \n\
+       ldq $5,8($19)                                           \n\
+                                                               \n\
+       ldq $20,16($19)                                         \n\
+       ldq $23,24($19)                                         \n\
+       ldq $27,32($19)                                         \n\
+       nop                                                     \n\
+                                                               \n\
+       xor $0,$1,$1            # 8 cycles from $0 load         \n\
+       xor $3,$4,$4            # 6 cycles from $4 load         \n\
+       xor $6,$7,$7            # 6 cycles from $7 load         \n\
+       xor $21,$22,$22         # 5 cycles from $22 load        \n\
+                                                               \n\
+       xor $1,$2,$2            # 9 cycles from $2 load         \n\
+       xor $24,$25,$25         # 5 cycles from $25 load        \n\
+       stq $2,0($17)                                           \n\
+       xor $4,$5,$5            # 6 cycles from $5 load         \n\
+                                                               \n\
+       stq $5,8($17)                                           \n\
+       xor $7,$20,$20          # 7 cycles from $20 load        \n\
+       stq $20,16($17)                                         \n\
+       xor $22,$23,$23         # 7 cycles from $23 load        \n\
+                                                               \n\
+       stq $23,24($17)                                         \n\
+       xor $25,$27,$27         # 7 cycles from $27 load        \n\
+       stq $27,32($17)                                         \n\
+       nop                                                     \n\
+                                                               \n\
+       ldq $0,40($17)                                          \n\
+       ldq $1,40($18)                                          \n\
+       ldq $3,48($17)                                          \n\
+       ldq $4,48($18)                                          \n\
+                                                               \n\
+       ldq $6,56($17)                                          \n\
+       ldq $7,56($18)                                          \n\
+       ldq $2,40($19)                                          \n\
+       ldq $5,48($19)                                          \n\
+                                                               \n\
+       ldq $20,56($19)                                         \n\
+       xor $0,$1,$1            # 4 cycles from $1 load         \n\
+       xor $3,$4,$4            # 5 cycles from $4 load         \n\
+       xor $6,$7,$7            # 5 cycles from $7 load         \n\
+                                                               \n\
+       xor $1,$2,$2            # 4 cycles from $2 load         \n\
+       xor $4,$5,$5            # 5 cycles from $5 load         \n\
+       stq $2,40($17)                                          \n\
+       xor $7,$20,$20          # 4 cycles from $20 load        \n\
+                                                               \n\
+       stq $5,48($17)                                          \n\
+       subq $16,1,$16                                          \n\
+       stq $20,56($17)                                         \n\
+       addq $19,64,$19                                         \n\
+                                                               \n\
+       addq $18,64,$18                                         \n\
+       addq $17,64,$17                                         \n\
+       bgt $16,3b                                              \n\
+       ret                                                     \n\
+       .end xor_alpha_3                                        \n\
+                                                               \n\
+       .align 3                                                \n\
+       .ent xor_alpha_4                                        \n\
+xor_alpha_4:                                                   \n\
+       .prologue 0                                             \n\
+       srl $16, 6, $16                                         \n\
+       .align 4                                                \n\
+4:                                                             \n\
+       ldq $0,0($17)                                           \n\
+       ldq $1,0($18)                                           \n\
+       ldq $2,0($19)                                           \n\
+       ldq $3,0($20)                                           \n\
+                                                               \n\
+       ldq $4,8($17)                                           \n\
+       ldq $5,8($18)                                           \n\
+       ldq $6,8($19)                                           \n\
+       ldq $7,8($20)                                           \n\
+                                                               \n\
+       ldq $21,16($17)                                         \n\
+       ldq $22,16($18)                                         \n\
+       ldq $23,16($19)                                         \n\
+       ldq $24,16($20)                                         \n\
+                                                               \n\
+       ldq $25,24($17)                                         \n\
+       xor $0,$1,$1            # 6 cycles from $1 load         \n\
+       ldq $27,24($18)                                         \n\
+       xor $2,$3,$3            # 6 cycles from $3 load         \n\
+                                                               \n\
+       ldq $0,24($19)                                          \n\
+       xor $1,$3,$3                                            \n\
+       ldq $1,24($20)                                          \n\
+       xor $4,$5,$5            # 7 cycles from $5 load         \n\
+                                                               \n\
+       stq $3,0($17)                                           \n\
+       xor $6,$7,$7                                            \n\
+       xor $21,$22,$22         # 7 cycles from $22 load        \n\
+       xor $5,$7,$7                                            \n\
+                                                               \n\
+       stq $7,8($17)                                           \n\
+       xor $23,$24,$24         # 7 cycles from $24 load        \n\
+       ldq $2,32($17)                                          \n\
+       xor $22,$24,$24                                         \n\
+                                                               \n\
+       ldq $3,32($18)                                          \n\
+       ldq $4,32($19)                                          \n\
+       ldq $5,32($20)                                          \n\
+       xor $25,$27,$27         # 8 cycles from $27 load        \n\
+                                                               \n\
+       ldq $6,40($17)                                          \n\
+       ldq $7,40($18)                                          \n\
+       ldq $21,40($19)                                         \n\
+       ldq $22,40($20)                                         \n\
+                                                               \n\
+       stq $24,16($17)                                         \n\
+       xor $0,$1,$1            # 9 cycles from $1 load         \n\
+       xor $2,$3,$3            # 5 cycles from $3 load         \n\
+       xor $27,$1,$1                                           \n\
+                                                               \n\
+       stq $1,24($17)                                          \n\
+       xor $4,$5,$5            # 5 cycles from $5 load         \n\
+       ldq $23,48($17)                                         \n\
+       ldq $24,48($18)                                         \n\
+                                                               \n\
+       ldq $25,48($19)                                         \n\
+       xor $3,$5,$5                                            \n\
+       ldq $27,48($20)                                         \n\
+       ldq $0,56($17)                                          \n\
+                                                               \n\
+       ldq $1,56($18)                                          \n\
+       ldq $2,56($19)                                          \n\
+       xor $6,$7,$7            # 8 cycles from $6 load         \n\
+       ldq $3,56($20)                                          \n\
+                                                               \n\
+       stq $5,32($17)                                          \n\
+       xor $21,$22,$22         # 8 cycles from $22 load        \n\
+       xor $7,$22,$22                                          \n\
+       xor $23,$24,$24         # 5 cycles from $24 load        \n\
+                                                               \n\
+       stq $22,40($17)                                         \n\
+       xor $25,$27,$27         # 5 cycles from $27 load        \n\
+       xor $24,$27,$27                                         \n\
+       xor $0,$1,$1            # 5 cycles from $1 load         \n\
+                                                               \n\
+       stq $27,48($17)                                         \n\
+       xor $2,$3,$3            # 4 cycles from $3 load         \n\
+       xor $1,$3,$3                                            \n\
+       subq $16,1,$16                                          \n\
+                                                               \n\
+       stq $3,56($17)                                          \n\
+       addq $20,64,$20                                         \n\
+       addq $19,64,$19                                         \n\
+       addq $18,64,$18                                         \n\
+                                                               \n\
+       addq $17,64,$17                                         \n\
+       bgt $16,4b                                              \n\
+       ret                                                     \n\
+       .end xor_alpha_4                                        \n\
+                                                               \n\
+       .align 3                                                \n\
+       .ent xor_alpha_5                                        \n\
+xor_alpha_5:                                                   \n\
+       .prologue 0                                             \n\
+       srl $16, 6, $16                                         \n\
+       .align 4                                                \n\
+5:                                                             \n\
+       ldq $0,0($17)                                           \n\
+       ldq $1,0($18)                                           \n\
+       ldq $2,0($19)                                           \n\
+       ldq $3,0($20)                                           \n\
+                                                               \n\
+       ldq $4,0($21)                                           \n\
+       ldq $5,8($17)                                           \n\
+       ldq $6,8($18)                                           \n\
+       ldq $7,8($19)                                           \n\
+                                                               \n\
+       ldq $22,8($20)                                          \n\
+       ldq $23,8($21)                                          \n\
+       ldq $24,16($17)                                         \n\
+       ldq $25,16($18)                                         \n\
+                                                               \n\
+       ldq $27,16($19)                                         \n\
+       xor $0,$1,$1            # 6 cycles from $1 load         \n\
+       ldq $28,16($20)                                         \n\
+       xor $2,$3,$3            # 6 cycles from $3 load         \n\
+                                                               \n\
+       ldq $0,16($21)                                          \n\
+       xor $1,$3,$3                                            \n\
+       ldq $1,24($17)                                          \n\
+       xor $3,$4,$4            # 7 cycles from $4 load         \n\
+                                                               \n\
+       stq $4,0($17)                                           \n\
+       xor $5,$6,$6            # 7 cycles from $6 load         \n\
+       xor $7,$22,$22          # 7 cycles from $22 load        \n\
+       xor $6,$23,$23          # 7 cycles from $23 load        \n\
+                                                               \n\
+       ldq $2,24($18)                                          \n\
+       xor $22,$23,$23                                         \n\
+       ldq $3,24($19)                                          \n\
+       xor $24,$25,$25         # 8 cycles from $25 load        \n\
+                                                               \n\
+       stq $23,8($17)                                          \n\
+       xor $25,$27,$27         # 8 cycles from $27 load        \n\
+       ldq $4,24($20)                                          \n\
+       xor $28,$0,$0           # 7 cycles from $0 load         \n\
+                                                               \n\
+       ldq $5,24($21)                                          \n\
+       xor $27,$0,$0                                           \n\
+       ldq $6,32($17)                                          \n\
+       ldq $7,32($18)                                          \n\
+                                                               \n\
+       stq $0,16($17)                                          \n\
+       xor $1,$2,$2            # 6 cycles from $2 load         \n\
+       ldq $22,32($19)                                         \n\
+       xor $3,$4,$4            # 4 cycles from $4 load         \n\
+                                                               \n\
+       ldq $23,32($20)                                         \n\
+       xor $2,$4,$4                                            \n\
+       ldq $24,32($21)                                         \n\
+       ldq $25,40($17)                                         \n\
+                                                               \n\
+       ldq $27,40($18)                                         \n\
+       ldq $28,40($19)                                         \n\
+       ldq $0,40($20)                                          \n\
+       xor $4,$5,$5            # 7 cycles from $5 load         \n\
+                                                               \n\
+       stq $5,24($17)                                          \n\
+       xor $6,$7,$7            # 7 cycles from $7 load         \n\
+       ldq $1,40($21)                                          \n\
+       ldq $2,48($17)                                          \n\
+                                                               \n\
+       ldq $3,48($18)                                          \n\
+       xor $7,$22,$22          # 7 cycles from $22 load        \n\
+       ldq $4,48($19)                                          \n\
+       xor $23,$24,$24         # 6 cycles from $24 load        \n\
+                                                               \n\
+       ldq $5,48($20)                                          \n\
+       xor $22,$24,$24                                         \n\
+       ldq $6,48($21)                                          \n\
+       xor $25,$27,$27         # 7 cycles from $27 load        \n\
+                                                               \n\
+       stq $24,32($17)                                         \n\
+       xor $27,$28,$28         # 8 cycles from $28 load        \n\
+       ldq $7,56($17)                                          \n\
+       xor $0,$1,$1            # 6 cycles from $1 load         \n\
+                                                               \n\
+       ldq $22,56($18)                                         \n\
+       ldq $23,56($19)                                         \n\
+       ldq $24,56($20)                                         \n\
+       ldq $25,56($21)                                         \n\
+                                                               \n\
+       xor $28,$1,$1                                           \n\
+       xor $2,$3,$3            # 9 cycles from $3 load         \n\
+       xor $3,$4,$4            # 9 cycles from $4 load         \n\
+       xor $5,$6,$6            # 8 cycles from $6 load         \n\
+                                                               \n\
+       stq $1,40($17)                                          \n\
+       xor $4,$6,$6                                            \n\
+       xor $7,$22,$22          # 7 cycles from $22 load        \n\
+       xor $23,$24,$24         # 6 cycles from $24 load        \n\
+                                                               \n\
+       stq $6,48($17)                                          \n\
+       xor $22,$24,$24                                         \n\
+       subq $16,1,$16                                          \n\
+       xor $24,$25,$25         # 8 cycles from $25 load        \n\
+                                                               \n\
+       stq $25,56($17)                                         \n\
+       addq $21,64,$21                                         \n\
+       addq $20,64,$20                                         \n\
+       addq $19,64,$19                                         \n\
+                                                               \n\
+       addq $18,64,$18                                         \n\
+       addq $17,64,$17                                         \n\
+       bgt $16,5b                                              \n\
+       ret                                                     \n\
+       .end xor_alpha_5                                        \n\
+                                                               \n\
+       .align 3                                                \n\
+       .ent xor_alpha_prefetch_2                               \n\
+xor_alpha_prefetch_2:                                          \n\
+       .prologue 0                                             \n\
+       srl $16, 6, $16                                         \n\
+                                                               \n\
+       ldq $31, 0($17)                                         \n\
+       ldq $31, 0($18)                                         \n\
+                                                               \n\
+       ldq $31, 64($17)                                        \n\
+       ldq $31, 64($18)                                        \n\
+                                                               \n\
+       ldq $31, 128($17)                                       \n\
+       ldq $31, 128($18)                                       \n\
+                                                               \n\
+       ldq $31, 192($17)                                       \n\
+       ldq $31, 192($18)                                       \n\
+       .align 4                                                \n\
+2:                                                             \n\
+       ldq $0,0($17)                                           \n\
+       ldq $1,0($18)                                           \n\
+       ldq $2,8($17)                                           \n\
+       ldq $3,8($18)                                           \n\
+                                                               \n\
+       ldq $4,16($17)                                          \n\
+       ldq $5,16($18)                                          \n\
+       ldq $6,24($17)                                          \n\
+       ldq $7,24($18)                                          \n\
+                                                               \n\
+       ldq $19,32($17)                                         \n\
+       ldq $20,32($18)                                         \n\
+       ldq $21,40($17)                                         \n\
+       ldq $22,40($18)                                         \n\
+                                                               \n\
+       ldq $23,48($17)                                         \n\
+       ldq $24,48($18)                                         \n\
+       ldq $25,56($17)                                         \n\
+       ldq $27,56($18)                                         \n\
+                                                               \n\
+       ldq $31,256($17)                                        \n\
+       xor $0,$1,$0            # 8 cycles from $1 load         \n\
+       ldq $31,256($18)                                        \n\
+       xor $2,$3,$2                                            \n\
+                                                               \n\
+       stq $0,0($17)                                           \n\
+       xor $4,$5,$4                                            \n\
+       stq $2,8($17)                                           \n\
+       xor $6,$7,$6                                            \n\
+                                                               \n\
+       stq $4,16($17)                                          \n\
+       xor $19,$20,$19                                         \n\
+       stq $6,24($17)                                          \n\
+       xor $21,$22,$21                                         \n\
+                                                               \n\
+       stq $19,32($17)                                         \n\
+       xor $23,$24,$23                                         \n\
+       stq $21,40($17)                                         \n\
+       xor $25,$27,$25                                         \n\
+                                                               \n\
+       stq $23,48($17)                                         \n\
+       subq $16,1,$16                                          \n\
+       stq $25,56($17)                                         \n\
+       addq $17,64,$17                                         \n\
+                                                               \n\
+       addq $18,64,$18                                         \n\
+       bgt $16,2b                                              \n\
+       ret                                                     \n\
+       .end xor_alpha_prefetch_2                               \n\
+                                                               \n\
+       .align 3                                                \n\
+       .ent xor_alpha_prefetch_3                               \n\
+xor_alpha_prefetch_3:                                          \n\
+       .prologue 0                                             \n\
+       srl $16, 6, $16                                         \n\
+                                                               \n\
+       ldq $31, 0($17)                                         \n\
+       ldq $31, 0($18)                                         \n\
+       ldq $31, 0($19)                                         \n\
+                                                               \n\
+       ldq $31, 64($17)                                        \n\
+       ldq $31, 64($18)                                        \n\
+       ldq $31, 64($19)                                        \n\
+                                                               \n\
+       ldq $31, 128($17)                                       \n\
+       ldq $31, 128($18)                                       \n\
+       ldq $31, 128($19)                                       \n\
+                                                               \n\
+       ldq $31, 192($17)                                       \n\
+       ldq $31, 192($18)                                       \n\
+       ldq $31, 192($19)                                       \n\
+       .align 4                                                \n\
+3:                                                             \n\
+       ldq $0,0($17)                                           \n\
+       ldq $1,0($18)                                           \n\
+       ldq $2,0($19)                                           \n\
+       ldq $3,8($17)                                           \n\
+                                                               \n\
+       ldq $4,8($18)                                           \n\
+       ldq $6,16($17)                                          \n\
+       ldq $7,16($18)                                          \n\
+       ldq $21,24($17)                                         \n\
+                                                               \n\
+       ldq $22,24($18)                                         \n\
+       ldq $24,32($17)                                         \n\
+       ldq $25,32($18)                                         \n\
+       ldq $5,8($19)                                           \n\
+                                                               \n\
+       ldq $20,16($19)                                         \n\
+       ldq $23,24($19)                                         \n\
+       ldq $27,32($19)                                         \n\
+       nop                                                     \n\
+                                                               \n\
+       xor $0,$1,$1            # 8 cycles from $0 load         \n\
+       xor $3,$4,$4            # 7 cycles from $4 load         \n\
+       xor $6,$7,$7            # 6 cycles from $7 load         \n\
+       xor $21,$22,$22         # 5 cycles from $22 load        \n\
+                                                               \n\
+       xor $1,$2,$2            # 9 cycles from $2 load         \n\
+       xor $24,$25,$25         # 5 cycles from $25 load        \n\
+       stq $2,0($17)                                           \n\
+       xor $4,$5,$5            # 6 cycles from $5 load         \n\
+                                                               \n\
+       stq $5,8($17)                                           \n\
+       xor $7,$20,$20          # 7 cycles from $20 load        \n\
+       stq $20,16($17)                                         \n\
+       xor $22,$23,$23         # 7 cycles from $23 load        \n\
+                                                               \n\
+       stq $23,24($17)                                         \n\
+       xor $25,$27,$27         # 7 cycles from $27 load        \n\
+       stq $27,32($17)                                         \n\
+       nop                                                     \n\
+                                                               \n\
+       ldq $0,40($17)                                          \n\
+       ldq $1,40($18)                                          \n\
+       ldq $3,48($17)                                          \n\
+       ldq $4,48($18)                                          \n\
+                                                               \n\
+       ldq $6,56($17)                                          \n\
+       ldq $7,56($18)                                          \n\
+       ldq $2,40($19)                                          \n\
+       ldq $5,48($19)                                          \n\
+                                                               \n\
+       ldq $20,56($19)                                         \n\
+       ldq $31,256($17)                                        \n\
+       ldq $31,256($18)                                        \n\
+       ldq $31,256($19)                                        \n\
+                                                               \n\
+       xor $0,$1,$1            # 6 cycles from $1 load         \n\
+       xor $3,$4,$4            # 5 cycles from $4 load         \n\
+       xor $6,$7,$7            # 5 cycles from $7 load         \n\
+       xor $1,$2,$2            # 4 cycles from $2 load         \n\
+                                                               \n\
+       xor $4,$5,$5            # 5 cycles from $5 load         \n\
+       xor $7,$20,$20          # 4 cycles from $20 load        \n\
+       stq $2,40($17)                                          \n\
+       subq $16,1,$16                                          \n\
+                                                               \n\
+       stq $5,48($17)                                          \n\
+       addq $19,64,$19                                         \n\
+       stq $20,56($17)                                         \n\
+       addq $18,64,$18                                         \n\
+                                                               \n\
+       addq $17,64,$17                                         \n\
+       bgt $16,3b                                              \n\
+       ret                                                     \n\
+       .end xor_alpha_prefetch_3                               \n\
+                                                               \n\
+       .align 3                                                \n\
+       .ent xor_alpha_prefetch_4                               \n\
+xor_alpha_prefetch_4:                                          \n\
+       .prologue 0                                             \n\
+       srl $16, 6, $16                                         \n\
+                                                               \n\
+       ldq $31, 0($17)                                         \n\
+       ldq $31, 0($18)                                         \n\
+       ldq $31, 0($19)                                         \n\
+       ldq $31, 0($20)                                         \n\
+                                                               \n\
+       ldq $31, 64($17)                                        \n\
+       ldq $31, 64($18)                                        \n\
+       ldq $31, 64($19)                                        \n\
+       ldq $31, 64($20)                                        \n\
+                                                               \n\
+       ldq $31, 128($17)                                       \n\
+       ldq $31, 128($18)                                       \n\
+       ldq $31, 128($19)                                       \n\
+       ldq $31, 128($20)                                       \n\
+                                                               \n\
+       ldq $31, 192($17)                                       \n\
+       ldq $31, 192($18)                                       \n\
+       ldq $31, 192($19)                                       \n\
+       ldq $31, 192($20)                                       \n\
+       .align 4                                                \n\
+4:                                                             \n\
+       ldq $0,0($17)                                           \n\
+       ldq $1,0($18)                                           \n\
+       ldq $2,0($19)                                           \n\
+       ldq $3,0($20)                                           \n\
+                                                               \n\
+       ldq $4,8($17)                                           \n\
+       ldq $5,8($18)                                           \n\
+       ldq $6,8($19)                                           \n\
+       ldq $7,8($20)                                           \n\
+                                                               \n\
+       ldq $21,16($17)                                         \n\
+       ldq $22,16($18)                                         \n\
+       ldq $23,16($19)                                         \n\
+       ldq $24,16($20)                                         \n\
+                                                               \n\
+       ldq $25,24($17)                                         \n\
+       xor $0,$1,$1            # 6 cycles from $1 load         \n\
+       ldq $27,24($18)                                         \n\
+       xor $2,$3,$3            # 6 cycles from $3 load         \n\
+                                                               \n\
+       ldq $0,24($19)                                          \n\
+       xor $1,$3,$3                                            \n\
+       ldq $1,24($20)                                          \n\
+       xor $4,$5,$5            # 7 cycles from $5 load         \n\
+                                                               \n\
+       stq $3,0($17)                                           \n\
+       xor $6,$7,$7                                            \n\
+       xor $21,$22,$22         # 7 cycles from $22 load        \n\
+       xor $5,$7,$7                                            \n\
+                                                               \n\
+       stq $7,8($17)                                           \n\
+       xor $23,$24,$24         # 7 cycles from $24 load        \n\
+       ldq $2,32($17)                                          \n\
+       xor $22,$24,$24                                         \n\
+                                                               \n\
+       ldq $3,32($18)                                          \n\
+       ldq $4,32($19)                                          \n\
+       ldq $5,32($20)                                          \n\
+       xor $25,$27,$27         # 8 cycles from $27 load        \n\
+                                                               \n\
+       ldq $6,40($17)                                          \n\
+       ldq $7,40($18)                                          \n\
+       ldq $21,40($19)                                         \n\
+       ldq $22,40($20)                                         \n\
+                                                               \n\
+       stq $24,16($17)                                         \n\
+       xor $0,$1,$1            # 9 cycles from $1 load         \n\
+       xor $2,$3,$3            # 5 cycles from $3 load         \n\
+       xor $27,$1,$1                                           \n\
+                                                               \n\
+       stq $1,24($17)                                          \n\
+       xor $4,$5,$5            # 5 cycles from $5 load         \n\
+       ldq $23,48($17)                                         \n\
+       xor $3,$5,$5                                            \n\
+                                                               \n\
+       ldq $24,48($18)                                         \n\
+       ldq $25,48($19)                                         \n\
+       ldq $27,48($20)                                         \n\
+       ldq $0,56($17)                                          \n\
+                                                               \n\
+       ldq $1,56($18)                                          \n\
+       ldq $2,56($19)                                          \n\
+       ldq $3,56($20)                                          \n\
+       xor $6,$7,$7            # 8 cycles from $6 load         \n\
+                                                               \n\
+       ldq $31,256($17)                                        \n\
+       xor $21,$22,$22         # 8 cycles from $22 load        \n\
+       ldq $31,256($18)                                        \n\
+       xor $7,$22,$22                                          \n\
+                                                               \n\
+       ldq $31,256($19)                                        \n\
+       xor $23,$24,$24         # 6 cycles from $24 load        \n\
+       ldq $31,256($20)                                        \n\
+       xor $25,$27,$27         # 6 cycles from $27 load        \n\
+                                                               \n\
+       stq $5,32($17)                                          \n\
+       xor $24,$27,$27                                         \n\
+       xor $0,$1,$1            # 7 cycles from $1 load         \n\
+       xor $2,$3,$3            # 6 cycles from $3 load         \n\
+                                                               \n\
+       stq $22,40($17)                                         \n\
+       xor $1,$3,$3                                            \n\
+       stq $27,48($17)                                         \n\
+       subq $16,1,$16                                          \n\
+                                                               \n\
+       stq $3,56($17)                                          \n\
+       addq $20,64,$20                                         \n\
+       addq $19,64,$19                                         \n\
+       addq $18,64,$18                                         \n\
+                                                               \n\
+       addq $17,64,$17                                         \n\
+       bgt $16,4b                                              \n\
+       ret                                                     \n\
+       .end xor_alpha_prefetch_4                               \n\
+                                                               \n\
+       .align 3                                                \n\
+       .ent xor_alpha_prefetch_5                               \n\
+xor_alpha_prefetch_5:                                          \n\
+       .prologue 0                                             \n\
+       srl $16, 6, $16                                         \n\
+                                                               \n\
+       ldq $31, 0($17)                                         \n\
+       ldq $31, 0($18)                                         \n\
+       ldq $31, 0($19)                                         \n\
+       ldq $31, 0($20)                                         \n\
+       ldq $31, 0($21)                                         \n\
+                                                               \n\
+       ldq $31, 64($17)                                        \n\
+       ldq $31, 64($18)                                        \n\
+       ldq $31, 64($19)                                        \n\
+       ldq $31, 64($20)                                        \n\
+       ldq $31, 64($21)                                        \n\
+                                                               \n\
+       ldq $31, 128($17)                                       \n\
+       ldq $31, 128($18)                                       \n\
+       ldq $31, 128($19)                                       \n\
+       ldq $31, 128($20)                                       \n\
+       ldq $31, 128($21)                                       \n\
+                                                               \n\
+       ldq $31, 192($17)                                       \n\
+       ldq $31, 192($18)                                       \n\
+       ldq $31, 192($19)                                       \n\
+       ldq $31, 192($20)                                       \n\
+       ldq $31, 192($21)                                       \n\
+       .align 4                                                \n\
+5:                                                             \n\
+       ldq $0,0($17)                                           \n\
+       ldq $1,0($18)                                           \n\
+       ldq $2,0($19)                                           \n\
+       ldq $3,0($20)                                           \n\
+                                                               \n\
+       ldq $4,0($21)                                           \n\
+       ldq $5,8($17)                                           \n\
+       ldq $6,8($18)                                           \n\
+       ldq $7,8($19)                                           \n\
+                                                               \n\
+       ldq $22,8($20)                                          \n\
+       ldq $23,8($21)                                          \n\
+       ldq $24,16($17)                                         \n\
+       ldq $25,16($18)                                         \n\
+                                                               \n\
+       ldq $27,16($19)                                         \n\
+       xor $0,$1,$1            # 6 cycles from $1 load         \n\
+       ldq $28,16($20)                                         \n\
+       xor $2,$3,$3            # 6 cycles from $3 load         \n\
+                                                               \n\
+       ldq $0,16($21)                                          \n\
+       xor $1,$3,$3                                            \n\
+       ldq $1,24($17)                                          \n\
+       xor $3,$4,$4            # 7 cycles from $4 load         \n\
+                                                               \n\
+       stq $4,0($17)                                           \n\
+       xor $5,$6,$6            # 7 cycles from $6 load         \n\
+       xor $7,$22,$22          # 7 cycles from $22 load        \n\
+       xor $6,$23,$23          # 7 cycles from $23 load        \n\
+                                                               \n\
+       ldq $2,24($18)                                          \n\
+       xor $22,$23,$23                                         \n\
+       ldq $3,24($19)                                          \n\
+       xor $24,$25,$25         # 8 cycles from $25 load        \n\
+                                                               \n\
+       stq $23,8($17)                                          \n\
+       xor $25,$27,$27         # 8 cycles from $27 load        \n\
+       ldq $4,24($20)                                          \n\
+       xor $28,$0,$0           # 7 cycles from $0 load         \n\
+                                                               \n\
+       ldq $5,24($21)                                          \n\
+       xor $27,$0,$0                                           \n\
+       ldq $6,32($17)                                          \n\
+       ldq $7,32($18)                                          \n\
+                                                               \n\
+       stq $0,16($17)                                          \n\
+       xor $1,$2,$2            # 6 cycles from $2 load         \n\
+       ldq $22,32($19)                                         \n\
+       xor $3,$4,$4            # 4 cycles from $4 load         \n\
+                                                               \n\
+       ldq $23,32($20)                                         \n\
+       xor $2,$4,$4                                            \n\
+       ldq $24,32($21)                                         \n\
+       ldq $25,40($17)                                         \n\
+                                                               \n\
+       ldq $27,40($18)                                         \n\
+       ldq $28,40($19)                                         \n\
+       ldq $0,40($20)                                          \n\
+       xor $4,$5,$5            # 7 cycles from $5 load         \n\
+                                                               \n\
+       stq $5,24($17)                                          \n\
+       xor $6,$7,$7            # 7 cycles from $7 load         \n\
+       ldq $1,40($21)                                          \n\
+       ldq $2,48($17)                                          \n\
+                                                               \n\
+       ldq $3,48($18)                                          \n\
+       xor $7,$22,$22          # 7 cycles from $22 load        \n\
+       ldq $4,48($19)                                          \n\
+       xor $23,$24,$24         # 6 cycles from $24 load        \n\
+                                                               \n\
+       ldq $5,48($20)                                          \n\
+       xor $22,$24,$24                                         \n\
+       ldq $6,48($21)                                          \n\
+       xor $25,$27,$27         # 7 cycles from $27 load        \n\
+                                                               \n\
+       stq $24,32($17)                                         \n\
+       xor $27,$28,$28         # 8 cycles from $28 load        \n\
+       ldq $7,56($17)                                          \n\
+       xor $0,$1,$1            # 6 cycles from $1 load         \n\
+                                                               \n\
+       ldq $22,56($18)                                         \n\
+       ldq $23,56($19)                                         \n\
+       ldq $24,56($20)                                         \n\
+       ldq $25,56($21)                                         \n\
+                                                               \n\
+       ldq $31,256($17)                                        \n\
+       xor $28,$1,$1                                           \n\
+       ldq $31,256($18)                                        \n\
+       xor $2,$3,$3            # 9 cycles from $3 load         \n\
+                                                               \n\
+       ldq $31,256($19)                                        \n\
+       xor $3,$4,$4            # 9 cycles from $4 load         \n\
+       ldq $31,256($20)                                        \n\
+       xor $5,$6,$6            # 8 cycles from $6 load         \n\
+                                                               \n\
+       stq $1,40($17)                                          \n\
+       xor $4,$6,$6                                            \n\
+       xor $7,$22,$22          # 7 cycles from $22 load        \n\
+       xor $23,$24,$24         # 6 cycles from $24 load        \n\
+                                                               \n\
+       stq $6,48($17)                                          \n\
+       xor $22,$24,$24                                         \n\
+       ldq $31,256($21)                                        \n\
+       xor $24,$25,$25         # 8 cycles from $25 load        \n\
+                                                               \n\
+       stq $25,56($17)                                         \n\
+       subq $16,1,$16                                          \n\
+       addq $21,64,$21                                         \n\
+       addq $20,64,$20                                         \n\
+                                                               \n\
+       addq $19,64,$19                                         \n\
+       addq $18,64,$18                                         \n\
+       addq $17,64,$17                                         \n\
+       bgt $16,5b                                              \n\
+                                                               \n\
+       ret                                                     \n\
+       .end xor_alpha_prefetch_5                               \n\
+");
+
+static struct xor_block_template xor_block_alpha = {
+       .name   = "alpha",
+       .do_2   = xor_alpha_2,
+       .do_3   = xor_alpha_3,
+       .do_4   = xor_alpha_4,
+       .do_5   = xor_alpha_5,
+};
+
+static struct xor_block_template xor_block_alpha_prefetch = {
+       .name   = "alpha prefetch",
+       .do_2   = xor_alpha_prefetch_2,
+       .do_3   = xor_alpha_prefetch_3,
+       .do_4   = xor_alpha_prefetch_4,
+       .do_5   = xor_alpha_prefetch_5,
+};
+
+/* For grins, also test the generic routines.  */
+#include <asm-generic/xor.h>
+
+#undef XOR_TRY_TEMPLATES
+#define XOR_TRY_TEMPLATES                              \
+       do {                                            \
+               xor_speed(&xor_block_8regs);            \
+               xor_speed(&xor_block_32regs);           \
+               xor_speed(&xor_block_alpha);            \
+               xor_speed(&xor_block_alpha_prefetch);   \
+       } while (0)
+
+/* Force the use of alpha_prefetch if EV6, as it is significantly
+   faster in the cold cache case.  */
+#define XOR_SELECT_TEMPLATE(FASTEST) \
+       (implver() == IMPLVER_EV6 ? &xor_block_alpha_prefetch : FASTEST)
index b15f927a5926187f90f0ba50da935c18a4a5061e..ab204db594d3fc23cea35384a668d706a18c1a1c 100644 (file)
@@ -1,2 +1,3 @@
-piggy.gz
 font.c
+piggy.gz
+vmlinux.lds
index 69130f365904bc0889e3f99d75af10834c9a9f8d..aecc6c3f908fd2dd5a79e31a847d1c9cd1cc2568 100644 (file)
@@ -246,9 +246,9 @@ map_single(struct device *dev, void *ptr, size_t size,
                }
 
                dev_dbg(dev,
-                       "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n",
-                       __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr),
-                       buf->safe, (void *) buf->safe_dma_addr);
+                       "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n",
+                       __func__, buf->ptr, virt_to_dma(dev, buf->ptr),
+                       buf->safe, buf->safe_dma_addr);
 
                if ((dir == DMA_TO_DEVICE) ||
                    (dir == DMA_BIDIRECTIONAL)) {
@@ -292,9 +292,9 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
                BUG_ON(buf->size != size);
 
                dev_dbg(dev,
-                       "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n",
-                       __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr),
-                       buf->safe, (void *) buf->safe_dma_addr);
+                       "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n",
+                       __func__, buf->ptr, virt_to_dma(dev, buf->ptr),
+                       buf->safe, buf->safe_dma_addr);
 
                DO_STATS ( device_info->bounce_count++ );
 
@@ -321,9 +321,8 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
        }
 }
 
-static inline void
-sync_single(struct device *dev, dma_addr_t dma_addr, size_t size,
-               enum dma_data_direction dir)
+static int sync_single(struct device *dev, dma_addr_t dma_addr, size_t size,
+                       enum dma_data_direction dir)
 {
        struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
        struct safe_buffer *buf = NULL;
@@ -355,9 +354,9 @@ sync_single(struct device *dev, dma_addr_t dma_addr, size_t size,
                 */
 
                dev_dbg(dev,
-                       "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n",
-                       __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr),
-                       buf->safe, (void *) buf->safe_dma_addr);
+                       "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n",
+                       __func__, buf->ptr, virt_to_dma(dev, buf->ptr),
+                       buf->safe, buf->safe_dma_addr);
 
                DO_STATS ( device_info->bounce_count++ );
 
@@ -383,8 +382,9 @@ sync_single(struct device *dev, dma_addr_t dma_addr, size_t size,
                 * No need to sync the safe buffer - it was allocated
                 * via the coherent allocators.
                 */
+               return 0;
        } else {
-               dma_cache_maint(dma_to_virt(dev, dma_addr), size, dir);
+               return 1;
        }
 }
 
@@ -474,25 +474,29 @@ dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents,
        }
 }
 
-void
-dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_addr, size_t size,
-                               enum dma_data_direction dir)
+void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_addr,
+                                  unsigned long offset, size_t size,
+                                  enum dma_data_direction dir)
 {
-       dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n",
-               __func__, (void *) dma_addr, size, dir);
+       dev_dbg(dev, "%s(dma=%#x,off=%#lx,size=%zx,dir=%x)\n",
+               __func__, dma_addr, offset, size, dir);
 
-       sync_single(dev, dma_addr, size, dir);
+       if (sync_single(dev, dma_addr, offset + size, dir))
+               dma_cache_maint(dma_to_virt(dev, dma_addr) + offset, size, dir);
 }
+EXPORT_SYMBOL(dma_sync_single_range_for_cpu);
 
-void
-dma_sync_single_for_device(struct device *dev, dma_addr_t dma_addr, size_t size,
-                               enum dma_data_direction dir)
+void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_addr,
+                                     unsigned long offset, size_t size,
+                                     enum dma_data_direction dir)
 {
-       dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n",
-               __func__, (void *) dma_addr, size, dir);
+       dev_dbg(dev, "%s(dma=%#x,off=%#lx,size=%zx,dir=%x)\n",
+               __func__, dma_addr, offset, size, dir);
 
-       sync_single(dev, dma_addr, size, dir);
+       if (sync_single(dev, dma_addr, offset + size, dir))
+               dma_cache_maint(dma_to_virt(dev, dma_addr) + offset, size, dir);
 }
+EXPORT_SYMBOL(dma_sync_single_range_for_device);
 
 void
 dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents,
@@ -644,8 +648,6 @@ EXPORT_SYMBOL(dma_map_single);
 EXPORT_SYMBOL(dma_unmap_single);
 EXPORT_SYMBOL(dma_map_sg);
 EXPORT_SYMBOL(dma_unmap_sg);
-EXPORT_SYMBOL(dma_sync_single_for_cpu);
-EXPORT_SYMBOL(dma_sync_single_for_device);
 EXPORT_SYMBOL(dma_sync_sg_for_cpu);
 EXPORT_SYMBOL(dma_sync_sg_for_device);
 EXPORT_SYMBOL(dmabounce_register_dev);
index 9578b5d9f9c76af3ae92e4cb286365d930311108..1464ffe71717ff10a41b56e9753affacd3a89596 100644 (file)
@@ -757,7 +757,14 @@ CONFIG_INPUT_EVDEV=y
 #
 # Input Device Drivers
 #
-# CONFIG_INPUT_KEYBOARD is not set
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+CONFIG_KEYBOARD_GPIO=y
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_INPUT_JOYSTICK is not set
 # CONFIG_INPUT_TABLET is not set
@@ -1111,11 +1118,11 @@ CONFIG_RTC_DRV_DS1307=y
 CONFIG_RTC_DRV_RS5C372=y
 # CONFIG_RTC_DRV_ISL1208 is not set
 # CONFIG_RTC_DRV_X1205 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
+CONFIG_RTC_DRV_PCF8563=y
 # CONFIG_RTC_DRV_PCF8583 is not set
 CONFIG_RTC_DRV_M41T80=y
 # CONFIG_RTC_DRV_M41T80_WDT is not set
-# CONFIG_RTC_DRV_S35390A is not set
+CONFIG_RTC_DRV_S35390A=y
 
 #
 # SPI RTC drivers
index 45329fca1b64e32f18ba9dc711ea8bc89f5d5576..7b95d205839588a4afa6ba9e1783fede3cb27b7a 100644 (file)
@@ -3,11 +3,48 @@
 
 #ifdef __KERNEL__
 
-#include <linux/mm.h> /* need struct page */
-
+#include <linux/mm_types.h>
 #include <linux/scatterlist.h>
 
 #include <asm-generic/dma-coherent.h>
+#include <asm/memory.h>
+
+/*
+ * page_to_dma/dma_to_virt/virt_to_dma are architecture private functions
+ * used internally by the DMA-mapping API to provide DMA addresses. They
+ * must not be used by drivers.
+ */
+#ifndef __arch_page_to_dma
+static inline dma_addr_t page_to_dma(struct device *dev, struct page *page)
+{
+       return (dma_addr_t)__virt_to_bus((unsigned long)page_address(page));
+}
+
+static inline void *dma_to_virt(struct device *dev, dma_addr_t addr)
+{
+       return (void *)__bus_to_virt(addr);
+}
+
+static inline dma_addr_t virt_to_dma(struct device *dev, void *addr)
+{
+       return (dma_addr_t)__virt_to_bus((unsigned long)(addr));
+}
+#else
+static inline dma_addr_t page_to_dma(struct device *dev, struct page *page)
+{
+       return __arch_page_to_dma(dev, page);
+}
+
+static inline void *dma_to_virt(struct device *dev, dma_addr_t addr)
+{
+       return __arch_dma_to_virt(dev, addr);
+}
+
+static inline dma_addr_t virt_to_dma(struct device *dev, void *addr)
+{
+       return __arch_virt_to_dma(dev, addr);
+}
+#endif
 
 /*
  * DMA-consistent mapping functions.  These allocate/free a region of
@@ -169,7 +206,7 @@ dma_map_single(struct device *dev, void *cpu_addr, size_t size,
        if (!arch_is_coherent())
                dma_cache_maint(cpu_addr, size, dir);
 
-       return virt_to_dma(dev, (unsigned long)cpu_addr);
+       return virt_to_dma(dev, cpu_addr);
 }
 #else
 extern dma_addr_t dma_map_single(struct device *,void *, size_t, enum dma_data_direction);
@@ -195,7 +232,7 @@ dma_map_page(struct device *dev, struct page *page,
             unsigned long offset, size_t size,
             enum dma_data_direction dir)
 {
-       return dma_map_single(dev, page_address(page) + offset, size, (int)dir);
+       return dma_map_single(dev, page_address(page) + offset, size, dir);
 }
 
 /**
@@ -241,7 +278,7 @@ static inline void
 dma_unmap_page(struct device *dev, dma_addr_t handle, size_t size,
               enum dma_data_direction dir)
 {
-       dma_unmap_single(dev, handle, size, (int)dir);
+       dma_unmap_single(dev, handle, size, dir);
 }
 
 /**
@@ -314,11 +351,12 @@ extern void dma_unmap_sg(struct device *, struct scatterlist *, int, enum dma_da
 
 
 /**
- * dma_sync_single_for_cpu
+ * dma_sync_single_range_for_cpu
  * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
  * @handle: DMA address of buffer
- * @size: size of buffer to map
- * @dir: DMA transfer direction
+ * @offset: offset of region to start sync
+ * @size: size of region to sync
+ * @dir: DMA transfer direction (same as passed to dma_map_single)
  *
  * Make physical memory consistent for a single streaming mode DMA
  * translation after a transfer.
@@ -332,25 +370,41 @@ extern void dma_unmap_sg(struct device *, struct scatterlist *, int, enum dma_da
  */
 #ifndef CONFIG_DMABOUNCE
 static inline void
-dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, size_t size,
-                       enum dma_data_direction dir)
+dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t handle,
+                             unsigned long offset, size_t size,
+                             enum dma_data_direction dir)
 {
        if (!arch_is_coherent())
-               dma_cache_maint((void *)dma_to_virt(dev, handle), size, dir);
+               dma_cache_maint(dma_to_virt(dev, handle) + offset, size, dir);
 }
 
 static inline void
-dma_sync_single_for_device(struct device *dev, dma_addr_t handle, size_t size,
-                          enum dma_data_direction dir)
+dma_sync_single_range_for_device(struct device *dev, dma_addr_t handle,
+                                unsigned long offset, size_t size,
+                                enum dma_data_direction dir)
 {
        if (!arch_is_coherent())
-               dma_cache_maint((void *)dma_to_virt(dev, handle), size, dir);
+               dma_cache_maint(dma_to_virt(dev, handle) + offset, size, dir);
 }
 #else
-extern void dma_sync_single_for_cpu(struct device*, dma_addr_t, size_t, enum dma_data_direction);
-extern void dma_sync_single_for_device(struct device*, dma_addr_t, size_t, enum dma_data_direction);
+extern void dma_sync_single_range_for_cpu(struct device *, dma_addr_t, unsigned long, size_t, enum dma_data_direction);
+extern void dma_sync_single_range_for_device(struct device *, dma_addr_t, unsigned long, size_t, enum dma_data_direction);
 #endif
 
+static inline void
+dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, size_t size,
+                       enum dma_data_direction dir)
+{
+       dma_sync_single_range_for_cpu(dev, handle, 0, size, dir);
+}
+
+static inline void
+dma_sync_single_for_device(struct device *dev, dma_addr_t handle, size_t size,
+                          enum dma_data_direction dir)
+{
+       dma_sync_single_range_for_device(dev, handle, 0, size, dir);
+}
+
 
 /**
  * dma_sync_sg_for_cpu
index c8986bb99ed5515f6d2191480cdd61576e76690c..df15a0dc228e23da027667d3a992658daadf2305 100644 (file)
@@ -10,7 +10,7 @@
 /* Maximum address we can use for the control code buffer */
 #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL)
 
-#define KEXEC_CONTROL_CODE_SIZE        4096
+#define KEXEC_CONTROL_PAGE_SIZE        4096
 
 #define KEXEC_ARCH KEXEC_ARCH_ARM
 
index 1e070a2b561aa3390a02abf4ce0263b06a9055f0..bf7c737c92267c7de8b38c0b6347816a0bdb3328 100644 (file)
 #define arch_adjust_zones(node,size,holes) do { } while (0)
 #endif
 
+/*
+ * Amount of memory reserved for the vmalloc() area, and minimum
+ * address for vmalloc mappings.
+ */
+extern unsigned long vmalloc_reserve;
+
+#define VMALLOC_MIN            (void *)(VMALLOC_END - vmalloc_reserve)
+
 /*
  * PFNs are used to describe any physical page; this means
  * PFN 0 == physical address 0.
@@ -305,20 +313,6 @@ static inline __deprecated void *bus_to_virt(unsigned long x)
  */
 #define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
 
-/*
- * Optional device DMA address remapping. Do _not_ use directly!
- * We should really eliminate virt_to_bus() here - it's deprecated.
- */
-#ifndef __arch_page_to_dma
-#define page_to_dma(dev, page)         ((dma_addr_t)__virt_to_bus((unsigned long)page_address(page)))
-#define dma_to_virt(dev, addr)         ((void *)__bus_to_virt(addr))
-#define virt_to_dma(dev, addr)         ((dma_addr_t)__virt_to_bus((unsigned long)(addr)))
-#else
-#define page_to_dma(dev, page)         (__arch_page_to_dma(dev, page))
-#define dma_to_virt(dev, addr)         (__arch_dma_to_virt(dev, addr))
-#define virt_to_dma(dev, addr)         (__arch_virt_to_dma(dev, addr))
-#endif
-
 /*
  * Optional coherency support.  Currently used only by selected
  * Intel XSC3-based systems.
index 4225372a26f30e594bebfb98c307a06f28ff83a4..d8fbe2d9b8b9b3621bbe910b56ccde369123f73f 100644 (file)
@@ -10,8 +10,6 @@
  * 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.
- *
- * $Id: xip.h,v 1.2 2004/12/01 15:49:10 nico Exp $
  */
 
 #ifndef __ARM_MTD_XIP_H__
index b01d5e7e3d5abb4a5632c1b677764310c81db243..517a4d6ffc74b791691a3a2f65099bb6352e5e64 100644 (file)
@@ -112,9 +112,9 @@ extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
 static inline void prefetch(const void *ptr)
 {
        __asm__ __volatile__(
-               "pld\t%0"
+               "pld\t%a0"
                :
-               : "o" (*(char *)ptr)
+               : "p" (ptr)
                : "cc");
 }
 
index 0d0d40f1b599eccff4c709f1bbd2a412f08812bc..b543a054a17ee0b061577ad15fc13e43f6851ff8 100644 (file)
@@ -54,6 +54,7 @@
  *       v4wbi - ARMv4 with write buffer with I TLB flush entry instruction
  *       fr    - Feroceon (v4wbi with non-outer-cacheable page table walks)
  *       v6wbi - ARMv6 with write buffer with I TLB flush entry instruction
+ *       v7wbi - identical to v6wbi
  */
 #undef _TLB
 #undef MULTI_TLB
@@ -266,14 +267,16 @@ extern struct cpu_tlb_fns cpu_tlb;
                                 v4wbi_possible_flags | \
                                 fr_possible_flags | \
                                 v4wb_possible_flags | \
-                                v6wbi_possible_flags)
+                                v6wbi_possible_flags | \
+                                v7wbi_possible_flags)
 
 #define always_tlb_flags       (v3_always_flags & \
                                 v4_always_flags & \
                                 v4wbi_always_flags & \
                                 fr_always_flags & \
                                 v4wb_always_flags & \
-                                v6wbi_always_flags)
+                                v6wbi_always_flags & \
+                                v7wbi_always_flags)
 
 #define tlb_flag(f)    ((always_tlb_flags & (f)) || (__tlb_flag & possible_tlb_flags & (f)))
 
index f95fbb2fcb5ffc2a59e1b032b89f50534be8971a..010618487cf166b6fb933fc480d1a151b734a7a9 100644 (file)
 #define __NR_fallocate                 (__NR_SYSCALL_BASE+352)
 #define __NR_timerfd_settime           (__NR_SYSCALL_BASE+353)
 #define __NR_timerfd_gettime           (__NR_SYSCALL_BASE+354)
+#define __NR_signalfd4                 (__NR_SYSCALL_BASE+355)
+#define __NR_eventfd2                  (__NR_SYSCALL_BASE+356)
+#define __NR_epoll_create1             (__NR_SYSCALL_BASE+357)
+#define __NR_dup3                      (__NR_SYSCALL_BASE+358)
+#define __NR_pipe2                     (__NR_SYSCALL_BASE+359)
+#define __NR_inotify_init1             (__NR_SYSCALL_BASE+360)
 
 /*
  * The following SWIs are ARM private.
diff --git a/arch/arm/kernel/.gitignore b/arch/arm/kernel/.gitignore
new file mode 100644 (file)
index 0000000..c5f676c
--- /dev/null
@@ -0,0 +1 @@
+vmlinux.lds
index 30a67a5a40a81e472c2049e91765a3190b1eb2a4..09a061cb7838c311109b3712c9539c77f9f1c39f 100644 (file)
 /* 250 */      CALL(sys_epoll_create)
                CALL(ABI(sys_epoll_ctl, sys_oabi_epoll_ctl))
                CALL(ABI(sys_epoll_wait, sys_oabi_epoll_wait))
-               CALL(sys_remap_file_pages)
+               CALL(sys_remap_file_pages)
                CALL(sys_ni_syscall)    /* sys_set_thread_area */
 /* 255 */      CALL(sys_ni_syscall)    /* sys_get_thread_area */
-               CALL(sys_set_tid_address)
+               CALL(sys_set_tid_address)
                CALL(sys_timer_create)
                CALL(sys_timer_settime)
                CALL(sys_timer_gettime)
                CALL(sys_fallocate)
                CALL(sys_timerfd_settime)
                CALL(sys_timerfd_gettime)
+/* 355 */      CALL(sys_signalfd4)
+               CALL(sys_eventfd2)
+               CALL(sys_epoll_create1)
+               CALL(sys_dup3)
+               CALL(sys_pipe2)
+/* 360 */      CALL(sys_inotify_init1)
 #ifndef syscalls_counted
 .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
 #define syscalls_counted
index db8f54a3451f4f4fd0a8d8bf6dee963374d81db1..fae5beb3c3d607086c4cffa48b34e825bc9a5664 100644 (file)
@@ -71,7 +71,7 @@ void machine_kexec(struct kimage *image)
 
 
        flush_icache_range((unsigned long) reboot_code_buffer,
-                          (unsigned long) reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE);
+                          (unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE);
        printk(KERN_INFO "Bye!\n");
 
        cpu_proc_fin();
index 38f0e7940a132b1c9e0458bc10e9d1dc3f2401ee..2ca7038b67a7bf105df3529491e0f9858220ca76 100644 (file)
@@ -81,6 +81,8 @@ EXPORT_SYMBOL(system_serial_high);
 unsigned int elf_hwcap;
 EXPORT_SYMBOL(elf_hwcap);
 
+unsigned long __initdata vmalloc_reserve = 128 << 20;
+
 
 #ifdef MULTI_CPU
 struct processor processor;
@@ -500,6 +502,17 @@ static void __init early_mem(char **p)
 }
 __early_param("mem=", early_mem);
 
+/*
+ * vmalloc=size forces the vmalloc area to be exactly 'size'
+ * bytes. This can be used to increase (or decrease) the vmalloc
+ * area - the default is 128m.
+ */
+static void __init early_vmalloc(char **arg)
+{
+       vmalloc_reserve = memparse(*arg, arg);
+}
+__early_param("vmalloc=", early_vmalloc);
+
 /*
  * Initial parsing of the command line.
  */
index 7277aef8309836fb74b6e2368beabf050757af9d..872f1f8fbb57841c08a5f4755599c8e761081d64 100644 (file)
@@ -288,14 +288,28 @@ void unregister_undef_hook(struct undef_hook *hook)
        spin_unlock_irqrestore(&undef_lock, flags);
 }
 
+static int call_undef_hook(struct pt_regs *regs, unsigned int instr)
+{
+       struct undef_hook *hook;
+       unsigned long flags;
+       int (*fn)(struct pt_regs *regs, unsigned int instr) = NULL;
+
+       spin_lock_irqsave(&undef_lock, flags);
+       list_for_each_entry(hook, &undef_hook, node)
+               if ((instr & hook->instr_mask) == hook->instr_val &&
+                   (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val)
+                       fn = hook->fn;
+       spin_unlock_irqrestore(&undef_lock, flags);
+
+       return fn ? fn(regs, instr) : 1;
+}
+
 asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
 {
        unsigned int correction = thumb_mode(regs) ? 2 : 4;
        unsigned int instr;
-       struct undef_hook *hook;
        siginfo_t info;
        void __user *pc;
-       unsigned long flags;
 
        /*
         * According to the ARM ARM, PC is 2 or 4 bytes ahead,
@@ -325,17 +339,8 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
        }
 #endif
 
-       spin_lock_irqsave(&undef_lock, flags);
-       list_for_each_entry(hook, &undef_hook, node) {
-               if ((instr & hook->instr_mask) == hook->instr_val &&
-                   (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) {
-                       if (hook->fn(regs, instr) == 0) {
-                               spin_unlock_irqrestore(&undef_lock, flags);
-                               return;
-                       }
-               }
-       }
-       spin_unlock_irqrestore(&undef_lock, flags);
+       if (call_undef_hook(regs, instr) == 0)
+               return;
 
 #ifdef CONFIG_DEBUG_USER
        if (user_debug & UDBG_UNDEFINED) {
index 35eb232a649a2b11aae684fdc169e3cf69fcefd2..ae3e1c8c75832419fd070d6f53a3c16db5a6c5c7 100644 (file)
@@ -18,6 +18,9 @@ static int irqmap_cats[] __initdata = { IRQ_PCI, IRQ_IN0, IRQ_IN1, IRQ_IN3 };
 
 static int __init cats_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
 {
+       if (dev->irq >= 255)
+               return -1;      /* not a valid interrupt. */
+
        if (dev->irq >= 128)
                return dev->irq & 0x1f;
 
index ce5ea7c266751d35096b51a283d36de58f7cc69f..7c49d55e6b27d61d8d76e1682e96c00799f3cc5d 100644 (file)
@@ -3,8 +3,6 @@
  *
  *  Copyright (C) 2001-2002 Deep Blue Solutions Ltd.
  *
- *  $Id: cpu.c,v 1.6 2002/07/18 13:58:51 rmk Exp $
- *
  * 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.
index 83c4c1ceb411dc2615003c3f0304a9b9b8e9e04d..028b87839c0f64b3ef421ee488b9e4c149d75899 100644 (file)
@@ -26,8 +26,6 @@
  *     NOTE: This is a multi-hosted header file for use with uHAL and
  *           supported debuggers.
  *
- *     $Id: platform.s,v 1.32 2000/02/18 10:51:39 asims Exp $
- *
  * ***********************************************************************/
 
 #ifndef __address_h
index 0e509b8ad56edadabf9b77a66dbcdd85fe481a60..189f16f3619d19692bcbe75c876045dc4bd36042 100644 (file)
 #include <linux/mbus.h>
 #include <linux/mv643xx_eth.h>
 #include <linux/ata_platform.h>
+#include <linux/spi/orion_spi.h>
 #include <asm/page.h>
 #include <asm/timex.h>
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
 #include <mach/kirkwood.h>
-#include <asm/plat-orion/cache-feroceon-l2.h>
-#include <asm/plat-orion/ehci-orion.h>
-#include <asm/plat-orion/orion_nand.h>
-#include <asm/plat-orion/time.h>
+#include <plat/cache-feroceon-l2.h>
+#include <plat/ehci-orion.h>
+#include <plat/mv_xor.h>
+#include <plat/orion_nand.h>
+#include <plat/time.h>
 #include "common.h"
 
 /*****************************************************************************
@@ -195,6 +197,37 @@ void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data)
 }
 
 
+/*****************************************************************************
+ * SPI
+ ****************************************************************************/
+static struct orion_spi_info kirkwood_spi_plat_data = {
+       .tclk           = KIRKWOOD_TCLK,
+};
+
+static struct resource kirkwood_spi_resources[] = {
+       {
+               .start  = SPI_PHYS_BASE,
+               .end    = SPI_PHYS_BASE + SZ_512 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device kirkwood_spi = {
+       .name           = "orion_spi",
+       .id             = 0,
+       .resource       = kirkwood_spi_resources,
+       .dev            = {
+               .platform_data  = &kirkwood_spi_plat_data,
+       },
+       .num_resources  = ARRAY_SIZE(kirkwood_spi_resources),
+};
+
+void __init kirkwood_spi_init()
+{
+       platform_device_register(&kirkwood_spi);
+}
+
+
 /*****************************************************************************
  * UART0
  ****************************************************************************/
@@ -283,6 +316,212 @@ void __init kirkwood_uart1_init(void)
 }
 
 
+/*****************************************************************************
+ * XOR
+ ****************************************************************************/
+static struct mv_xor_platform_shared_data kirkwood_xor_shared_data = {
+       .dram           = &kirkwood_mbus_dram_info,
+};
+
+static u64 kirkwood_xor_dmamask = DMA_32BIT_MASK;
+
+
+/*****************************************************************************
+ * XOR0
+ ****************************************************************************/
+static struct resource kirkwood_xor0_shared_resources[] = {
+       {
+               .name   = "xor 0 low",
+               .start  = XOR0_PHYS_BASE,
+               .end    = XOR0_PHYS_BASE + 0xff,
+               .flags  = IORESOURCE_MEM,
+       }, {
+               .name   = "xor 0 high",
+               .start  = XOR0_HIGH_PHYS_BASE,
+               .end    = XOR0_HIGH_PHYS_BASE + 0xff,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device kirkwood_xor0_shared = {
+       .name           = MV_XOR_SHARED_NAME,
+       .id             = 0,
+       .dev            = {
+               .platform_data = &kirkwood_xor_shared_data,
+       },
+       .num_resources  = ARRAY_SIZE(kirkwood_xor0_shared_resources),
+       .resource       = kirkwood_xor0_shared_resources,
+};
+
+static struct resource kirkwood_xor00_resources[] = {
+       [0] = {
+               .start  = IRQ_KIRKWOOD_XOR_00,
+               .end    = IRQ_KIRKWOOD_XOR_00,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct mv_xor_platform_data kirkwood_xor00_data = {
+       .shared         = &kirkwood_xor0_shared,
+       .hw_id          = 0,
+       .pool_size      = PAGE_SIZE,
+};
+
+static struct platform_device kirkwood_xor00_channel = {
+       .name           = MV_XOR_NAME,
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(kirkwood_xor00_resources),
+       .resource       = kirkwood_xor00_resources,
+       .dev            = {
+               .dma_mask               = &kirkwood_xor_dmamask,
+               .coherent_dma_mask      = DMA_64BIT_MASK,
+               .platform_data          = (void *)&kirkwood_xor00_data,
+       },
+};
+
+static struct resource kirkwood_xor01_resources[] = {
+       [0] = {
+               .start  = IRQ_KIRKWOOD_XOR_01,
+               .end    = IRQ_KIRKWOOD_XOR_01,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct mv_xor_platform_data kirkwood_xor01_data = {
+       .shared         = &kirkwood_xor0_shared,
+       .hw_id          = 1,
+       .pool_size      = PAGE_SIZE,
+};
+
+static struct platform_device kirkwood_xor01_channel = {
+       .name           = MV_XOR_NAME,
+       .id             = 1,
+       .num_resources  = ARRAY_SIZE(kirkwood_xor01_resources),
+       .resource       = kirkwood_xor01_resources,
+       .dev            = {
+               .dma_mask               = &kirkwood_xor_dmamask,
+               .coherent_dma_mask      = DMA_64BIT_MASK,
+               .platform_data          = (void *)&kirkwood_xor01_data,
+       },
+};
+
+void __init kirkwood_xor0_init(void)
+{
+       platform_device_register(&kirkwood_xor0_shared);
+
+       /*
+        * two engines can't do memset simultaneously, this limitation
+        * satisfied by removing memset support from one of the engines.
+        */
+       dma_cap_set(DMA_MEMCPY, kirkwood_xor00_data.cap_mask);
+       dma_cap_set(DMA_XOR, kirkwood_xor00_data.cap_mask);
+       platform_device_register(&kirkwood_xor00_channel);
+
+       dma_cap_set(DMA_MEMCPY, kirkwood_xor01_data.cap_mask);
+       dma_cap_set(DMA_MEMSET, kirkwood_xor01_data.cap_mask);
+       dma_cap_set(DMA_XOR, kirkwood_xor01_data.cap_mask);
+       platform_device_register(&kirkwood_xor01_channel);
+}
+
+
+/*****************************************************************************
+ * XOR1
+ ****************************************************************************/
+static struct resource kirkwood_xor1_shared_resources[] = {
+       {
+               .name   = "xor 1 low",
+               .start  = XOR1_PHYS_BASE,
+               .end    = XOR1_PHYS_BASE + 0xff,
+               .flags  = IORESOURCE_MEM,
+       }, {
+               .name   = "xor 1 high",
+               .start  = XOR1_HIGH_PHYS_BASE,
+               .end    = XOR1_HIGH_PHYS_BASE + 0xff,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device kirkwood_xor1_shared = {
+       .name           = MV_XOR_SHARED_NAME,
+       .id             = 1,
+       .dev            = {
+               .platform_data = &kirkwood_xor_shared_data,
+       },
+       .num_resources  = ARRAY_SIZE(kirkwood_xor1_shared_resources),
+       .resource       = kirkwood_xor1_shared_resources,
+};
+
+static struct resource kirkwood_xor10_resources[] = {
+       [0] = {
+               .start  = IRQ_KIRKWOOD_XOR_10,
+               .end    = IRQ_KIRKWOOD_XOR_10,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct mv_xor_platform_data kirkwood_xor10_data = {
+       .shared         = &kirkwood_xor1_shared,
+       .hw_id          = 0,
+       .pool_size      = PAGE_SIZE,
+};
+
+static struct platform_device kirkwood_xor10_channel = {
+       .name           = MV_XOR_NAME,
+       .id             = 2,
+       .num_resources  = ARRAY_SIZE(kirkwood_xor10_resources),
+       .resource       = kirkwood_xor10_resources,
+       .dev            = {
+               .dma_mask               = &kirkwood_xor_dmamask,
+               .coherent_dma_mask      = DMA_64BIT_MASK,
+               .platform_data          = (void *)&kirkwood_xor10_data,
+       },
+};
+
+static struct resource kirkwood_xor11_resources[] = {
+       [0] = {
+               .start  = IRQ_KIRKWOOD_XOR_11,
+               .end    = IRQ_KIRKWOOD_XOR_11,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct mv_xor_platform_data kirkwood_xor11_data = {
+       .shared         = &kirkwood_xor1_shared,
+       .hw_id          = 1,
+       .pool_size      = PAGE_SIZE,
+};
+
+static struct platform_device kirkwood_xor11_channel = {
+       .name           = MV_XOR_NAME,
+       .id             = 3,
+       .num_resources  = ARRAY_SIZE(kirkwood_xor11_resources),
+       .resource       = kirkwood_xor11_resources,
+       .dev            = {
+               .dma_mask               = &kirkwood_xor_dmamask,
+               .coherent_dma_mask      = DMA_64BIT_MASK,
+               .platform_data          = (void *)&kirkwood_xor11_data,
+       },
+};
+
+void __init kirkwood_xor1_init(void)
+{
+       platform_device_register(&kirkwood_xor1_shared);
+
+       /*
+        * two engines can't do memset simultaneously, this limitation
+        * satisfied by removing memset support from one of the engines.
+        */
+       dma_cap_set(DMA_MEMCPY, kirkwood_xor10_data.cap_mask);
+       dma_cap_set(DMA_XOR, kirkwood_xor10_data.cap_mask);
+       platform_device_register(&kirkwood_xor10_channel);
+
+       dma_cap_set(DMA_MEMCPY, kirkwood_xor11_data.cap_mask);
+       dma_cap_set(DMA_MEMSET, kirkwood_xor11_data.cap_mask);
+       dma_cap_set(DMA_XOR, kirkwood_xor11_data.cap_mask);
+       platform_device_register(&kirkwood_xor11_channel);
+}
+
+
 /*****************************************************************************
  * Time handling
  ****************************************************************************/
index 5dee2f6b40a5945eb1bd56f0c5ec29a5a0096e8c..69cd113af03adcd3c5edc8a7c37fa60395a11234 100644 (file)
@@ -33,8 +33,11 @@ void kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data);
 void kirkwood_pcie_init(void);
 void kirkwood_rtc_init(void);
 void kirkwood_sata_init(struct mv_sata_platform_data *sata_data);
+void kirkwood_spi_init(void);
 void kirkwood_uart0_init(void);
 void kirkwood_uart1_init(void);
+void kirkwood_xor0_init(void);
+void kirkwood_xor1_init(void);
 
 extern struct sys_timer kirkwood_timer;
 
index d1336b41f0fb3056dbbbeca60729b7df75747d00..5c69992295e88acd485487cb3b7c030de83054a1 100644 (file)
 
 #define USB_PHYS_BASE          (KIRKWOOD_REGS_PHYS_BASE | 0x50000)
 
+#define XOR0_PHYS_BASE         (KIRKWOOD_REGS_PHYS_BASE | 0x60800)
+#define XOR0_VIRT_BASE         (KIRKWOOD_REGS_VIRT_BASE | 0x60800)
+#define XOR1_PHYS_BASE         (KIRKWOOD_REGS_PHYS_BASE | 0x60900)
+#define XOR1_VIRT_BASE         (KIRKWOOD_REGS_VIRT_BASE | 0x60900)
+#define XOR0_HIGH_PHYS_BASE    (KIRKWOOD_REGS_PHYS_BASE | 0x60A00)
+#define XOR0_HIGH_VIRT_BASE    (KIRKWOOD_REGS_VIRT_BASE | 0x60A00)
+#define XOR1_HIGH_PHYS_BASE    (KIRKWOOD_REGS_PHYS_BASE | 0x60B00)
+#define XOR1_HIGH_VIRT_BASE    (KIRKWOOD_REGS_VIRT_BASE | 0x60B00)
+
 #define GE00_PHYS_BASE         (KIRKWOOD_REGS_PHYS_BASE | 0x70000)
 #define GE01_PHYS_BASE         (KIRKWOOD_REGS_PHYS_BASE | 0x74000)
 
index 302bb2cf6669dac806459ba0be23c916aa96473d..5790643ffe079d5781e435fe5d36531aaa221949 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/io.h>
-#include <asm/plat-orion/irq.h>
+#include <plat/irq.h>
 #include "common.h"
 
 void __init kirkwood_init_irq(void)
index 8282d0ff84bffacac6c7ebc00280c9ebe98549ba..2195fa31f6b713cf96cb1160c88b41f2350d19d3 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/pci.h>
 #include <linux/mbus.h>
 #include <asm/mach/pci.h>
-#include <asm/plat-orion/pcie.h>
+#include <plat/pcie.h>
 #include "common.h"
 
 
index 182230a5d198a77b7686909ea443cffb4f6e2ae2..a3012d4459714c7932d533bd73a805523465ac36 100644 (file)
@@ -18,6 +18,9 @@
 #include <linux/timer.h>
 #include <linux/ata_platform.h>
 #include <linux/mv643xx_eth.h>
+#include <linux/spi/flash.h>
+#include <linux/spi/spi.h>
+#include <linux/spi/orion_spi.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/pci.h>
@@ -34,6 +37,21 @@ static struct mv_sata_platform_data rd88f6192_sata_data = {
        .n_ports        = 2,
 };
 
+static const struct flash_platform_data rd88F6192_spi_slave_data = {
+       .type           = "m25p128",
+};
+
+static struct spi_board_info __initdata rd88F6192_spi_slave_info[] = {
+       {
+               .modalias       = "m25p80",
+               .platform_data  = &rd88F6192_spi_slave_data,
+               .irq            = -1,
+               .max_speed_hz   = 20000000,
+               .bus_num        = 0,
+               .chip_select    = 0,
+       },
+};
+
 static void __init rd88f6192_init(void)
 {
        /*
@@ -45,7 +63,12 @@ static void __init rd88f6192_init(void)
        kirkwood_ge00_init(&rd88f6192_ge00_data);
        kirkwood_rtc_init();
        kirkwood_sata_init(&rd88f6192_sata_data);
+       spi_register_board_info(rd88F6192_spi_slave_info,
+                               ARRAY_SIZE(rd88F6192_spi_slave_info));
+       kirkwood_spi_init();
        kirkwood_uart0_init();
+       kirkwood_xor0_init();
+       kirkwood_xor1_init();
 }
 
 static int __init rd88f6192_pci_init(void)
index d8a43018c7d3b519313df9f09364fe09794821ea..d96487a0f18bfabe9fbca93a5ba24962e64262a3 100644 (file)
@@ -23,7 +23,7 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/pci.h>
 #include <mach/kirkwood.h>
-#include <asm/plat-orion/orion_nand.h>
+#include <plat/orion_nand.h>
 #include "common.h"
 
 static struct mtd_partition rd88f6281_nand_parts[] = {
index 132b1c4d5ce6faecdd91d6b5f0466edc1efa3aab..509916182e34d7c5ecd11e827de2f6ed2ea1ce1d 100644 (file)
@@ -1,5 +1,4 @@
 /* ssp.h
-     $Id$
 
    written by Marc Singer
    6 Dec 2004
index df6e38ed425b3d63c0a0f491083405403a818cf4..a7f5027b2f789f207a6128f35d0e51120649a76e 100644 (file)
@@ -1,5 +1,4 @@
 /* lcd-panel.h
-     $Id$
 
    written by Marc Singer
    18 Jul 2005
index e20cdbca1ebe95bc5dcb62b2e109e6864c0f2d89..c0d2d9d12e743bccb39644c713a0e6661c538078 100644 (file)
@@ -19,8 +19,8 @@
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
 #include <mach/loki.h>
-#include <asm/plat-orion/orion_nand.h>
-#include <asm/plat-orion/time.h>
+#include <plat/orion_nand.h>
+#include <plat/time.h>
 #include "common.h"
 
 /*****************************************************************************
index d839af91fe033670ea6ad48331f6a8a1aac2a428..5a487930cb2f92427946ea09f8f3a9bba0e1b4a3 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <asm/io.h>
-#include <asm/plat-orion/irq.h>
+#include <plat/irq.h>
 #include "common.h"
 
 void __init loki_init_irq(void)
index e633f9cb239f775c4a4d26b21a247d88274733c6..953a26c469cb0b9cf0602ec038e75d81129b7405 100644 (file)
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
 #include <mach/mv78xx0.h>
-#include <asm/plat-orion/cache-feroceon-l2.h>
-#include <asm/plat-orion/ehci-orion.h>
-#include <asm/plat-orion/orion_nand.h>
-#include <asm/plat-orion/time.h>
+#include <plat/cache-feroceon-l2.h>
+#include <plat/ehci-orion.h>
+#include <plat/orion_nand.h>
+#include <plat/time.h>
 #include "common.h"
 
 
index 3198abf54c9041b8857bfe7ab1073e614a44990f..28248d37b999b944e3ef307d0c07200cb64a61a2 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <mach/mv78xx0.h>
-#include <asm/plat-orion/irq.h>
+#include <plat/irq.h>
 #include "common.h"
 
 void __init mv78xx0_init_irq(void)
index b78e1443159f3e730697ada17f92e0ed90a42071..430ea84d587dfd2c2d87fbc079c10a6a43d98136 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/pci.h>
 #include <linux/mbus.h>
 #include <asm/mach/pci.h>
-#include <asm/plat-orion/pcie.h>
+#include <plat/pcie.h>
 #include "common.h"
 
 struct pcie_port {
index 168eeacaa4c0fdc3b92aa85e0d7e926ddcbd96dd..7b11e552bc5a89f3eb6ec4d85338157102afefb3 100644 (file)
 #include <asm/mach/time.h>
 #include <mach/hardware.h>
 #include <mach/orion5x.h>
-#include <asm/plat-orion/ehci-orion.h>
-#include <asm/plat-orion/orion_nand.h>
-#include <asm/plat-orion/time.h>
+#include <plat/ehci-orion.h>
+#include <plat/mv_xor.h>
+#include <plat/orion_nand.h>
+#include <plat/time.h>
 #include "common.h"
 
 /*****************************************************************************
@@ -354,6 +355,103 @@ void __init orion5x_uart1_init(void)
 }
 
 
+/*****************************************************************************
+ * XOR engine
+ ****************************************************************************/
+static struct resource orion5x_xor_shared_resources[] = {
+       {
+               .name   = "xor low",
+               .start  = ORION5X_XOR_PHYS_BASE,
+               .end    = ORION5X_XOR_PHYS_BASE + 0xff,
+               .flags  = IORESOURCE_MEM,
+       }, {
+               .name   = "xor high",
+               .start  = ORION5X_XOR_PHYS_BASE + 0x200,
+               .end    = ORION5X_XOR_PHYS_BASE + 0x2ff,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device orion5x_xor_shared = {
+       .name           = MV_XOR_SHARED_NAME,
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(orion5x_xor_shared_resources),
+       .resource       = orion5x_xor_shared_resources,
+};
+
+static u64 orion5x_xor_dmamask = DMA_32BIT_MASK;
+
+static struct resource orion5x_xor0_resources[] = {
+       [0] = {
+               .start  = IRQ_ORION5X_XOR0,
+               .end    = IRQ_ORION5X_XOR0,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct mv_xor_platform_data orion5x_xor0_data = {
+       .shared         = &orion5x_xor_shared,
+       .hw_id          = 0,
+       .pool_size      = PAGE_SIZE,
+};
+
+static struct platform_device orion5x_xor0_channel = {
+       .name           = MV_XOR_NAME,
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(orion5x_xor0_resources),
+       .resource       = orion5x_xor0_resources,
+       .dev            = {
+               .dma_mask               = &orion5x_xor_dmamask,
+               .coherent_dma_mask      = DMA_64BIT_MASK,
+               .platform_data          = (void *)&orion5x_xor0_data,
+       },
+};
+
+static struct resource orion5x_xor1_resources[] = {
+       [0] = {
+               .start  = IRQ_ORION5X_XOR1,
+               .end    = IRQ_ORION5X_XOR1,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct mv_xor_platform_data orion5x_xor1_data = {
+       .shared         = &orion5x_xor_shared,
+       .hw_id          = 1,
+       .pool_size      = PAGE_SIZE,
+};
+
+static struct platform_device orion5x_xor1_channel = {
+       .name           = MV_XOR_NAME,
+       .id             = 1,
+       .num_resources  = ARRAY_SIZE(orion5x_xor1_resources),
+       .resource       = orion5x_xor1_resources,
+       .dev            = {
+               .dma_mask               = &orion5x_xor_dmamask,
+               .coherent_dma_mask      = DMA_64BIT_MASK,
+               .platform_data          = (void *)&orion5x_xor1_data,
+       },
+};
+
+void __init orion5x_xor_init(void)
+{
+       platform_device_register(&orion5x_xor_shared);
+
+       /*
+        * two engines can't do memset simultaneously, this limitation
+        * satisfied by removing memset support from one of the engines.
+        */
+       dma_cap_set(DMA_MEMCPY, orion5x_xor0_data.cap_mask);
+       dma_cap_set(DMA_XOR, orion5x_xor0_data.cap_mask);
+       platform_device_register(&orion5x_xor0_channel);
+
+       dma_cap_set(DMA_MEMCPY, orion5x_xor1_data.cap_mask);
+       dma_cap_set(DMA_MEMSET, orion5x_xor1_data.cap_mask);
+       dma_cap_set(DMA_XOR, orion5x_xor1_data.cap_mask);
+       platform_device_register(&orion5x_xor1_channel);
+}
+
+
 /*****************************************************************************
  * Time handling
  ****************************************************************************/
@@ -382,6 +480,8 @@ static void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name)
                        *dev_name = "MV88F5281-D2";
                } else if (*rev == MV88F5281_REV_D1) {
                        *dev_name = "MV88F5281-D1";
+               } else if (*rev == MV88F5281_REV_D0) {
+                       *dev_name = "MV88F5281-D0";
                } else {
                        *dev_name = "MV88F5281-Rev-Unsupported";
                }
@@ -416,6 +516,15 @@ void __init orion5x_init(void)
         * Setup Orion address map
         */
        orion5x_setup_cpu_mbus_bridge();
+
+       /*
+        * Don't issue "Wait for Interrupt" instruction if we are
+        * running on D0 5281 silicon.
+        */
+       if (dev == MV88F5281_DEV_ID && rev == MV88F5281_REV_D0) {
+               printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n");
+               disable_hlt();
+       }
 }
 
 /*
index f72cf0e775448ae5b668acb3bcb6fd90d2d20cb5..e75bd7004b94c2011f01b9f132c6eef3940f28cc 100644 (file)
@@ -32,6 +32,7 @@ void orion5x_i2c_init(void);
 void orion5x_sata_init(struct mv_sata_platform_data *sata_data);
 void orion5x_uart0_init(void);
 void orion5x_uart1_init(void);
+void orion5x_xor_init(void);
 
 /*
  * PCIe/PCI functions.
index 48ce6d0e002082f15e4090afa954354d3c8bcdd3..ff13e9060b180a9f83c6b0ed2ab5cf4f9d43c205 100644 (file)
@@ -25,7 +25,7 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/pci.h>
 #include <mach/orion5x.h>
-#include <asm/plat-orion/orion_nand.h>
+#include <plat/orion_nand.h>
 #include "common.h"
 #include "mpp.h"
 
index f52a7d65bec2fbe1769883d051112387b4e70bff..61eb74a88862e051a3da61a2300de4e5c6341932 100644 (file)
@@ -73,6 +73,7 @@
 #define MV88F5182_REV_A2       2
 /* Orion-2 (88F5281) */
 #define MV88F5281_DEV_ID       0x5281
+#define MV88F5281_REV_D0       4
 #define MV88F5281_REV_D1       5
 #define MV88F5281_REV_D2       6
 
 #define ORION5X_USB0_VIRT_BASE         (ORION5X_REGS_VIRT_BASE | 0x50000)
 #define ORION5X_USB0_REG(x)            (ORION5X_USB0_VIRT_BASE | (x))
 
+#define ORION5X_XOR_PHYS_BASE          (ORION5X_REGS_PHYS_BASE | 0x60900)
+#define ORION5X_XOR_VIRT_BASE          (ORION5X_REGS_VIRT_BASE | 0x60900)
+#define ORION5X_XOR_REG(x)             (ORION5X_XOR_VIRT_BASE | (x))
+
 #define ORION5X_ETH_PHYS_BASE          (ORION5X_REGS_PHYS_BASE | 0x70000)
 #define ORION5X_ETH_VIRT_BASE          (ORION5X_REGS_VIRT_BASE | 0x70000)
 #define ORION5X_ETH_REG(x)             (ORION5X_ETH_VIRT_BASE | (x))
index cc2a017fd2a980b27a7131c59c9577cdc2765e87..2545ff9e5830fc3f888c30b8ca2e28ee5c343371 100644 (file)
@@ -16,7 +16,7 @@
 #include <asm/gpio.h>
 #include <asm/io.h>
 #include <mach/orion5x.h>
-#include <asm/plat-orion/irq.h>
+#include <plat/irq.h>
 #include "common.h"
 
 /*****************************************************************************
index 0caaaac74bc18fb975f8b29faf77e927ba76680a..cb72f1bb9cb772a2b18692b255ed2e467d4fc0a7 100644 (file)
@@ -25,7 +25,7 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/pci.h>
 #include <mach/orion5x.h>
-#include <asm/plat-orion/orion_nand.h>
+#include <plat/orion_nand.h>
 #include "common.h"
 #include "mpp.h"
 
@@ -356,6 +356,7 @@ static void __init kurobox_pro_init(void)
        orion5x_sata_init(&kurobox_pro_sata_data);
        orion5x_uart0_init();
        orion5x_uart1_init();
+       orion5x_xor_init();
 
        orion5x_setup_dev_boot_win(KUROBOX_PRO_NOR_BOOT_BASE,
                                   KUROBOX_PRO_NOR_BOOT_SIZE);
index 4403cc963d665be504d2eee536dccb979bfe8dfb..53ff1893b8835e111406affb4dea47d8b835c6d4 100644 (file)
@@ -239,6 +239,7 @@ static void __init mss2_init(void)
        orion5x_i2c_init();
        orion5x_sata_init(&mss2_sata_data);
        orion5x_uart0_init();
+       orion5x_xor_init();
 
        orion5x_setup_dev_boot_win(MSS2_NOR_BOOT_BASE, MSS2_NOR_BOOT_SIZE);
        platform_device_register(&mss2_nor_flash);
index 67b2c0df615fbe58c7f0621d990930e468af84ef..978d4d5993964f93baa09bf387c55881d52494cb 100644 (file)
@@ -203,6 +203,7 @@ static void __init mv2120_init(void)
        orion5x_i2c_init();
        orion5x_sata_init(&mv2120_sata_data);
        orion5x_uart0_init();
+       orion5x_xor_init();
 
        orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE);
        platform_device_register(&mv2120_nor_flash);
index 256a4f680935bc57e94db13905d0e742560ddaf7..fbceecc4b7ec1585cc8728b6a7089e4a08c3df76 100644 (file)
@@ -14,7 +14,7 @@
 #include <linux/pci.h>
 #include <linux/mbus.h>
 #include <asm/mach/pci.h>
-#include <asm/plat-orion/pcie.h>
+#include <plat/pcie.h>
 #include "common.h"
 
 /*****************************************************************************
index 8771cb76f0dca72c5b31681ebb82b36170bc8ec8..4c3bcd76ac85ba0ca55f1b40510ac0e93ef04f62 100644 (file)
@@ -292,6 +292,7 @@ static void __init rd88f5182_init(void)
        orion5x_i2c_init();
        orion5x_sata_init(&rd88f5182_sata_data);
        orion5x_uart0_init();
+       orion5x_xor_init();
 
        orion5x_setup_dev_boot_win(RD88F5182_NOR_BOOT_BASE,
                                   RD88F5182_NOR_BOOT_SIZE);
index 809132de31d213d2177e5e8de031a749f863e5fc..dd657163cd8d09e48ed791a9a0a472112ba235ba 100644 (file)
@@ -207,12 +207,12 @@ static struct i2c_board_info __initdata qnap_ts209_i2c_rtc = {
 
 static struct gpio_keys_button qnap_ts209_buttons[] = {
        {
-               .code           = KEY_RESTART,
+               .code           = KEY_COPY,
                .gpio           = QNAP_TS209_GPIO_KEY_MEDIA,
                .desc           = "USB Copy Button",
                .active_low     = 1,
        }, {
-               .code           = KEY_POWER,
+               .code           = KEY_RESTART,
                .gpio           = QNAP_TS209_GPIO_KEY_RESET,
                .desc           = "Reset Button",
                .active_low     = 1,
@@ -296,6 +296,7 @@ static void __init qnap_ts209_init(void)
        orion5x_i2c_init();
        orion5x_sata_init(&qnap_ts209_sata_data);
        orion5x_uart0_init();
+       orion5x_xor_init();
 
        orion5x_setup_dev_boot_win(QNAP_TS209_NOR_BOOT_BASE,
                                   QNAP_TS209_NOR_BOOT_SIZE);
index 6053e76ac9672784c0df15315d05ee2dc6faf2bd..b27d2b762081e3730ea1e8cc1ddaebcfab2ca269 100644 (file)
@@ -3,6 +3,9 @@
  *
  * Maintainer: Sylver Bruneau <sylver.bruneau@gmail.com>
  *
+ * Copyright (C) 2008  Sylver Bruneau <sylver.bruneau@gmail.com>
+ * Copyright (C) 2008  Martin Michlmayr <tbm@cyrius.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
@@ -16,6 +19,7 @@
 #include <linux/irq.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mv643xx_eth.h>
+#include <linux/leds.h>
 #include <linux/gpio_keys.h>
 #include <linux/input.h>
 #include <linux/i2c.h>
@@ -162,16 +166,59 @@ static struct i2c_board_info __initdata qnap_ts409_i2c_rtc = {
        I2C_BOARD_INFO("s35390a", 0x30),
 };
 
+/*****************************************************************************
+ * LEDs attached to GPIO
+ ****************************************************************************/
+
+static struct gpio_led ts409_led_pins[] = {
+       {
+               .name           = "ts409:red:sata1",
+               .gpio           = 4,
+               .active_low     = 1,
+       }, {
+               .name           = "ts409:red:sata2",
+               .gpio           = 5,
+               .active_low     = 1,
+       }, {
+               .name           = "ts409:red:sata3",
+               .gpio           = 6,
+               .active_low     = 1,
+       }, {
+               .name           = "ts409:red:sata4",
+               .gpio           = 7,
+               .active_low     = 1,
+       },
+};
+
+static struct gpio_led_platform_data ts409_led_data = {
+       .leds           = ts409_led_pins,
+       .num_leds       = ARRAY_SIZE(ts409_led_pins),
+};
+
+static struct platform_device ts409_leds = {
+       .name   = "leds-gpio",
+       .id     = -1,
+       .dev    = {
+               .platform_data  = &ts409_led_data,
+       },
+};
+
 /****************************************************************************
  * GPIO Attached Keys
  *     Power button is attached to the PIC microcontroller
  ****************************************************************************/
 
+#define QNAP_TS409_GPIO_KEY_RESET      14
 #define QNAP_TS409_GPIO_KEY_MEDIA      15
 
 static struct gpio_keys_button qnap_ts409_buttons[] = {
        {
                .code           = KEY_RESTART,
+               .gpio           = QNAP_TS409_GPIO_KEY_RESET,
+               .desc           = "Reset Button",
+               .active_low     = 1,
+       }, {
+               .code           = KEY_COPY,
                .gpio           = QNAP_TS409_GPIO_KEY_MEDIA,
                .desc           = "USB Copy Button",
                .active_low     = 1,
@@ -255,6 +302,7 @@ static void __init qnap_ts409_init(void)
        if (qnap_ts409_i2c_rtc.irq == 0)
                pr_warning("qnap_ts409_init: failed to get RTC IRQ\n");
        i2c_register_board_info(0, &qnap_ts409_i2c_rtc, 1);
+       platform_device_register(&ts409_leds);
 
        /* register tsx09 specific power-off method */
        pm_power_off = qnap_tsx09_power_off;
index 014916a28fdcc31b1db03f97d2f672b4b2e0ba76..ae0a5dccd2a1f465ae9ce4cd3a657d1ffe4a878f 100644 (file)
@@ -256,6 +256,7 @@ static void __init ts78xx_init(void)
        orion5x_sata_init(&ts78xx_sata_data);
        orion5x_uart0_init();
        orion5x_uart1_init();
+       orion5x_xor_init();
 
        orion5x_setup_dev_boot_win(TS78XX_NOR_BOOT_BASE,
                                   TS78XX_NOR_BOOT_SIZE);
index 351f32f13ce42f7f1586cf46919848c760307e27..4d452fcb15086317ea5f1639aee75ec4981624fa 100644 (file)
@@ -10,8 +10,6 @@
  * 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.
- *
- * $Id: xip.h,v 1.2 2004/12/01 15:49:10 nico Exp $
  */
 
 #ifndef __ARCH_PXA_MTD_XIP_H__
index 8956afe8195ec46a76d9acfd24fda3affe40f686..67debc47e8c6ec6ff7008aab53997b73444dbe37 100644 (file)
 #define POODLE_SCOOP_IO_DIR    ( POODLE_SCOOP_VPEN | POODLE_SCOOP_HS_OUT )
 #define POODLE_SCOOP_IO_OUT    ( 0 )
 
+#define POODLE_LOCOMO_GPIO_AMP_ON      LOCOMO_GPIO(8)
+#define POODLE_LOCOMO_GPIO_MUTE_L      LOCOMO_GPIO(10)
+#define POODLE_LOCOMO_GPIO_MUTE_R      LOCOMO_GPIO(11)
+#define POODLE_LOCOMO_GPIO_232VCC_ON   LOCOMO_GPIO(12)
+#define POODLE_LOCOMO_GPIO_JK_B        LOCOMO_GPIO(13)
+
 extern struct platform_device poodle_locomo_device;
 
 #endif /* __ASM_ARCH_POODLE_H  */
index 65447549616fc5ca3b3998967acbbf44ed917372..8e591118371e36adaf365b52db1104e92f60154c 100644 (file)
@@ -28,6 +28,7 @@
  * bits 10-17 : for AC Bias Pin Frequency
  * bit     18 : for output enable polarity
  * bit     19 : for pixel clock edge
+ * bit     20 : for output pixel format when base is RGBT16
  */
 #define LCD_CONN_TYPE(_x)      ((_x) & 0x0f)
 #define LCD_CONN_WIDTH(_x)     (((_x) >> 4) & 0x1f)
 #define LCD_SMART_PANEL_18BPP  ((18 << 4) | LCD_TYPE_SMART_PANEL)
 
 #define LCD_AC_BIAS_FREQ(x)    (((x) & 0xff) << 10)
-#define LCD_BIAS_ACTIVE_HIGH   (0 << 17)
-#define LCD_BIAS_ACTIVE_LOW    (1 << 17)
-#define LCD_PCLK_EDGE_RISE     (0 << 18)
-#define LCD_PCLK_EDGE_FALL     (1 << 18)
+#define LCD_BIAS_ACTIVE_HIGH   (0 << 18)
+#define LCD_BIAS_ACTIVE_LOW    (1 << 18)
+#define LCD_PCLK_EDGE_RISE     (0 << 19)
+#define LCD_PCLK_EDGE_FALL     (1 << 19)
+#define LCD_ALTERNATE_MAPPING  (1 << 20)
 
 /*
  * This structure describes the machine which we are running on.
index d583688458a4c8cceafe156399dbca4de4ab193d..b3f90aa7807689b390eb74a97944ffeabfcd0cba 100644 (file)
@@ -11,7 +11,7 @@
 */
 
 #ifndef __ASM_ARM_REGS_CLOCK
-#define __ASM_ARM_REGS_CLOCK "$Id: clock.h,v 1.4 2003/04/30 14:50:51 ben Exp $"
+#define __ASM_ARM_REGS_CLOCK
 
 #define S3C2410_CLKREG(x) ((x) + S3C24XX_VA_CLKPWR)
 
index 30bec027f5fa988a5eb1bd8d43c33d99a42d2123..528080ceac44ddf7edfd9b9aa267a1c9590156b6 100644 (file)
@@ -12,7 +12,7 @@
 
 
 #ifndef __ASM_ARCH_REGS_GPIO_H
-#define __ASM_ARCH_REGS_GPIO_H "$Id: gpio.h,v 1.5 2003/05/19 12:51:08 ben Exp $"
+#define __ASM_ARCH_REGS_GPIO_H
 
 #define S3C2410_GPIONO(bank,offset) ((bank) + (offset))
 
index b057c06d167a9c4f331201abd8d93f06ceba437d..de86ee8812bdc9a497ad1a6b79f03e12c46418c0 100644 (file)
@@ -10,7 +10,7 @@
 
 
 #ifndef ___ASM_ARCH_REGS_IRQ_H
-#define ___ASM_ARCH_REGS_IRQ_H "$Id: irq.h,v 1.3 2003/03/25 21:29:06 ben Exp $"
+#define ___ASM_ARCH_REGS_IRQ_H
 
 /* interrupt controller */
 
index 893b8742f954ca513b270ebcb24cb6f90661f25f..ee8f040aff5fa5e769872c5d457f68844bccb525 100644 (file)
@@ -10,7 +10,7 @@
 
 
 #ifndef ___ASM_ARCH_REGS_LCD_H
-#define ___ASM_ARCH_REGS_LCD_H "$Id: lcd.h,v 1.3 2003/06/26 13:25:06 ben Exp $"
+#define ___ASM_ARCH_REGS_LCD_H
 
 #define S3C2410_LCDREG(x)      (x)
 
index f9926abd5cde89dffe3ec746dea3a9a405ec837a..57759804e2fa193d040efc9532141632e937fc6b 100644 (file)
@@ -11,7 +11,7 @@
 */
 
 #ifndef __ASM_ARM_MEMREGS_H
-#define __ASM_ARM_MEMREGS_H "$Id: regs.h,v 1.8 2003/05/01 15:55:41 ben Exp $"
+#define __ASM_ARM_MEMREGS_H
 
 #ifndef S3C2410_MEMREG
 #define S3C2410_MEMREG(x) (S3C24XX_VA_MEMCTRL + (x))
index fb1e78e28e50b1d30a62037cb57e23fa2c03deb9..24c6334fac89f05118f2c7969a84921b0abb3c50 100644 (file)
@@ -562,7 +562,7 @@ static struct platform_device *bast_devices[] __initdata = {
        &bast_sio,
 };
 
-static struct clk *bast_clocks[] = {
+static struct clk *bast_clocks[] __initdata = {
        &s3c24xx_dclk0,
        &s3c24xx_dclk1,
        &s3c24xx_clkout0,
index c9040080727ec92d1bf123fc51a37146dcea31b4..b88939d72282bfb6ed53ea89d397de096ef94e8d 100644 (file)
@@ -5,7 +5,6 @@
  * Copyright (C) 2004 by FS Forth-Systeme GmbH
  * All rights reserved.
  *
- * $Id: mach-smdk2410.c,v 1.1 2004/05/11 14:15:38 mpietrek Exp $
  * @Author: Jonas Dietsche
  *
  * This program is free software; you can redistribute it and/or
index 12cbca68f57d94e71f64eb1acb7e1806e23213c7..fbc0213d5485eb8cc9ce32f328a9647d639f82ec 100644 (file)
@@ -344,7 +344,7 @@ static struct platform_device *vr1000_devices[] __initdata = {
        &vr1000_led3,
 };
 
-static struct clk *vr1000_clocks[] = {
+static struct clk *vr1000_clocks[] __initdata = {
        &s3c24xx_dclk0,
        &s3c24xx_dclk1,
        &s3c24xx_clkout0,
index 30f613a79bfedb7ead2c164c73a25f1a11c52599..4c061d29463c22151a24f1ed7939c1b1c3712aba 100644 (file)
@@ -26,9 +26,6 @@
 
 #include <linux/spi/spi.h>
 
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/partitions.h>
-
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <asm/mach/irq.h>
index 265c77dec9d7577ad8af5113ee898b40edc81a71..441f4bc094729a8a04d82cdf699a74007dec7163 100644 (file)
@@ -414,7 +414,7 @@ static struct platform_device *anubis_devices[] __initdata = {
        &anubis_device_sm501,
 };
 
-static struct clk *anubis_clocks[] = {
+static struct clk *anubis_clocks[] __initdata = {
        &s3c24xx_dclk0,
        &s3c24xx_dclk1,
        &s3c24xx_clkout0,
index d2ee0cd148c66f3a31c3cd02f9173118530a3bb6..8b83f93b6102ae7aa0cbe7b703a4096cd4ee3284 100644 (file)
@@ -341,7 +341,7 @@ static struct platform_device *osiris_devices[] __initdata = {
        &osiris_pcmcia,
 };
 
-static struct clk *osiris_clocks[] = {
+static struct clk *osiris_clocks[] __initdata = {
        &s3c24xx_dclk0,
        &s3c24xx_dclk1,
        &s3c24xx_clkout0,
index 39d38c8017369328652bcab4a985be4d9c9a5061..029dbfbbafcf6e6d2ead0e6aa9ddb4b26a9ed22e 100644 (file)
@@ -3,8 +3,6 @@
  *
  *  Copyright (C) 2001 Russell King
  *
- *  $Id: cpu-sa1110.c,v 1.9 2002/07/06 16:53:18 rmk Exp $
- *
  * 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.
index 80cfdac2b9449ff113a582b20d55d267441f9085..eaa09e86ad16befdc834ba870435fc7917736f49 100644 (file)
@@ -10,8 +10,6 @@
  * 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.
- *
- * $Id: xip.h,v 1.2 2004/12/01 15:49:10 nico Exp $
  */
 
 #ifndef __ARCH_SA1100_MTD_XIP_H__
index 20eec4ba173f49cd79e4e315d3a421addf145e8e..7b5a25d815760b9476503f421b11abaa3fc39db9 100644 (file)
@@ -14,7 +14,7 @@
 
 #include <linux/init.h>
 #include <asm/cacheflush.h>
-#include <asm/plat-orion/cache-feroceon-l2.h>
+#include <plat/cache-feroceon-l2.h>
 
 
 /*
index 2d6d682c206a814e5b7c41d7e8ce851f68721b18..25d9a11eb61750ade3ba77abd7771068ebe668ee 100644 (file)
@@ -568,6 +568,55 @@ void __init iotable_init(struct map_desc *io_desc, int nr)
                create_mapping(io_desc + i);
 }
 
+static int __init check_membank_valid(struct membank *mb)
+{
+       /*
+        * Check whether this memory region has non-zero size.
+        */
+       if (mb->size == 0)
+               return 0;
+
+       /*
+        * Check whether this memory region would entirely overlap
+        * the vmalloc area.
+        */
+       if (phys_to_virt(mb->start) >= VMALLOC_MIN) {
+               printk(KERN_NOTICE "Ignoring RAM at %.8lx-%.8lx "
+                       "(vmalloc region overlap).\n",
+                       mb->start, mb->start + mb->size - 1);
+               return 0;
+       }
+
+       /*
+        * Check whether this memory region would partially overlap
+        * the vmalloc area.
+        */
+       if (phys_to_virt(mb->start + mb->size) < phys_to_virt(mb->start) ||
+           phys_to_virt(mb->start + mb->size) > VMALLOC_MIN) {
+               unsigned long newsize = VMALLOC_MIN - phys_to_virt(mb->start);
+
+               printk(KERN_NOTICE "Truncating RAM at %.8lx-%.8lx "
+                       "to -%.8lx (vmalloc region overlap).\n",
+                       mb->start, mb->start + mb->size - 1,
+                       mb->start + newsize - 1);
+               mb->size = newsize;
+       }
+
+       return 1;
+}
+
+static void __init sanity_check_meminfo(struct meminfo *mi)
+{
+       int i;
+       int j;
+
+       for (i = 0, j = 0; i < mi->nr_banks; i++) {
+               if (check_membank_valid(&mi->bank[i]))
+                       mi->bank[j++] = mi->bank[i];
+       }
+       mi->nr_banks = j;
+}
+
 static inline void prepare_page_table(struct meminfo *mi)
 {
        unsigned long addr;
@@ -753,6 +802,7 @@ void __init paging_init(struct meminfo *mi, struct machine_desc *mdesc)
        void *zero_page;
 
        build_mem_type_table();
+       sanity_check_meminfo(mi);
        prepare_page_table(mi);
        bootmem_init(mi);
        devicemaps_init(mdesc);
index 1a3d63df8e908055b83a8a589bbe52231b5a944f..551244d5ca19eb1a20bfde7a5661606aff9cfbec 100644 (file)
@@ -15,6 +15,7 @@
 #include <asm/pgtable-hwdef.h>
 #include <asm/pgtable.h>
 #include <asm/ptrace.h>
+#include "proc-macros.S"
 
 /* ARM940T has a 4KB DCache comprising 256 lines of 4 words */
 #define CACHE_DLINESIZE        16
index 82d579ac9b98f9ed4cb2bad539c7c3e085aa936b..6168c6160deef1d5ed2506e7cabe385d4b90c406 100644 (file)
@@ -17,6 +17,7 @@
 #include <asm/pgtable-hwdef.h>
 #include <asm/pgtable.h>
 #include <asm/ptrace.h>
+#include "proc-macros.S"
 
 /*
  * ARM946E-S is synthesizable to have 0KB to 1MB sized D-Cache,
index 037486c5f4a432f9a4aaae887d02a1d483cc0ede..a325caf80d04b9a18928a7b6478a64ab4f5338e3 100644 (file)
                                        (dma_addr_t)virt_to_lbus(page_address(page)) : \
                                        (dma_addr_t)__virt_to_bus(page_address(page));})
 
-#define __arch_dma_to_virt(dev, addr)  ({is_lbus_device(dev) ? \
-                                       lbus_to_virt(addr) : \
-                                       __bus_to_virt(addr);})
-
-#define __arch_virt_to_dma(dev, addr)  ({is_lbus_device(dev) ? \
-                                       virt_to_lbus(addr) : \
-                                       __virt_to_bus(addr);})
+#define __arch_dma_to_virt(dev, addr)  ({ (void *) (is_lbus_device(dev) ? \
+                                               lbus_to_virt(addr) : \
+                                               __bus_to_virt(addr)); })
+
+#define __arch_virt_to_dma(dev, addr)  ({ unsigned long __addr = (unsigned long)(addr); \
+                                          (dma_addr_t) (is_lbus_device(dev) ? \
+                                               virt_to_lbus(__addr) : \
+                                               __virt_to_bus(__addr)); })
 
 #endif /* CONFIG_ARCH_OMAP15XX */
 
diff --git a/arch/arm/plat-orion/include/plat/cache-feroceon-l2.h b/arch/arm/plat-orion/include/plat/cache-feroceon-l2.h
new file mode 100644 (file)
index 0000000..06f982d
--- /dev/null
@@ -0,0 +1,11 @@
+/*
+ * arch/arm/plat-orion/include/plat/cache-feroceon-l2.h
+ *
+ * Copyright (C) 2008 Marvell Semiconductor
+ *
+ * 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.
+ */
+
+extern void __init feroceon_l2_init(int l2_wt_override);
diff --git a/arch/arm/plat-orion/include/plat/ehci-orion.h b/arch/arm/plat-orion/include/plat/ehci-orion.h
new file mode 100644 (file)
index 0000000..6434305
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/plat-orion/include/plat/ehci-orion.h
+ *
+ * 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 __PLAT_EHCI_ORION_H
+#define __PLAT_EHCI_ORION_H
+
+#include <linux/mbus.h>
+
+struct orion_ehci_data {
+       struct mbus_dram_target_info    *dram;
+};
+
+
+#endif
diff --git a/arch/arm/plat-orion/include/plat/irq.h b/arch/arm/plat-orion/include/plat/irq.h
new file mode 100644 (file)
index 0000000..f05eeab
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * arch/arm/plat-orion/include/plat/irq.h
+ *
+ * Marvell Orion SoC IRQ handling.
+ *
+ * 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 __PLAT_IRQ_H
+#define __PLAT_IRQ_H
+
+void orion_irq_init(unsigned int irq_start, void __iomem *maskaddr);
+
+
+#endif
diff --git a/arch/arm/plat-orion/include/plat/mv_xor.h b/arch/arm/plat-orion/include/plat/mv_xor.h
new file mode 100644 (file)
index 0000000..bd5f3bd
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * arch/arm/plat-orion/include/plat/mv_xor.h
+ *
+ * Marvell XOR platform device data definition file.
+ */
+
+#ifndef __PLAT_MV_XOR_H
+#define __PLAT_MV_XOR_H
+
+#include <linux/dmaengine.h>
+#include <linux/mbus.h>
+
+#define MV_XOR_SHARED_NAME     "mv_xor_shared"
+#define MV_XOR_NAME            "mv_xor"
+
+struct mbus_dram_target_info;
+
+struct mv_xor_platform_shared_data {
+       struct mbus_dram_target_info    *dram;
+};
+
+struct mv_xor_platform_data {
+       struct platform_device          *shared;
+       int                             hw_id;
+       dma_cap_mask_t                  cap_mask;
+       size_t                          pool_size;
+};
+
+
+#endif
diff --git a/arch/arm/plat-orion/include/plat/orion_nand.h b/arch/arm/plat-orion/include/plat/orion_nand.h
new file mode 100644 (file)
index 0000000..d6a4cfa
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * arch/arm/plat-orion/include/plat/orion_nand.h
+ *
+ * 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 __PLAT_ORION_NAND_H
+#define __PLAT_ORION_NAND_H
+
+/*
+ * Device bus NAND private data
+ */
+struct orion_nand_data {
+       struct mtd_partition *parts;
+       u32 nr_parts;
+       u8 ale;         /* address line number connected to ALE */
+       u8 cle;         /* address line number connected to CLE */
+       u8 width;       /* buswidth */
+       u8 chip_delay;
+};
+
+
+#endif
diff --git a/arch/arm/plat-orion/include/plat/pcie.h b/arch/arm/plat-orion/include/plat/pcie.h
new file mode 100644 (file)
index 0000000..3ebfef7
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * arch/arm/plat-orion/include/plat/pcie.h
+ *
+ * Marvell Orion SoC PCIe handling.
+ *
+ * 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 __PLAT_PCIE_H
+#define __PLAT_PCIE_H
+
+u32 orion_pcie_dev_id(void __iomem *base);
+u32 orion_pcie_rev(void __iomem *base);
+int orion_pcie_link_up(void __iomem *base);
+int orion_pcie_x4_mode(void __iomem *base);
+int orion_pcie_get_local_bus_nr(void __iomem *base);
+void orion_pcie_set_local_bus_nr(void __iomem *base, int nr);
+void orion_pcie_setup(void __iomem *base,
+                     struct mbus_dram_target_info *dram);
+int orion_pcie_rd_conf(void __iomem *base, struct pci_bus *bus,
+                      u32 devfn, int where, int size, u32 *val);
+int orion_pcie_rd_conf_tlp(void __iomem *base, struct pci_bus *bus,
+                          u32 devfn, int where, int size, u32 *val);
+int orion_pcie_rd_conf_wa(void __iomem *wa_base, struct pci_bus *bus,
+                         u32 devfn, int where, int size, u32 *val);
+int orion_pcie_wr_conf(void __iomem *base, struct pci_bus *bus,
+                      u32 devfn, int where, int size, u32 val);
+
+
+#endif
diff --git a/arch/arm/plat-orion/include/plat/time.h b/arch/arm/plat-orion/include/plat/time.h
new file mode 100644 (file)
index 0000000..c06ca35
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * arch/arm/plat-orion/include/plat/time.h
+ *
+ * Marvell Orion SoC time handling.
+ *
+ * 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 __PLAT_TIME_H
+#define __PLAT_TIME_H
+
+void orion_time_init(unsigned int irq, unsigned int tclk);
+
+
+#endif
index fe66a1835169475af30a80331cd6ee3252b32a4a..3f9d34fc738ca950bca1355d3042ede89e46ac42 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/io.h>
-#include <asm/plat-orion/irq.h>
+#include <plat/irq.h>
 
 static void orion_irq_mask(u32 irq)
 {
index ca32c60e14d77b8e2be11fc2b2b21f0be3bd0de5..883902fead8928f9ff24cdfd781fa28b3013470c 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/pci.h>
 #include <linux/mbus.h>
 #include <asm/mach/pci.h>
-#include <asm/plat-orion/pcie.h>
+#include <plat/pcie.h>
 
 /*
  * PCIe unit register offsets.
index 6d60f0476bb850e949056924d829920e8b797f5b..89ce60eabd5bd6d68304608bdad6521b2a6acd6e 100644 (file)
@@ -169,9 +169,7 @@ static struct map_desc s3c_iodesc[] __initdata = {
        IODESC_ENT(UART)
 };
 
-
-static struct cpu_table *
-s3c_lookup_cpu(unsigned long idcode)
+static struct cpu_table * __init s3c_lookup_cpu(unsigned long idcode)
 {
        struct cpu_table *tab;
        int count;
index 8b8f564c3aa25a5c59dea10c2c96fec47e54b349..56281c030a7bb4ab5eebef4d36dfc3cd440b0e41 100644 (file)
@@ -12,7 +12,7 @@
 #
 #   http://www.arm.linux.org.uk/developer/machines/?action=new
 #
-# Last update: Sun Jul 13 12:04:05 2008
+# Last update: Wed Aug 13 21:56:02 2008
 #
 # machine_is_xxx       CONFIG_xxxx             MACH_TYPE_xxx           number
 #
@@ -843,7 +843,7 @@ borzoi                      MACH_BORZOI             BORZOI                  831
 gecko                  MACH_GECKO              GECKO                   832
 ds101                  MACH_DS101              DS101                   833
 omap_palmtt2           MACH_OMAP_PALMTT2       OMAP_PALMTT2            834
-xscale_palmld          MACH_XSCALE_PALMLD      XSCALE_PALMLD           835
+palmld                 MACH_PALMLD             PALMLD                  835
 cc9c                   MACH_CC9C               CC9C                    836
 sbc1670                        MACH_SBC1670            SBC1670                 837
 ixdp28x5               MACH_IXDP28X5           IXDP28X5                838
@@ -852,7 +852,7 @@ ml696k                      MACH_ML696K             ML696K                  840
 arcom_zeus             MACH_ARCOM_ZEUS         ARCOM_ZEUS              841
 osiris                 MACH_OSIRIS             OSIRIS                  842
 maestro                        MACH_MAESTRO            MAESTRO                 843
-tunge2                 MACH_TUNGE2             TUNGE2                  844
+palmte2                        MACH_PALMTE2            PALMTE2                 844
 ixbbm                  MACH_IXBBM              IXBBM                   845
 mx27ads                        MACH_MX27ADS            MX27ADS                 846
 ax8004                 MACH_AX8004             AX8004                  847
@@ -916,7 +916,7 @@ nxdb500                     MACH_NXDB500            NXDB500                 905
 apf9328                        MACH_APF9328            APF9328                 906
 omap_wipoq             MACH_OMAP_WIPOQ         OMAP_WIPOQ              907
 omap_twip              MACH_OMAP_TWIP          OMAP_TWIP               908
-palmtreo650            MACH_PALMTREO650        PALMTREO650             909
+palmt650               MACH_PALMT650           PALMT650                909
 acumen                 MACH_ACUMEN             ACUMEN                  910
 xp100                  MACH_XP100              XP100                   911
 fs2410                 MACH_FS2410             FS2410                  912
@@ -1096,7 +1096,7 @@ atc6                      MACH_ATC6               ATC6                    1086
 multmdw                        MACH_MULTMDW            MULTMDW                 1087
 mba2440                        MACH_MBA2440            MBA2440                 1088
 ecsd                   MACH_ECSD               ECSD                    1089
-zire31                 MACH_ZIRE31             ZIRE31                  1090
+palmz31                        MACH_PALMZ31            PALMZ31                 1090
 fsg                    MACH_FSG                FSG                     1091
 razor101               MACH_RAZOR101           RAZOR101                1092
 opera_tdm              MACH_OPERA_TDM          OPERA_TDM               1093
@@ -1810,7 +1810,7 @@ kriss_sensor              MACH_KRISS_SENSOR       KRISS_SENSOR            1819
 pilz_pmi5              MACH_PILZ_PMI5          PILZ_PMI5               1820
 jade                   MACH_JADE               JADE                    1821
 ks8695_softplc         MACH_KS8695_SOFTPLC     KS8695_SOFTPLC          1822
-gprisc4                        MACH_GPRISC4            GPRISC4                 1823
+gprisc3                        MACH_GPRISC4            GPRISC4                 1823
 stamp9260              MACH_STAMP9260          STAMP9260               1824
 smdk6430               MACH_SMDK6430           SMDK6430                1825
 smdkc100               MACH_SMDKC100           SMDKC100                1826
@@ -1820,3 +1820,44 @@ deister_eyecam           MACH_DEISTER_EYECAM     DEISTER_EYECAM          1829
 at91sam9m10ek          MACH_AT91SAM9M10EK      AT91SAM9M10EK           1830
 linkstation_produo     MACH_LINKSTATION_PRODUO LINKSTATION_PRODUO      1831
 hit_b0                 MACH_HIT_B0             HIT_B0                  1832
+adx_rmu                        MACH_ADX_RMU            ADX_RMU                 1833
+xg_cpe_main            MACH_XG_CPE_MAIN        XG_CPE_MAIN             1834
+edb9407a               MACH_EDB9407A           EDB9407A                1835
+dtb9608                        MACH_DTB9608            DTB9608                 1836
+em104v1                        MACH_EM104V1            EM104V1                 1837
+demo                   MACH_DEMO               DEMO                    1838
+logi9260               MACH_LOGI9260           LOGI9260                1839
+mx31_exm32             MACH_MX31_EXM32         MX31_EXM32              1840
+usb_a9g20              MACH_USB_A9G20          USB_A9G20               1841
+picproje2008           MACH_PICPROJE2008       PICPROJE2008            1842
+cs_e9315               MACH_CS_E9315           CS_E9315                1843
+qil_a9g20              MACH_QIL_A9G20          QIL_A9G20               1844
+sha_pon020             MACH_SHA_PON020         SHA_PON020              1845
+nad                    MACH_NAD                NAD                     1846
+sbc35_a9260            MACH_SBC35_A9260        SBC35_A9260             1847
+sbc35_a9g20            MACH_SBC35_A9G20        SBC35_A9G20             1848
+davinci_beginning      MACH_DAVINCI_BEGINNING  DAVINCI_BEGINNING       1849
+uwc                    MACH_UWC                UWC                     1850
+mxlads                 MACH_MXLADS             MXLADS                  1851
+htcnike                        MACH_HTCNIKE            HTCNIKE                 1852
+deister_pxa270         MACH_DEISTER_PXA270     DEISTER_PXA270          1853
+cme9210js              MACH_CME9210JS          CME9210JS               1854
+cc9p9360               MACH_CC9P9360           CC9P9360                1855
+mocha                  MACH_MOCHA              MOCHA                   1856
+wapd170ag              MACH_WAPD170AG          WAPD170AG               1857
+linkstation_mini       MACH_LINKSTATION_MINI   LINKSTATION_MINI        1858
+afeb9260               MACH_AFEB9260           AFEB9260                1859
+w90x900                        MACH_W90X900            W90X900                 1860
+w90x700                        MACH_W90X700            W90X700                 1861
+kt300ip                        MACH_KT300IP            KT300IP                 1862
+kt300ip_g20            MACH_KT300IP_G20        KT300IP_G20             1863
+srcm                   MACH_SRCM               SRCM                    1864
+wlnx_9260              MACH_WLNX_9260          WLNX_9260               1865
+openmoko_gta03         MACH_OPENMOKO_GTA03     OPENMOKO_GTA03          1866
+osprey2                        MACH_OSPREY2            OSPREY2                 1867
+kbio9260               MACH_KBIO9260           KBIO9260                1868
+ginza                  MACH_GINZA              GINZA                   1869
+a636n                  MACH_A636N              A636N                   1870
+imx27ipcam             MACH_IMX27IPCAM         IMX27IPCAM              1871
+nenoc                  MACH_NEMOC              NEMOC                   1872
+geneva                 MACH_GENEVA             GENEVA                  1873
index 5a097c46bc4613e6857640cb3bdea0c417ec4ba2..f64d25973a3794dc7e0a4235f46f7e2383903b55 100644 (file)
@@ -249,7 +249,7 @@ config MEM_MT48LC8M32B2B5_7
 
 config MEM_MT48LC32M16A2TG_75
        bool
-       depends on (BFIN527_EZKIT || BFIN532_IP0X)
+       depends on (BFIN527_EZKIT || BFIN532_IP0X || BLACKSTAMP)
        default y
 
 source "arch/blackfin/mach-bf527/Kconfig"
@@ -292,7 +292,7 @@ config CLKIN_HZ
        int "Frequency of the crystal on the board in Hz"
        default "11059200" if BFIN533_STAMP
        default "27000000" if BFIN533_EZKIT
-       default "25000000" if (BFIN537_STAMP || BFIN527_EZKIT || H8606_HVSISTEMAS)
+       default "25000000" if (BFIN537_STAMP || BFIN527_EZKIT || H8606_HVSISTEMAS || BLACKSTAMP)
        default "30000000" if BFIN561_EZKIT
        default "24576000" if PNAV10
        default "10000000" if BFIN532_IP0X
@@ -332,7 +332,7 @@ config VCO_MULT
        default "22" if BFIN533_BLUETECHNIX_CM
        default "20" if (BFIN537_BLUETECHNIX_CM || BFIN527_BLUETECHNIX_CM || BFIN561_BLUETECHNIX_CM)
        default "20" if BFIN561_EZKIT
-       default "16" if H8606_HVSISTEMAS
+       default "16" if (H8606_HVSISTEMAS || BLACKSTAMP)
        help
          This controls the frequency of the on-chip PLL. This can be between 1 and 64.
          PLL Frequency = (Crystal Frequency) * (this setting)
@@ -622,6 +622,33 @@ config CPLB_SWITCH_TAB_L1
          If enabled, the CPLB Switch Tables are linked
          into L1 data memory. (less latency)
 
+comment "Speed Optimizations"
+config BFIN_INS_LOWOVERHEAD
+       bool "ins[bwl] low overhead, higher interrupt latency"
+       default y
+       help
+         Reads on the Blackfin are speculative. In Blackfin terms, this means
+         they can be interrupted at any time (even after they have been issued
+         on to the external bus), and re-issued after the interrupt occurs.
+         For memory - this is not a big deal, since memory does not change if
+         it sees a read.
+
+         If a FIFO is sitting on the end of the read, it will see two reads,
+         when the core only sees one since the FIFO receives both the read
+         which is cancelled (and not delivered to the core) and the one which
+         is re-issued (which is delivered to the core).
+
+         To solve this, interrupts are turned off before reads occur to
+         I/O space. This option controls which the overhead/latency of
+         controlling interrupts during this time
+          "n" turns interrupts off every read
+               (higher overhead, but lower interrupt latency)
+          "y" turns interrupts off every loop
+               (low overhead, but longer interrupt latency)
+
+         default behavior is to leave this set to on (type "Y"). If you are experiencing
+         interrupt latency issues, it is safe and OK to turn this off.
+
 endmenu
 
 
@@ -933,13 +960,6 @@ endchoice
 comment "Possible Suspend Mem / Hibernate Wake-Up Sources"
        depends on PM
 
-config PM_BFIN_WAKE_RTC
-       bool "Allow Wake-Up from RESET and on-chip RTC"
-       depends on PM
-       default n
-       help
-         Enable RTC Wake-Up (Voltage Regulator Power-Up)
-
 config PM_BFIN_WAKE_PH6
        bool "Allow Wake-Up from on-chip PHY or PH6 GP"
        depends on PM && (BF52x || BF534 || BF536 || BF537)
@@ -947,41 +967,12 @@ config PM_BFIN_WAKE_PH6
        help
          Enable PHY and PH6 GP Wake-Up (Voltage Regulator Power-Up)
 
-config PM_BFIN_WAKE_CAN
-       bool "Allow Wake-Up from on-chip CAN0/1"
-       depends on PM && (BF54x || BF534 || BF536 || BF537)
-       default n
-       help
-         Enable CAN0/1 Wake-Up (Voltage Regulator Power-Up)
-
 config PM_BFIN_WAKE_GP
        bool "Allow Wake-Up from GPIOs"
        depends on PM && BF54x
        default n
        help
          Enable General-Purpose Wake-Up (Voltage Regulator Power-Up)
-
-config PM_BFIN_WAKE_USB
-       bool "Allow Wake-Up from on-chip USB"
-       depends on PM && (BF54x || BF52x)
-       default n
-       help
-         Enable USB Wake-Up (Voltage Regulator Power-Up)
-
-config PM_BFIN_WAKE_KEYPAD
-       bool "Allow Wake-Up from on-chip Keypad"
-       depends on PM && BF54x
-       default n
-       help
-         Enable Keypad Wake-Up (Voltage Regulator Power-Up)
-
-config PM_BFIN_WAKE_ROTARY
-       bool "Allow Wake-Up from on-chip Rotary"
-       depends on PM && BF54x
-       default n
-       help
-         Enable Rotary Wake-Up (Voltage Regulator Power-Up)
-
 endmenu
 
 menu "CPU Frequency scaling"
diff --git a/arch/blackfin/configs/BlackStamp_defconfig b/arch/blackfin/configs/BlackStamp_defconfig
new file mode 100644 (file)
index 0000000..2921f99
--- /dev/null
@@ -0,0 +1,1195 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.26.2
+#
+# CONFIG_MMU is not set
+# CONFIG_FPU is not set
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_BLACKFIN=y
+CONFIG_ZONE_DMA=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_FORCE_MAX_ZONEORDER=14
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_AUDIT is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_CGROUPS is not set
+# CONFIG_GROUP_SCHED is not set
+CONFIG_SYSFS_DEPRECATED=y
+CONFIG_SYSFS_DEPRECATED_V2=y
+# CONFIG_RELAY is not set
+# CONFIG_NAMESPACES is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_SYSCTL_SYSCALL_CHECK=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_COMPAT_BRK=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+# CONFIG_MARKERS is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_HAVE_KPROBES is not set
+# CONFIG_HAVE_KRETPROBES is not set
+# CONFIG_HAVE_DMA_ATTRS is not set
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_TINY_SHMEM=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+# CONFIG_BLK_DEV_BSG is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+# CONFIG_IOSCHED_DEADLINE is not set
+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_CLASSIC_RCU=y
+# CONFIG_PREEMPT_NONE is not set
+CONFIG_PREEMPT_VOLUNTARY=y
+# CONFIG_PREEMPT is not set
+
+#
+# Blackfin Processor Options
+#
+
+#
+# Processor and Board Settings
+#
+# CONFIG_BF522 is not set
+# CONFIG_BF523 is not set
+# CONFIG_BF524 is not set
+# CONFIG_BF525 is not set
+# CONFIG_BF526 is not set
+# CONFIG_BF527 is not set
+# CONFIG_BF531 is not set
+CONFIG_BF532=y
+# CONFIG_BF533 is not set
+# CONFIG_BF534 is not set
+# CONFIG_BF536 is not set
+# CONFIG_BF537 is not set
+# CONFIG_BF542 is not set
+# CONFIG_BF544 is not set
+# CONFIG_BF547 is not set
+# CONFIG_BF548 is not set
+# CONFIG_BF549 is not set
+# CONFIG_BF561 is not set
+# CONFIG_BF_REV_0_0 is not set
+# CONFIG_BF_REV_0_1 is not set
+# CONFIG_BF_REV_0_2 is not set
+# CONFIG_BF_REV_0_3 is not set
+# CONFIG_BF_REV_0_4 is not set
+CONFIG_BF_REV_0_5=y
+# CONFIG_BF_REV_ANY is not set
+# CONFIG_BF_REV_NONE is not set
+CONFIG_BF53x=y
+CONFIG_MEM_MT48LC32M16A2TG_75=y
+# CONFIG_BFIN533_EZKIT is not set
+# CONFIG_BFIN533_STAMP is not set
+# CONFIG_BFIN533_BLUETECHNIX_CM is not set
+# CONFIG_H8606_HVSISTEMAS is not set
+# CONFIG_BFIN532_IP0X is not set
+CONFIG_BLACKSTAMP=y
+# CONFIG_GENERIC_BF533_BOARD is not set
+
+#
+# BF533/2/1 Specific Configuration
+#
+
+#
+# Interrupt Priority Assignment
+#
+
+#
+# Priority
+#
+CONFIG_UART_ERROR=7
+CONFIG_SPORT0_ERROR=7
+CONFIG_SPI_ERROR=7
+CONFIG_SPORT1_ERROR=7
+CONFIG_PPI_ERROR=7
+CONFIG_DMA_ERROR=7
+CONFIG_PLLWAKE_ERROR=7
+CONFIG_RTC_ERROR=8
+CONFIG_DMA0_PPI=8
+CONFIG_DMA1_SPORT0RX=9
+CONFIG_DMA2_SPORT0TX=9
+CONFIG_DMA3_SPORT1RX=9
+CONFIG_DMA4_SPORT1TX=9
+CONFIG_DMA5_SPI=10
+CONFIG_DMA6_UARTRX=10
+CONFIG_DMA7_UARTTX=10
+CONFIG_TIMER0=11
+CONFIG_TIMER1=11
+CONFIG_TIMER2=11
+CONFIG_PFA=12
+CONFIG_PFB=12
+CONFIG_MEMDMA0=13
+CONFIG_MEMDMA1=13
+CONFIG_WDTIMER=13
+
+#
+# Board customizations
+#
+# CONFIG_CMDLINE_BOOL is not set
+CONFIG_BOOT_LOAD=0x1000
+
+#
+# Clock/PLL Setup
+#
+CONFIG_CLKIN_HZ=25000000
+# CONFIG_BFIN_KERNEL_CLOCK is not set
+# CONFIG_PLL_BYPASS is not set
+# CONFIG_CLKIN_HALF is not set
+CONFIG_VCO_MULT=16
+CONFIG_CCLK_DIV_1=y
+# CONFIG_CCLK_DIV_2 is not set
+# CONFIG_CCLK_DIV_4 is not set
+# CONFIG_CCLK_DIV_8 is not set
+CONFIG_SCLK_DIV=3
+CONFIG_MAX_MEM_SIZE=64
+CONFIG_MAX_VCO_HZ=400000000
+CONFIG_MIN_VCO_HZ=50000000
+CONFIG_MAX_SCLK_HZ=133333333
+CONFIG_MIN_SCLK_HZ=27000000
+
+#
+# Kernel Timer/Scheduler
+#
+# 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_SCHED_HRTICK is not set
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+# CONFIG_CYCLES_CLOCKSOURCE is not set
+CONFIG_TICK_ONESHOT=y
+# CONFIG_NO_HZ is not set
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+
+#
+# Memory Setup
+#
+
+#
+# Misc
+#
+CONFIG_BFIN_SCRATCH_REG_RETN=y
+# CONFIG_BFIN_SCRATCH_REG_RETE is not set
+# CONFIG_BFIN_SCRATCH_REG_CYCLES is not set
+
+#
+# Blackfin Kernel Optimizations
+#
+
+#
+# Memory Optimizations
+#
+CONFIG_I_ENTRY_L1=y
+CONFIG_EXCPT_IRQ_SYSC_L1=y
+CONFIG_DO_IRQ_L1=y
+CONFIG_CORE_TIMER_IRQ_L1=y
+CONFIG_IDLE_L1=y
+CONFIG_SCHEDULE_L1=y
+CONFIG_ARITHMETIC_OPS_L1=y
+CONFIG_ACCESS_OK_L1=y
+CONFIG_MEMSET_L1=y
+CONFIG_MEMCPY_L1=y
+CONFIG_SYS_BFIN_SPINLOCK_L1=y
+# CONFIG_IP_CHECKSUM_L1 is not set
+CONFIG_CACHELINE_ALIGNED_L1=y
+# CONFIG_SYSCALL_TAB_L1 is not set
+# CONFIG_CPLB_SWITCH_TAB_L1 is not set
+# CONFIG_RAMKERNEL is not set
+CONFIG_ROMKERNEL=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_SPARSEMEM_VMEMMAP_ENABLE is not set
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_VIRT_TO_BUS=y
+CONFIG_BFIN_GPTIMERS=y
+CONFIG_BFIN_DMA_5XX=y
+# CONFIG_DMA_UNCACHED_4M is not set
+# CONFIG_DMA_UNCACHED_2M is not set
+CONFIG_DMA_UNCACHED_1M=y
+# CONFIG_DMA_UNCACHED_NONE is not set
+
+#
+# Cache Support
+#
+CONFIG_BFIN_ICACHE=y
+CONFIG_BFIN_DCACHE=y
+# CONFIG_BFIN_DCACHE_BANKA is not set
+# CONFIG_BFIN_ICACHE_LOCK is not set
+# CONFIG_BFIN_WB is not set
+CONFIG_BFIN_WT=y
+# CONFIG_MPU is not set
+
+#
+# Asynchonous Memory Configuration
+#
+
+#
+# EBIU_AMGCTL Global Control
+#
+CONFIG_C_AMCKEN=y
+CONFIG_C_CDPRIO=y
+# CONFIG_C_AMBEN is not set
+# CONFIG_C_AMBEN_B0 is not set
+# CONFIG_C_AMBEN_B0_B1 is not set
+# CONFIG_C_AMBEN_B0_B1_B2 is not set
+CONFIG_C_AMBEN_ALL=y
+
+#
+# EBIU_AMBCTL Control
+#
+CONFIG_BANK_0=0x7BB0
+CONFIG_BANK_1=0x7BB0
+CONFIG_BANK_2=0x7BB0
+CONFIG_BANK_3=0xAAC2
+
+#
+# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+#
+# CONFIG_PCI is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+# CONFIG_PCCARD is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF_FDPIC=y
+CONFIG_BINFMT_FLAT=y
+CONFIG_BINFMT_ZFLAT=y
+CONFIG_BINFMT_SHARED_FLAT=y
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_SLEEP=y
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_PM_BFIN_SLEEP_DEEPER=y
+# CONFIG_PM_BFIN_SLEEP is not set
+# CONFIG_PM_WAKEUP_BY_GPIO is not set
+
+#
+# Possible Suspend Mem / Hibernate Wake-Up Sources
+#
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_XFRM_STATISTICS 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 is not set
+# 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=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_LRO is not set
+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_NETLABEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# 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
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR 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 is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+# CONFIG_MTD_AR7_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+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
+# CONFIG_MTD_OOPS is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=m
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=m
+# 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=m
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=m
+CONFIG_MTD_RAM=y
+CONFIG_MTD_ROM=m
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_GPIO_ADDR is not set
+# CONFIG_MTD_UCLINUX is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_DATAFLASH is not set
+CONFIG_MTD_M25P80=y
+# CONFIG_M25PXX_USE_FAST_READ 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
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=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_XIP is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_ENCLOSURE_SERVICES is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+CONFIG_NETDEVICES=y
+# CONFIG_NETDEVICES_MULTIQUEUE is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_VETH is not set
+# CONFIG_PHYLIB is not set
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+CONFIG_SMC91X=y
+# CONFIG_SMSC911X is not set
+# CONFIG_DM9000 is not set
+# CONFIG_ENC28J60 is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+# CONFIG_B44 is not set
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
+# CONFIG_IWLWIFI_LEDS is not set
+# CONFIG_WAN is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_EVDEV=m
+# 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_TABLET 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_AD9960 is not set
+# CONFIG_SPI_ADC_BF533 is not set
+# CONFIG_BF5xx_PPIFCD is not set
+# CONFIG_BFIN_SIMPLE_TIMER is not set
+CONFIG_BF5xx_PPI=y
+CONFIG_BFIN_SPORT=y
+# CONFIG_BFIN_TIMER_LATENCY is not set
+# CONFIG_TWI_LCD is not set
+CONFIG_SIMPLE_GPIO=m
+# CONFIG_VT is not set
+CONFIG_DEVKMEM=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_BFIN=y
+CONFIG_SERIAL_BFIN_CONSOLE=y
+CONFIG_SERIAL_BFIN_DMA=y
+# CONFIG_SERIAL_BFIN_PIO is not set
+CONFIG_SERIAL_BFIN_UART0=y
+# CONFIG_BFIN_UART0_CTSRTS is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_BFIN_SPORT is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_LEGACY_PTYS is not set
+
+#
+# CAN, the car bus and industrial fieldbus
+#
+# CONFIG_CAN4LINUX is not set
+# CONFIG_IPMI_HANDLER is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+CONFIG_I2C=m
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_CHARDEV=m
+CONFIG_I2C_ALGOBIT=m
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_GPIO=m
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_SIMTEC is not set
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_PCA_PLATFORM is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+# CONFIG_DS1682 is not set
+# CONFIG_SENSORS_AD5252 is not set
+# CONFIG_SENSORS_EEPROM is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_PCF8575 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_SENSORS_TSL2550 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
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+CONFIG_SPI_BFIN=y
+# CONFIG_SPI_BITBANG is not set
+
+#
+# SPI Protocol Masters
+#
+CONFIG_SPI_AT25=y
+CONFIG_SPI_SPIDEV=m
+# CONFIG_SPI_TLE62X0 is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_AD7418 is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1029 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM9240 is not set
+# CONFIG_SENSORS_ADT7470 is not set
+# CONFIG_SENSORS_ADT7473 is not set
+# CONFIG_SENSORS_ATXP1 is not set
+# CONFIG_SENSORS_DS1621 is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_F71882FG is not set
+# CONFIG_SENSORS_F75375S 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_LM93 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_MAX6650 is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_DME1737 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_ADS7828 is not set
+# CONFIG_SENSORS_THMC50 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_W83L786NG is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83627EHF is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+# CONFIG_THERMAL is not set
+# CONFIG_THERMAL_HWMON is not set
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_BFIN_WDT=y
+
+#
+# Sonics Silicon Backplane
+#
+CONFIG_SSB_POSSIBLE=y
+# CONFIG_SSB is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_PASIC3 is not set
+
+#
+# Multimedia devices
+#
+
+#
+# Multimedia core support
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+# CONFIG_VIDEO_MEDIA is not set
+
+#
+# Multimedia drivers
+#
+# CONFIG_DAB is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+CONFIG_HID_SUPPORT=y
+CONFIG_HID=y
+# CONFIG_HID_DEBUG is not set
+# CONFIG_HIDRAW is not set
+# CONFIG_USB_SUPPORT is not set
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_UNSAFE_RESUME is not set
+
+#
+# MMC/SD Card Drivers
+#
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_BLOCK_BOUNCE=y
+# CONFIG_SDIO_UART is not set
+# CONFIG_MMC_TEST is not set
+
+#
+# MMC/SD Host Controller Drivers
+#
+CONFIG_MMC_SPI=y
+# CONFIG_SPI_MMC is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_ACCESSIBILITY 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
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+# CONFIG_RTC_DRV_DS1307 is not set
+# CONFIG_RTC_DRV_DS1374 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_MAX6900 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_X1205 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_M41T80 is not set
+# CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_FM3130 is not set
+
+#
+# SPI RTC drivers
+#
+# CONFIG_RTC_DRV_MAX6902 is not set
+# CONFIG_RTC_DRV_R9701 is not set
+# CONFIG_RTC_DRV_RS5C348 is not set
+
+#
+# Platform RTC drivers
+#
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+CONFIG_RTC_DRV_BFIN=y
+# CONFIG_UIO is not set
+
+#
+# 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_OCFS2_FS is not set
+# CONFIG_DNOTIFY is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+# 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_SYSCTL=y
+CONFIG_SYSFS=y
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+# 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_YAFFS_FS=m
+CONFIG_YAFFS_YAFFS1=y
+# CONFIG_YAFFS_9BYTE_TAGS is not set
+# CONFIG_YAFFS_DOES_ECC is not set
+CONFIG_YAFFS_YAFFS2=y
+CONFIG_YAFFS_AUTO_YAFFS2=y
+# CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set
+# CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set
+# CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set
+CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
+# 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_LZO is not set
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+CONFIG_NFS_V4=y
+# CONFIG_NFSD is not set
+# CONFIG_ROOT_NFS is not set
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+# CONFIG_SUNRPC_BIND34 is not set
+CONFIG_RPCSEC_GSS_KRB5=y
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=y
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=y
+# 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
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ASCII=y
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=y
+# CONFIG_DLM is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+# 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 is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_SAMPLES is not set
+CONFIG_DEBUG_MMRS=y
+CONFIG_DEBUG_HUNT_FOR_ZERO=y
+CONFIG_DEBUG_BFIN_HWTRACE_ON=y
+CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_OFF=y
+# CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_ONE is not set
+# CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_TWO is not set
+CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION=0
+# CONFIG_DEBUG_BFIN_HWTRACE_EXPAND is not set
+# CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE is not set
+CONFIG_EARLY_PRINTK=y
+CONFIG_CPLB_INFO=y
+CONFIG_ACCESS_CHECK=y
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+CONFIG_SECURITY=y
+# CONFIG_SECURITY_NETWORK is not set
+# CONFIG_SECURITY_CAPABILITIES is not set
+CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_MANAGER=y
+# CONFIG_CRYPTO_GF128MUL is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+# CONFIG_CRYPTO_AUTHENC is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Authenticated Encryption with Associated Data
+#
+# CONFIG_CRYPTO_CCM is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_SEQIV is not set
+
+#
+# Block modes
+#
+CONFIG_CRYPTO_CBC=y
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_CTS is not set
+# CONFIG_CRYPTO_ECB is not set
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_PCBC is not set
+# CONFIG_CRYPTO_XTS is not set
+
+#
+# Hash modes
+#
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+
+#
+# Digest
+#
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_WP512 is not set
+
+#
+# Ciphers
+#
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+
+#
+# Compression
+#
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_LZO is not set
+CONFIG_CRYPTO_HW=y
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_GENERIC_FIND_FIRST_BIT is not set
+CONFIG_CRC_CCITT=m
+# CONFIG_CRC16 is not set
+CONFIG_CRC_ITU_T=y
+CONFIG_CRC32=y
+CONFIG_CRC7=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_HAS_DMA=y
diff --git a/arch/blackfin/configs/TCM-BF537_defconfig b/arch/blackfin/configs/TCM-BF537_defconfig
new file mode 100644 (file)
index 0000000..c482ee1
--- /dev/null
@@ -0,0 +1,693 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.24.7
+# Thu Jul 31 00:53:15 2008
+#
+# CONFIG_MMU is not set
+# CONFIG_FPU is not set
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_BLACKFIN=y
+CONFIG_ZONE_DMA=y
+CONFIG_SEMAPHORE_SLEEPERS=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_FORCE_MAX_ZONEORDER=14
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_CGROUPS is not set
+CONFIG_FAIR_GROUP_SCHED=y
+CONFIG_FAIR_USER_SCHED=y
+# CONFIG_FAIR_CGROUP_SCHED is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+# CONFIG_BLK_DEV_INITRD is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# 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_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_EVENTFD=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_TINY_SHMEM=y
+CONFIG_BASE_SMALL=0
+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
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+# CONFIG_BLK_DEV_BSG is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+
+#
+# Blackfin Processor Options
+#
+
+#
+# Processor and Board Settings
+#
+# CONFIG_BF522 is not set
+# CONFIG_BF523 is not set
+# CONFIG_BF524 is not set
+# CONFIG_BF525 is not set
+# CONFIG_BF526 is not set
+# CONFIG_BF527 is not set
+# CONFIG_BF531 is not set
+# CONFIG_BF532 is not set
+# CONFIG_BF533 is not set
+# CONFIG_BF534 is not set
+# CONFIG_BF536 is not set
+CONFIG_BF537=y
+# CONFIG_BF542 is not set
+# CONFIG_BF544 is not set
+# CONFIG_BF547 is not set
+# CONFIG_BF548 is not set
+# CONFIG_BF549 is not set
+# CONFIG_BF561 is not set
+# CONFIG_BF_REV_0_0 is not set
+# CONFIG_BF_REV_0_1 is not set
+CONFIG_BF_REV_0_2=y
+# CONFIG_BF_REV_0_3 is not set
+# CONFIG_BF_REV_0_4 is not set
+# CONFIG_BF_REV_0_5 is not set
+# CONFIG_BF_REV_ANY is not set
+# CONFIG_BF_REV_NONE is not set
+CONFIG_BF53x=y
+CONFIG_IRQ_PLL_WAKEUP=7
+CONFIG_IRQ_RTC=8
+CONFIG_IRQ_PPI=8
+CONFIG_IRQ_SPORT0_RX=9
+CONFIG_IRQ_SPORT0_TX=9
+CONFIG_IRQ_SPORT1_RX=9
+CONFIG_IRQ_SPORT1_TX=9
+CONFIG_IRQ_TWI=10
+CONFIG_IRQ_SPI=10
+CONFIG_IRQ_UART0_RX=10
+CONFIG_IRQ_UART0_TX=10
+CONFIG_IRQ_UART1_RX=10
+CONFIG_IRQ_UART1_TX=10
+CONFIG_IRQ_MAC_RX=11
+CONFIG_IRQ_MAC_TX=11
+CONFIG_IRQ_TMR0=12
+CONFIG_IRQ_TMR1=12
+CONFIG_IRQ_TMR2=12
+CONFIG_IRQ_TMR3=12
+CONFIG_IRQ_TMR4=12
+CONFIG_IRQ_TMR5=12
+CONFIG_IRQ_TMR6=12
+CONFIG_IRQ_TMR7=12
+CONFIG_IRQ_PORTG_INTB=12
+CONFIG_IRQ_MEM_DMA0=13
+CONFIG_IRQ_MEM_DMA1=13
+CONFIG_IRQ_WATCH=13
+# CONFIG_BFIN537_STAMP is not set
+# CONFIG_BFIN537_BLUETECHNIX_CM is not set
+CONFIG_BFIN537_BLUETECHNIX_TCM=y
+# CONFIG_PNAV10 is not set
+# CONFIG_CAMSIG_MINOTAUR is not set
+# CONFIG_GENERIC_BF537_BOARD is not set
+
+#
+# BF537 Specific Configuration
+#
+
+#
+# Interrupt Priority Assignment
+#
+
+#
+# Priority
+#
+CONFIG_IRQ_DMA_ERROR=7
+CONFIG_IRQ_ERROR=7
+CONFIG_IRQ_CAN_RX=11
+CONFIG_IRQ_CAN_TX=11
+CONFIG_IRQ_PROG_INTA=12
+
+#
+# Board customizations
+#
+# CONFIG_CMDLINE_BOOL is not set
+CONFIG_BOOT_LOAD=0x1000
+
+#
+# Clock/PLL Setup
+#
+CONFIG_CLKIN_HZ=25000000
+# CONFIG_BFIN_KERNEL_CLOCK is not set
+CONFIG_MAX_MEM_SIZE=32
+CONFIG_MAX_VCO_HZ=600000000
+CONFIG_MIN_VCO_HZ=50000000
+CONFIG_MAX_SCLK_HZ=133333333
+CONFIG_MIN_SCLK_HZ=27000000
+
+#
+# Kernel Timer/Scheduler
+#
+# 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_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+# CONFIG_CYCLES_CLOCKSOURCE is not set
+# CONFIG_TICK_ONESHOT is not set
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+
+#
+# Misc
+#
+CONFIG_BFIN_SCRATCH_REG_RETN=y
+# CONFIG_BFIN_SCRATCH_REG_RETE is not set
+# CONFIG_BFIN_SCRATCH_REG_CYCLES is not set
+
+#
+# Blackfin Kernel Optimizations
+#
+
+#
+# Memory Optimizations
+#
+CONFIG_I_ENTRY_L1=y
+CONFIG_EXCPT_IRQ_SYSC_L1=y
+CONFIG_DO_IRQ_L1=y
+CONFIG_CORE_TIMER_IRQ_L1=y
+CONFIG_IDLE_L1=y
+CONFIG_SCHEDULE_L1=y
+CONFIG_ARITHMETIC_OPS_L1=y
+CONFIG_ACCESS_OK_L1=y
+CONFIG_MEMSET_L1=y
+CONFIG_MEMCPY_L1=y
+CONFIG_SYS_BFIN_SPINLOCK_L1=y
+CONFIG_IP_CHECKSUM_L1=y
+CONFIG_CACHELINE_ALIGNED_L1=y
+CONFIG_SYSCALL_TAB_L1=y
+CONFIG_CPLB_SWITCH_TAB_L1=y
+CONFIG_RAMKERNEL=y
+# CONFIG_ROMKERNEL 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_SPARSEMEM_VMEMMAP_ENABLE is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_VIRT_TO_BUS=y
+# CONFIG_BFIN_GPTIMERS is not set
+CONFIG_BFIN_DMA_5XX=y
+# CONFIG_DMA_UNCACHED_4M is not set
+# CONFIG_DMA_UNCACHED_2M is not set
+CONFIG_DMA_UNCACHED_1M=y
+# CONFIG_DMA_UNCACHED_NONE is not set
+
+#
+# Cache Support
+#
+CONFIG_BFIN_ICACHE=y
+CONFIG_BFIN_DCACHE=y
+# CONFIG_BFIN_DCACHE_BANKA is not set
+# CONFIG_BFIN_ICACHE_LOCK is not set
+CONFIG_BFIN_WB=y
+# CONFIG_BFIN_WT is not set
+# CONFIG_MPU is not set
+
+#
+# Asynchonous Memory Configuration
+#
+
+#
+# EBIU_AMGCTL Global Control
+#
+CONFIG_C_AMCKEN=y
+CONFIG_C_CDPRIO=y
+# CONFIG_C_AMBEN is not set
+# CONFIG_C_AMBEN_B0 is not set
+# CONFIG_C_AMBEN_B0_B1 is not set
+# CONFIG_C_AMBEN_B0_B1_B2 is not set
+CONFIG_C_AMBEN_ALL=y
+
+#
+# EBIU_AMBCTL Control
+#
+CONFIG_BANK_0=0x7BB0
+CONFIG_BANK_1=0x7BB0
+CONFIG_BANK_2=0x7BB0
+CONFIG_BANK_3=0xFFC2
+
+#
+# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+#
+# CONFIG_PCI is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF_FDPIC=y
+CONFIG_BINFMT_FLAT=y
+CONFIG_BINFMT_ZFLAT=y
+CONFIG_BINFMT_SHARED_FLAT=y
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+CONFIG_SUSPEND_UP_POSSIBLE=y
+# CONFIG_PM_WAKEUP_BY_GPIO is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
+#
+# Networking
+#
+# CONFIG_NET is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_SYS_HYPERVISOR 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 is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+
+#
+# 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
+# CONFIG_MTD_OOPS is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+# CONFIG_MTD_JEDECPROBE 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_RAM=y
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_GPIO_ADDR is not set
+CONFIG_MTD_UCLINUX=y
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# 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
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+# CONFIG_CDROM_PKTCDVD is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+# 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_AD9960 is not set
+# CONFIG_SPI_ADC_BF533 is not set
+# CONFIG_BF5xx_PPIFCD is not set
+# CONFIG_BFIN_SIMPLE_TIMER is not set
+# CONFIG_BF5xx_PPI is not set
+CONFIG_BFIN_SPORT=y
+# CONFIG_BFIN_TIMER_LATENCY is not set
+# CONFIG_SIMPLE_GPIO is not set
+# CONFIG_VT is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_BFIN=y
+CONFIG_SERIAL_BFIN_CONSOLE=y
+CONFIG_SERIAL_BFIN_DMA=y
+# CONFIG_SERIAL_BFIN_PIO is not set
+CONFIG_SERIAL_BFIN_UART0=y
+# CONFIG_BFIN_UART0_CTSRTS is not set
+CONFIG_SERIAL_BFIN_UART1=y
+# CONFIG_BFIN_UART1_CTSRTS is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_BFIN_SPORT is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_LEGACY_PTYS is not set
+
+#
+# CAN, the car bus and industrial fieldbus
+#
+# CONFIG_CAN4LINUX is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+CONFIG_SPI_BFIN=y
+# CONFIG_SPI_BITBANG is not set
+
+#
+# SPI Protocol Masters
+#
+# CONFIG_SPI_AT25 is not set
+# CONFIG_SPI_SPIDEV is not set
+# CONFIG_SPI_TLE62X0 is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_BFIN_WDT=y
+
+#
+# Sonics Silicon Backplane
+#
+CONFIG_SSB_POSSIBLE=y
+# CONFIG_SSB is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DAB is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_MMC is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_RTC_CLASS is not set
+
+#
+# Userspace I/O
+#
+# CONFIG_UIO is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+# CONFIG_EXT2_FS_POSIX_ACL is not set
+# CONFIG_EXT2_FS_SECURITY is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS 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_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 is not set
+# 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_SYSCTL=y
+CONFIG_SYSFS=y
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+# 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_YAFFS_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
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_NLS is not set
+# CONFIG_INSTRUMENTATION is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+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 is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_SAMPLES is not set
+CONFIG_DEBUG_MMRS=y
+CONFIG_DEBUG_HUNT_FOR_ZERO=y
+CONFIG_DEBUG_BFIN_HWTRACE_ON=y
+CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_OFF=y
+# CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_ONE is not set
+# CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_TWO is not set
+CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION=0
+# CONFIG_DEBUG_BFIN_HWTRACE_EXPAND is not set
+# CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE is not set
+# CONFIG_EARLY_PRINTK is not set
+CONFIG_CPLB_INFO=y
+CONFIG_ACCESS_CHECK=y
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+CONFIG_SECURITY=y
+# CONFIG_SECURITY_NETWORK is not set
+CONFIG_SECURITY_CAPABILITIES=y
+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
+# CONFIG_CRC32 is not set
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
index 9eecfa403187d790ef83e8a869235734ce153e9c..a8b712a24c591d54189c2e007208169052fc179c 100644 (file)
@@ -25,7 +25,7 @@
 #include <asm/cplbinit.h>
 
 #if defined(CONFIG_BFIN_ICACHE)
-void bfin_icache_init(void)
+void __init bfin_icache_init(void)
 {
        unsigned long ctrl;
        int i;
@@ -43,7 +43,7 @@ void bfin_icache_init(void)
 #endif
 
 #if defined(CONFIG_BFIN_DCACHE)
-void bfin_dcache_init(void)
+void __init bfin_dcache_init(void)
 {
        unsigned long ctrl;
        int i;
index 8a18399f607250e992b6db9e4c78f7a7d70ce4f3..bd0831592c2c85724e06092e998648b212719c06 100644 (file)
@@ -25,7 +25,7 @@
 #include <asm/cplbinit.h>
 
 #if defined(CONFIG_BFIN_ICACHE)
-void bfin_icache_init(void)
+void __init bfin_icache_init(void)
 {
        unsigned long *table = icplb_table;
        unsigned long ctrl;
@@ -47,7 +47,7 @@ void bfin_icache_init(void)
 #endif
 
 #if defined(CONFIG_BFIN_DCACHE)
-void bfin_dcache_init(void)
+void __init bfin_dcache_init(void)
 {
        unsigned long *table = dcplb_table;
        unsigned long ctrl;
index 224e7cc30bc599f23d4d8f73f2d161e0e85f004f..728f708d3981008d0f4bdc459054da549a03d84e 100644 (file)
@@ -164,17 +164,13 @@ static struct cplb_desc cplb_data[] = {
                .name = "Asynchronous Memory Banks",
        },
        {
-#ifdef L2_START
                .start = L2_START,
                .end = L2_START + L2_LENGTH,
                .psize = SIZE_1M,
                .attr = SWITCH_T | I_CPLB | D_CPLB,
                .i_conf = L2_MEMORY,
                .d_conf = L2_MEMORY,
-               .valid = 1,
-#else
-               .valid = 0,
-#endif
+               .valid = (L2_LENGTH > 0),
                .name = "L2 Memory",
        },
        {
index 23e637eb78da8e7daab447c4b2f4ac849099f565..7a82d10b4ebf70aff56268ab83ff77966dbe69cb 100644 (file)
@@ -52,6 +52,7 @@ EXPORT_SYMBOL(mtd_size);
 #endif
 
 char __initdata command_line[COMMAND_LINE_SIZE];
+unsigned int __initdata *__retx;
 
 /* boot memmap, for parsing "memmap=" */
 #define BFIN_MEMMAP_MAX                128 /* number of entries in bfin_memmap */
@@ -131,14 +132,14 @@ void __init bf53x_relocate_l1_mem(void)
        dma_memcpy(_sdata_b_l1, _l1_lma_start + l1_code_length +
                        l1_data_a_length, l1_data_b_length);
 
-#ifdef L2_LENGTH
-       l2_length = _ebss_l2 - _stext_l2;
-       if (l2_length > L2_LENGTH)
-               panic("L2 SRAM Overflow\n");
+       if (L2_LENGTH != 0) {
+               l2_length = _ebss_l2 - _stext_l2;
+               if (l2_length > L2_LENGTH)
+                       panic("L2 SRAM Overflow\n");
 
-       /* Copy _stext_l2 to _edata_l2 to L2 SRAM */
-       dma_memcpy(_stext_l2, _l2_lma_start, l2_length);
-#endif
+               /* Copy _stext_l2 to _edata_l2 to L2 SRAM */
+               dma_memcpy(_stext_l2, _l2_lma_start, l2_length);
+       }
 }
 
 /* add_memory_region to memmap */
@@ -738,6 +739,16 @@ void __init setup_arch(char **cmdline_p)
 
        memory_setup();
 
+       /* Initialize Async memory banks */
+       bfin_write_EBIU_AMBCTL0(AMBCTL0VAL);
+       bfin_write_EBIU_AMBCTL1(AMBCTL1VAL);
+       bfin_write_EBIU_AMGCTL(AMGCTLVAL);
+#ifdef CONFIG_EBIU_MBSCTLVAL
+       bfin_write_EBIU_MBSCTL(CONFIG_EBIU_MBSCTLVAL);
+       bfin_write_EBIU_MODE(CONFIG_EBIU_MODEVAL);
+       bfin_write_EBIU_FCTL(CONFIG_EBIU_FCTLVAL);
+#endif
+
        cclk = get_cclk();
        sclk = get_sclk();
 
@@ -775,7 +786,11 @@ void __init setup_arch(char **cmdline_p)
        bfin_write_SWRST(DOUBLE_FAULT);
 
        if (_bfin_swrst & RESET_DOUBLE)
-               printk(KERN_INFO "Recovering from Double Fault event\n");
+               /*
+                * don't decode the address, since you don't know if this
+                * kernel's symbol map is the same as the crashing kernel
+                */
+               printk(KERN_INFO "Recovering from Double Fault event at %pF\n", __retx);
        else if (_bfin_swrst & RESET_WDOG)
                printk(KERN_INFO "Recovering from Watchdog event\n");
        else if (_bfin_swrst & RESET_SOFTWARE)
@@ -1049,7 +1064,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                   dsup_banks, BFIN_DSUBBANKS, BFIN_DWAYS,
                   BFIN_DLINES);
 #ifdef CONFIG_BFIN_ICACHE_LOCK
-       switch (read_iloc()) {
+       switch ((bfin_read_IMEM_CONTROL() >> 3) & WAYALL_L) {
        case WAY0_L:
                seq_printf(m, "Way0 Locked-Down\n");
                break;
index ad922ab915438ef3d66820809285e1f9a8477deb..9a9d5083acfdde5e2cae73830c79b9dcdf478030 100644 (file)
@@ -567,7 +567,7 @@ bool get_instruction(unsigned short *val, unsigned short *address)
         * we don't read something in the async space that can hang forever
         */
        if ((addr >= FIXED_CODE_START && (addr + 2) <= physical_mem_end) ||
-#ifdef L2_START
+#if L2_LENGTH != 0
            (addr >= L2_START && (addr + 2) <= (L2_START + L2_LENGTH)) ||
 #endif
            (addr >= BOOT_ROM_START && (addr + 2) <= (BOOT_ROM_START + BOOT_ROM_LENGTH)) ||
@@ -601,12 +601,55 @@ bool get_instruction(unsigned short *val, unsigned short *address)
        return false;
 }
 
+/* 
+ * decode the instruction if we are printing out the trace, as it
+ * makes things easier to follow, without running it through objdump
+ * These are the normal instructions which cause change of flow, which
+ * would be at the source of the trace buffer
+ */
+void decode_instruction(unsigned short *address)
+{
+       unsigned short opcode;
+
+       if (get_instruction(&opcode, address)) {
+               if (opcode == 0x0010)
+                       printk("RTS");
+               else if (opcode == 0x0011)
+                       printk("RTI");
+               else if (opcode == 0x0012)
+                       printk("RTX");
+               else if (opcode >= 0x0050 && opcode <= 0x0057)
+                       printk("JUMP (P%i)", opcode & 7);
+               else if (opcode >= 0x0060 && opcode <= 0x0067)
+                       printk("CALL (P%i)", opcode & 7);
+               else if (opcode >= 0x0070 && opcode <= 0x0077)
+                       printk("CALL (PC+P%i)", opcode & 7);
+               else if (opcode >= 0x0080 && opcode <= 0x0087)
+                       printk("JUMP (PC+P%i)", opcode & 7);
+               else if ((opcode >= 0x1000 && opcode <= 0x13FF) || (opcode >= 0x1800 && opcode <= 0x1BFF))
+                       printk("IF !CC JUMP");
+               else if ((opcode >= 0x1400 && opcode <= 0x17ff) || (opcode >= 0x1c00 && opcode <= 0x1fff))
+                       printk("IF CC JUMP");
+               else if (opcode >= 0x2000 && opcode <= 0x2fff)
+                       printk("JUMP.S");
+               else if (opcode >= 0xe080 && opcode <= 0xe0ff)
+                       printk("LSETUP");
+               else if (opcode >= 0xe200 && opcode <= 0xe2ff)
+                       printk("JUMP.L");
+               else if (opcode >= 0xe300 && opcode <= 0xe3ff)
+                       printk("CALL pcrel");
+               else
+                       printk("0x%04x", opcode);
+       }
+
+}
+
 void dump_bfin_trace_buffer(void)
 {
 #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON
        int tflags, i = 0;
        char buf[150];
-       unsigned short val = 0, *addr;
+       unsigned short *addr;
 #ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND
        int j, index;
 #endif
@@ -615,6 +658,10 @@ void dump_bfin_trace_buffer(void)
 
        printk(KERN_NOTICE "Hardware Trace:\n");
 
+#ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND
+       printk(KERN_NOTICE "WARNING: Expanded trace turned on - can not trace exceptions\n");
+#endif
+
        if (likely(bfin_read_TBUFSTAT() & TBUFCNT)) {
                for (; bfin_read_TBUFSTAT() & TBUFCNT; i++) {
                        decode_address(buf, (unsigned long)bfin_read_TBUF());
@@ -622,45 +669,14 @@ void dump_bfin_trace_buffer(void)
                        addr = (unsigned short *)bfin_read_TBUF();
                        decode_address(buf, (unsigned long)addr);
                        printk(KERN_NOTICE "     Source : %s ", buf);
-                       if (get_instruction(&val, addr)) {
-                               if (val == 0x0010)
-                                       printk("RTS");
-                               else if (val == 0x0011)
-                                       printk("RTI");
-                               else if (val == 0x0012)
-                                       printk("RTX");
-                               else if (val >= 0x0050 && val <= 0x0057)
-                                       printk("JUMP (P%i)", val & 7);
-                               else if (val >= 0x0060 && val <= 0x0067)
-                                       printk("CALL (P%i)", val & 7);
-                               else if (val >= 0x0070 && val <= 0x0077)
-                                       printk("CALL (PC+P%i)", val & 7);
-                               else if (val >= 0x0080 && val <= 0x0087)
-                                       printk("JUMP (PC+P%i)", val & 7);
-                               else if ((val >= 0x1000 && val <= 0x13FF) ||
-                                   (val >= 0x1800 && val <= 0x1BFF))
-                                       printk("IF !CC JUMP");
-                               else if ((val >= 0x1400 && val <= 0x17ff) ||
-                                   (val >= 0x1c00 && val <= 0x1fff))
-                                       printk("IF CC JUMP");
-                               else if (val >= 0x2000 && val <= 0x2fff)
-                                       printk("JUMP.S");
-                               else if (val >= 0xe080 && val <= 0xe0ff)
-                                       printk("LSETUP");
-                               else if (val >= 0xe200 && val <= 0xe2ff)
-                                       printk("JUMP.L");
-                               else if (val >= 0xe300 && val <= 0xe3ff)
-                                       printk("CALL pcrel");
-                               else
-                                       printk("0x%04x", val);
-                       }
+                       decode_instruction(addr);
                        printk("\n");
                }
        }
 
 #ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND
        if (trace_buff_offset)
-               index = trace_buff_offset/4 - 1;
+               index = trace_buff_offset / 4;
        else
                index = EXPAND_LEN;
 
@@ -672,7 +688,9 @@ void dump_bfin_trace_buffer(void)
                if (index < 0 )
                        index = EXPAND_LEN;
                decode_address(buf, software_trace_buff[index]);
-               printk(KERN_NOTICE "     Source : %s\n", buf);
+               printk(KERN_NOTICE "     Source : %s ", buf);
+               decode_instruction((unsigned short *)software_trace_buff[index]);
+               printk("\n");
                index -= 1;
                if (index < 0)
                        index = EXPAND_LEN;
index 0896e38d61087f1398a096cb6790d96afc4febc6..7d12c6692a65a1d2d8e2de17049fb541b61df9c3 100644 (file)
@@ -83,6 +83,7 @@ SECTIONS
 #if !L1_DATA_B_LENGTH
                *(.l1.bss.B)
 #endif
+               . = ALIGN(4);
                ___bss_stop = .;
        }
 
@@ -101,7 +102,7 @@ SECTIONS
 #if !L1_DATA_B_LENGTH
                *(.l1.data.B)
 #endif
-#ifndef L2_LENGTH
+#if !L2_LENGTH
                . = ALIGN(32);
                *(.data_l2.cacheline_aligned)
                *(.l2.data)
@@ -211,20 +212,19 @@ SECTIONS
                __ebss_b_l1 = .;
        }
 
-#ifdef L2_LENGTH
        __l2_lma_start = .;
 
        .text_data_l2 L2_START : AT(LOADADDR(.data_b_l1) + SIZEOF(.data_b_l1))
        {
                . = ALIGN(4);
                __stext_l2 = .;
-               *(.l1.text)
+               *(.l2.text)
                . = ALIGN(4);
                __etext_l2 = .;
 
                . = ALIGN(4);
                __sdata_l2 = .;
-               *(.l1.data)
+               *(.l2.data)
                __edata_l2 = .;
 
                . = ALIGN(32);
@@ -232,11 +232,10 @@ SECTIONS
 
                . = ALIGN(4);
                __sbss_l2 = .;
-               *(.l1.bss)
+               *(.l2.bss)
                . = ALIGN(4);
                __ebss_l2 = .;
        }
-#endif
 
        /* Force trailing alignment of our init section so that when we
         * free our init memory, we don't leave behind a partial page.
index eba2343b1b59246564ba96ef89cad418bbba8bf8..d60554dce87bc4f94fff3151cdeef747340bfed8 100644 (file)
 
 .align 2
 
+/*
+ * Reads on the Blackfin are speculative. In Blackfin terms, this means they
+ * can be interrupted at any time (even after they have been issued on to the
+ * external bus), and re-issued after the interrupt occurs.
+ *
+ * If a FIFO is sitting on the end of the read, it will see two reads,
+ * when the core only sees one. The FIFO receives the read which is cancelled,
+ * and not delivered to the core.
+ *
+ * To solve this, interrupts are turned off before reads occur to I/O space.
+ * There are 3 versions of all these functions
+ *  - turns interrupts off every read (higher overhead, but lower latency)
+ *  - turns interrupts off every loop (low overhead, but longer latency)
+ *  - DMA version, which do not suffer from this issue. DMA versions have
+ *      different name (prefixed by dma_ ), and are located in
+ *      ../kernel/bfin_dma_5xx.c
+ * Using the dma related functions are recommended for transfering large
+ * buffers in/out of FIFOs.
+ */
+
 ENTRY(_insl)
+#ifdef CONFIG_BFIN_INS_LOWOVERHEAD
        P0 = R0;        /* P0 = port */
        cli R3;
        P1 = R1;        /* P1 = address */
@@ -46,9 +67,26 @@ ENTRY(_insl)
 .Llong_loop_e:         NOP;
        sti R3;
        RTS;
+#else
+       P0 = R0;        /* P0 = port */
+       P1 = R1;        /* P1 = address */
+       P2 = R2;        /* P2 = count */
+       SSYNC;
+       LSETUP( .Llong_loop_s, .Llong_loop_e) LC0 = P2;
+.Llong_loop_s:
+       CLI R3;
+       NOP; NOP; NOP;
+       R0 = [P0];
+       [P1++] = R0;
+.Llong_loop_e:
+       STI R3;
+
+       RTS;
+#endif
 ENDPROC(_insl)
 
 ENTRY(_insw)
+#ifdef CONFIG_BFIN_INS_LOWOVERHEAD
        P0 = R0;        /* P0 = port */
        cli R3;
        P1 = R1;        /* P1 = address */
@@ -61,9 +99,26 @@ ENTRY(_insw)
 .Lword_loop_e:         NOP;
        sti R3;
        RTS;
+#else
+       P0 = R0;        /* P0 = port */
+       P1 = R1;        /* P1 = address */
+       P2 = R2;        /* P2 = count */
+       SSYNC;
+       LSETUP( .Lword_loop_s, .Lword_loop_e) LC0 = P2;
+.Lword_loop_s:
+       CLI R3;
+       NOP; NOP; NOP;
+       R0 = W[P0];
+       W[P1++] = R0;
+.Lword_loop_e:
+       STI R3;
+       RTS;
+
+#endif
 ENDPROC(_insw)
 
 ENTRY(_insw_8)
+#ifdef CONFIG_BFIN_INS_LOWOVERHEAD
        P0 = R0;        /* P0 = port */
        cli R3;
        P1 = R1;        /* P1 = address */
@@ -78,9 +133,29 @@ ENTRY(_insw_8)
 .Lword8_loop_e: NOP;
        sti R3;
        RTS;
+#else
+       P0 = R0;        /* P0 = port */
+       P1 = R1;        /* P1 = address */
+       P2 = R2;        /* P2 = count */
+       SSYNC;
+       LSETUP( .Lword8_loop_s, .Lword8_loop_e) LC0 = P2;
+.Lword8_loop_s:
+       CLI R3;
+       NOP; NOP; NOP;
+       R0 = W[P0];
+       B[P1++] = R0;
+       R0 = R0 >> 8;
+       B[P1++] = R0;
+       NOP;
+.Lword8_loop_e:
+       STI R3;
+
+       RTS;
+#endif
 ENDPROC(_insw_8)
 
 ENTRY(_insb)
+#ifdef CONFIG_BFIN_INS_LOWOVERHEAD
        P0 = R0;        /* P0 = port */
        cli R3;
        P1 = R1;        /* P1 = address */
@@ -93,9 +168,26 @@ ENTRY(_insb)
 .Lbyte_loop_e:  NOP;
        sti R3;
        RTS;
+#else
+       P0 = R0;        /* P0 = port */
+       P1 = R1;        /* P1 = address */
+       P2 = R2;        /* P2 = count */
+       SSYNC;
+       LSETUP( .Lbyte_loop_s, .Lbyte_loop_e) LC0 = P2;
+.Lbyte_loop_s:
+       CLI R3;
+       NOP; NOP; NOP;
+       R0 = B[P0];
+       B[P1++] = R0;
+.Lbyte_loop_e:
+       STI R3;
+
+       RTS;
+#endif
 ENDPROC(_insb)
 
 ENTRY(_insl_16)
+#ifdef CONFIG_BFIN_INS_LOWOVERHEAD
        P0 = R0;        /* P0 = port */
        cli R3;
        P1 = R1;        /* P1 = address */
@@ -110,4 +202,21 @@ ENTRY(_insl_16)
 .Llong16_loop_e:  NOP;
        sti R3;
        RTS;
+#else
+       P0 = R0;        /* P0 = port */
+       P1 = R1;        /* P1 = address */
+       P2 = R2;        /* P2 = count */
+       SSYNC;
+       LSETUP( .Llong16_loop_s, .Llong16_loop_e) LC0 = P2;
+.Llong16_loop_s:
+       CLI R3;
+       NOP; NOP; NOP;
+       R0 = [P0];
+       W[P1++] = R0;
+       R0 = R0 >> 16;
+       W[P1++] = R0;
+.Llong16_loop_e:
+       STI R3;
+       RTS;
+#endif
 ENDPROC(_insl_16)
index 0b26ae2de5eef07054b3c309f527fd9acb38bad4..d22bc7773717411e200c1968e885413a0d74031f 100644 (file)
@@ -39,7 +39,6 @@
 #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
 #include <linux/usb/isp1362.h>
 #endif
-#include <linux/pata_platform.h>
 #include <linux/i2c.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
@@ -160,15 +159,15 @@ static struct platform_device musb_device = {
 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
 static struct mtd_partition ezkit_partitions[] = {
        {
-               .name       = "Bootloader",
+               .name       = "bootloader(nor)",
                .size       = 0x40000,
                .offset     = 0,
        }, {
-               .name       = "Kernel",
+               .name       = "linux kernel(nor)",
                .size       = 0x1C0000,
                .offset     = MTDPART_OFS_APPEND,
        }, {
-               .name       = "RootFS",
+               .name       = "file system(nor)",
                .size       = MTDPART_SIZ_FULL,
                .offset     = MTDPART_OFS_APPEND,
        }
@@ -200,12 +199,12 @@ static struct platform_device ezkit_flash_device = {
 #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE)
 static struct mtd_partition partition_info[] = {
        {
-               .name = "Linux Kernel",
+               .name = "linux kernel(nand)",
                .offset = 0,
                .size = 4 * SIZE_1M,
        },
        {
-               .name = "File System",
+               .name = "file system(nand)",
                .offset = MTDPART_OFS_APPEND,
                .size = MTDPART_SIZ_FULL,
        },
@@ -438,12 +437,12 @@ static struct platform_device net2272_bfin_device = {
        || defined(CONFIG_MTD_M25P80_MODULE)
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name = "bootloader",
+               .name = "bootloader(spi)",
                .size = 0x00040000,
                .offset = 0,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name = "linux kernel",
+               .name = "linux kernel(spi)",
                .size = MTDPART_SIZ_FULL,
                .offset = MTDPART_OFS_APPEND,
        }
@@ -799,43 +798,6 @@ static struct platform_device bfin_sport1_uart_device = {
 };
 #endif
 
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-#define PATA_INT       55
-
-static struct pata_platform_info bfin_pata_platform_data = {
-       .ioport_shift = 1,
-       .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED,
-};
-
-static struct resource bfin_pata_resources[] = {
-       {
-               .start = 0x20314020,
-               .end = 0x2031403F,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = 0x2031401C,
-               .end = 0x2031401F,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = PATA_INT,
-               .end = PATA_INT,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device bfin_pata_device = {
-       .name = "pata_platform",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(bfin_pata_resources),
-       .resource = bfin_pata_resources,
-       .dev = {
-               .platform_data = &bfin_pata_platform_data,
-       }
-};
-#endif
-
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 #include <linux/input.h>
 #include <linux/gpio_keys.h>
@@ -961,10 +923,6 @@ static struct platform_device *stamp_devices[] __initdata = {
        &bfin_sport1_uart_device,
 #endif
 
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       &bfin_pata_device,
-#endif
-
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
        &bfin_device_gpiokeys,
 #endif
@@ -987,10 +945,6 @@ static int __init stamp_init(void)
 
        platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
        spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
-
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
-#endif
        return 0;
 }
 
index 689b69c98ee44cf95cee6f908b961a8052f636e6..762f754c06ccdcfedae5a8416750cf5d7940195e 100644 (file)
@@ -38,7 +38,6 @@
 #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
 #include <linux/usb/isp1362.h>
 #endif
-#include <linux/ata_platform.h>
 #include <linux/i2c.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
@@ -177,15 +176,15 @@ static struct platform_device bf52x_t350mcqb_device = {
 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
 static struct mtd_partition ezkit_partitions[] = {
        {
-               .name       = "Bootloader",
+               .name       = "bootloader(nor)",
                .size       = 0x40000,
                .offset     = 0,
        }, {
-               .name       = "Kernel",
+               .name       = "linux kernel(nor)",
                .size       = 0x1C0000,
                .offset     = MTDPART_OFS_APPEND,
        }, {
-               .name       = "RootFS",
+               .name       = "file system(nor)",
                .size       = MTDPART_SIZ_FULL,
                .offset     = MTDPART_OFS_APPEND,
        }
@@ -217,12 +216,12 @@ static struct platform_device ezkit_flash_device = {
 #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE)
 static struct mtd_partition partition_info[] = {
        {
-               .name = "Linux Kernel",
+               .name = "linux kernel(nand)",
                .offset = 0,
                .size = 4 * SIZE_1M,
        },
        {
-               .name = "File System",
+               .name = "file system(nand)",
                .offset = MTDPART_OFS_APPEND,
                .size = MTDPART_SIZ_FULL,
        },
@@ -460,12 +459,12 @@ static struct platform_device net2272_bfin_device = {
        || defined(CONFIG_MTD_M25P80_MODULE)
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name = "bootloader",
+               .name = "bootloader(spi)",
                .size = 0x00040000,
                .offset = 0,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name = "linux kernel",
+               .name = "linux kernel(spi)",
                .size = MTDPART_SIZ_FULL,
                .offset = MTDPART_OFS_APPEND,
        }
@@ -825,43 +824,6 @@ static struct platform_device bfin_sport1_uart_device = {
 };
 #endif
 
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-#define PATA_INT       55
-
-static struct pata_platform_info bfin_pata_platform_data = {
-       .ioport_shift = 1,
-       .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED,
-};
-
-static struct resource bfin_pata_resources[] = {
-       {
-               .start = 0x20314020,
-               .end = 0x2031403F,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = 0x2031401C,
-               .end = 0x2031401F,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = PATA_INT,
-               .end = PATA_INT,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device bfin_pata_device = {
-       .name = "pata_platform",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(bfin_pata_resources),
-       .resource = bfin_pata_resources,
-       .dev = {
-               .platform_data = &bfin_pata_platform_data,
-       }
-};
-#endif
-
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 #include <linux/input.h>
 #include <linux/gpio_keys.h>
@@ -996,10 +958,6 @@ static struct platform_device *stamp_devices[] __initdata = {
        &bfin_sport1_uart_device,
 #endif
 
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       &bfin_pata_device,
-#endif
-
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
        &bfin_device_gpiokeys,
 #endif
@@ -1022,10 +980,6 @@ static int __init stamp_init(void)
 
        platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
        spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
-
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
-#endif
        return 0;
 }
 
index fe05cc1ef1746629971057f7a2e2eed5d250112f..c3334cc5bcb7db9f724a4f57d75813fe4ccdae8c 100644 (file)
 #include <linux/linkage.h>
 #include <linux/init.h>
 #include <asm/blackfin.h>
-#include <asm/trace.h>
-
 #ifdef CONFIG_BFIN_KERNEL_CLOCK
 #include <asm/mach-common/clocks.h>
 #include <asm/mach/mem_init.h>
 #endif
 
-.extern ___bss_stop
-.extern ___bss_start
-.extern _bf53x_relocate_l1_mem
-
-#define INITIAL_STACK  0xFFB01000
-
-__INIT
-
-ENTRY(__start)
-       /* R0: argument of command line string, passed from uboot, save it */
-       R7 = R0;
-       /* Enable Cycle Counter and Nesting Of Interrupts */
-#ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES
-       R0 = SYSCFG_SNEN;
-#else
-       R0 = SYSCFG_SNEN | SYSCFG_CCEN;
-#endif
-       SYSCFG = R0;
-       R0 = 0;
-
-       /* Clear Out All the data and pointer Registers */
-       R1 = R0;
-       R2 = R0;
-       R3 = R0;
-       R4 = R0;
-       R5 = R0;
-       R6 = R0;
-
-       P0 = R0;
-       P1 = R0;
-       P2 = R0;
-       P3 = R0;
-       P4 = R0;
-       P5 = R0;
-
-       LC0 = r0;
-       LC1 = r0;
-       L0 = r0;
-       L1 = r0;
-       L2 = r0;
-       L3 = r0;
-
-       /* Clear Out All the DAG Registers */
-       B0 = r0;
-       B1 = r0;
-       B2 = r0;
-       B3 = r0;
-
-       I0 = r0;
-       I1 = r0;
-       I2 = r0;
-       I3 = r0;
-
-       M0 = r0;
-       M1 = r0;
-       M2 = r0;
-       M3 = r0;
-
-       trace_buffer_init(p0,r0);
-       P0 = R1;
-       R0 = R1;
-
-       /* Turn off the icache */
-       p0.l = LO(IMEM_CONTROL);
-       p0.h = HI(IMEM_CONTROL);
-       R1 = [p0];
-       R0 = ~ENICPLB;
-       R0 = R0 & R1;
-
-       /* Anomaly 05000125 */
-#if ANOMALY_05000125
-       CLI R2;
-       SSYNC;
-#endif
-       [p0] = R0;
-       SSYNC;
-#if ANOMALY_05000125
-       STI R2;
-#endif
-
-       /* Turn off the dcache */
-       p0.l = LO(DMEM_CONTROL);
-       p0.h = HI(DMEM_CONTROL);
-       R1 = [p0];
-       R0 = ~ENDCPLB;
-       R0 = R0 & R1;
-
-       /* Anomaly 05000125 */
-#if ANOMALY_05000125
-       CLI R2;
-       SSYNC;
-#endif
-       [p0] = R0;
-       SSYNC;
-#if ANOMALY_05000125
-       STI R2;
-#endif
-
-
-#if defined(CONFIG_BF527)
-       p0.h = hi(EMAC_SYSTAT);
-       p0.l = lo(EMAC_SYSTAT);
-       R0.h = 0xFFFF; /* Clear EMAC Interrupt Status bits */
-       R0.l = 0xFFFF;
-       [P0] = R0;
-       SSYNC;
-#endif
-
-       /* Initialise UART - when booting from u-boot, the UART is not disabled
-        * so if we dont initalize here, our serial console gets hosed */
-       p0.h = hi(UART1_LCR);
-       p0.l = lo(UART1_LCR);
-       r0 = 0x0(Z);
-       w[p0] = r0.L;   /* To enable DLL writes */
-       ssync;
-
-       p0.h = hi(UART1_DLL);
-       p0.l = lo(UART1_DLL);
-       r0 = 0x0(Z);
-       w[p0] = r0.L;
-       ssync;
-
-       p0.h = hi(UART1_DLH);
-       p0.l = lo(UART1_DLH);
-       r0 = 0x00(Z);
-       w[p0] = r0.L;
-       ssync;
-
-       p0.h = hi(UART1_GCTL);
-       p0.l = lo(UART1_GCTL);
-       r0 = 0x0(Z);
-       w[p0] = r0.L;   /* To enable UART clock */
-       ssync;
-
-       /* Initialize stack pointer */
-       sp.l = lo(INITIAL_STACK);
-       sp.h = hi(INITIAL_STACK);
-       fp = sp;
-       usp = sp;
-
-#ifdef CONFIG_EARLY_PRINTK
-       SP += -12;
-       call _init_early_exception_vectors;
-       SP += 12;
-#endif
-
-       /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
-       call _bf53x_relocate_l1_mem;
-#ifdef CONFIG_BFIN_KERNEL_CLOCK
-       call _start_dma_code;
-#endif
-
-       /* Code for initializing Async memory banks */
-
-       p2.h = hi(EBIU_AMBCTL1);
-       p2.l = lo(EBIU_AMBCTL1);
-       r0.h = hi(AMBCTL1VAL);
-       r0.l = lo(AMBCTL1VAL);
-       [p2] = r0;
-       ssync;
-
-       p2.h = hi(EBIU_AMBCTL0);
-       p2.l = lo(EBIU_AMBCTL0);
-       r0.h = hi(AMBCTL0VAL);
-       r0.l = lo(AMBCTL0VAL);
-       [p2] = r0;
-       ssync;
-
-       p2.h = hi(EBIU_AMGCTL);
-       p2.l = lo(EBIU_AMGCTL);
-       r0 = AMGCTLVAL;
-       w[p2] = r0;
-       ssync;
-
-       /* This section keeps the processor in supervisor mode
-        * during kernel boot.  Switches to user mode at end of boot.
-        * See page 3-9 of Hardware Reference manual for documentation.
-        */
-
-       /* EVT15 = _real_start */
-
-       p0.l = lo(EVT15);
-       p0.h = hi(EVT15);
-       p1.l = _real_start;
-       p1.h = _real_start;
-       [p0] = p1;
-       csync;
-
-       p0.l = lo(IMASK);
-       p0.h = hi(IMASK);
-       p1.l = IMASK_IVG15;
-       p1.h = 0x0;
-       [p0] = p1;
-       csync;
-
-       raise 15;
-       p0.l = .LWAIT_HERE;
-       p0.h = .LWAIT_HERE;
-       reti = p0;
-#if ANOMALY_05000281
-       nop; nop; nop;
-#endif
-       rti;
-
-.LWAIT_HERE:
-       jump .LWAIT_HERE;
-ENDPROC(__start)
-
-ENTRY(_real_start)
-       [ -- sp ] = reti;
-       p0.l = lo(WDOG_CTL);
-       p0.h = hi(WDOG_CTL);
-       r0 = 0xAD6(z);
-       w[p0] = r0;     /* watchdog off for now */
-       ssync;
-
-       /* Code update for BSS size == 0
-        * Zero out the bss region.
-        */
-
-       p1.l = ___bss_start;
-       p1.h = ___bss_start;
-       p2.l = ___bss_stop;
-       p2.h = ___bss_stop;
-       r0 = 0;
-       p2 -= p1;
-       lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2;
-.L_clear_bss:
-       B[p1++] = r0;
-
-       /* In case there is a NULL pointer reference
-        * Zero out region before stext
-        */
-
-       p1.l = 0x0;
-       p1.h = 0x0;
-       r0.l = __stext;
-       r0.h = __stext;
-       r0 = r0 >> 1;
-       p2 = r0;
-       r0 = 0;
-       lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2;
-.L_clear_zero:
-       W[p1++] = r0;
-
-       /* pass the uboot arguments to the global value command line */
-       R0 = R7;
-       call _cmdline_init;
-
-       p1.l = __rambase;
-       p1.h = __rambase;
-       r0.l = __sdata;
-       r0.h = __sdata;
-       [p1] = r0;
-
-       p1.l = __ramstart;
-       p1.h = __ramstart;
-       p3.l = ___bss_stop;
-       p3.h = ___bss_stop;
-
-       r1 = p3;
-       [p1] = r1;
-
-       /*
-        * load the current thread pointer and stack
-        */
-       r1.l = _init_thread_union;
-       r1.h = _init_thread_union;
-
-       r2.l = 0x2000;
-       r2.h = 0x0000;
-       r1 = r1 + r2;
-       sp = r1;
-       usp = sp;
-       fp = sp;
-       jump.l _start_kernel;
-ENDPROC(_real_start)
-
-__FINIT
-
 .section .l1.text
 #ifdef CONFIG_BFIN_KERNEL_CLOCK
 ENTRY(_start_dma_code)
@@ -420,13 +138,6 @@ ENTRY(_start_dma_code)
        [P2] = R1;
        SSYNC;
 
-       p0.h = hi(SIC_IWR0);
-       p0.l = lo(SIC_IWR0);
-       r0.l = lo(IWR_ENABLE_ALL);
-       r0.h = hi(IWR_ENABLE_ALL);
-       [p0] = r0;
-       SSYNC;
-
        RTS;
 ENDPROC(_start_dma_code)
 #endif /* CONFIG_BFIN_KERNEL_CLOCK */
index 1fa38979396853a274242e0771f9c9c939091df5..8a2367403d2b5a73e925d630b4af01577405de4a 100644 (file)
@@ -31,7 +31,7 @@
 #include <linux/irq.h>
 #include <asm/blackfin.h>
 
-void program_IAR(void)
+void __init program_IAR(void)
 {
        /* Program the IAR0 Register with the configured priority */
        bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) |
index 4103a97c1a7024ae14e24b15d30b140611a93a7e..c66a68f30239644be1ab52863f667855a670242e 100644 (file)
@@ -38,7 +38,6 @@
 #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
 #include <linux/usb/isp1362.h>
 #endif
-#include <linux/ata_platform.h>
 #include <linux/irq.h>
 
 #include <asm/dma.h>
@@ -141,16 +140,16 @@ static struct platform_device net2272_bfin_device = {
 #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name = "bootloader",
+               .name = "bootloader(spi)",
                .size = 0x00060000,
                .offset = 0,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name = "kernel",
+               .name = "linux kernel(spi)",
                .size = 0x100000,
                .offset = 0x60000
        }, {
-               .name = "file system",
+               .name = "file system(spi)",
                .size = 0x6a0000,
                .offset = 0x00160000,
        }
index 840059241fbecc58b2c4bdc9dbedfc400ff54ae1..308c98dc5aba6a2bf2bdecf0aef4239bbe86a8b0 100644 (file)
@@ -14,6 +14,12 @@ config BFIN533_STAMP
        help
          BF533-STAMP board support.
 
+config BLACKSTAMP
+       bool "BlackStamp"
+       help
+         Support for the BlackStamp board.  Hardware info available at
+         http://blackfin.uclinux.org/gf/project/blackstamp/
+
 config BFIN533_BLUETECHNIX_CM
        bool "Bluetechnix CM-BF533"
        depends on (BF533)
index b7a1a1d79bdad4ff8e2463a9d6f6b757f5f598a5..9afbe72b484f7159a0a1ab5068ee5e54db9baf78 100644 (file)
@@ -7,4 +7,5 @@ obj-$(CONFIG_BFIN533_STAMP)            += stamp.o
 obj-$(CONFIG_BFIN532_IP0X)             += ip0x.o
 obj-$(CONFIG_BFIN533_EZKIT)            += ezkit.o
 obj-$(CONFIG_BFIN533_BLUETECHNIX_CM)   += cm_bf533.o
+obj-$(CONFIG_BLACKSTAMP)               += blackstamp.o
 obj-$(CONFIG_H8606_HVSISTEMAS)         += H8606.o
diff --git a/arch/blackfin/mach-bf533/boards/blackstamp.c b/arch/blackfin/mach-bf533/boards/blackstamp.c
new file mode 100644 (file)
index 0000000..d064ded
--- /dev/null
@@ -0,0 +1,401 @@
+/*
+ * File:         arch/blackfin/mach-bf533/blackstamp.c
+ * Based on:     arch/blackfin/mach-bf533/stamp.c
+ * Author:       Benjamin Matthews <bmat@lle.rochester.edu>
+ *               Aidan Williams <aidan@nicta.com.au>
+ *
+ * Created:      2008
+ * Description:  Board Info File for the BlackStamp
+ *
+ * Copyright 2005 National ICT Australia (NICTA)
+ * Copyright 2004-2008 Analog Devices Inc.
+ *
+ * Enter bugs at http://blackfin.uclinux.org/
+ *
+ * More info about the BlackStamp at:
+ *     http://blackfin.uclinux.org/gf/project/blackstamp/
+ *
+ * Licensed under the GPL-2 or later.
+ */
+
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/physmap.h>
+#include <linux/spi/spi.h>
+#include <linux/spi/flash.h>
+#include <linux/irq.h>
+#include <linux/i2c.h>
+#include <asm/dma.h>
+#include <asm/bfin5xx_spi.h>
+#include <asm/portmux.h>
+#include <asm/dpmc.h>
+
+/*
+ * Name the Board for the /proc/cpuinfo
+ */
+const char bfin_board_name[] = "BlackStamp";
+
+#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
+static struct platform_device rtc_device = {
+       .name = "rtc-bfin",
+       .id   = -1,
+};
+#endif
+
+/*
+ *  Driver needs to know address, irq and flag pin.
+ */
+#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
+static struct resource smc91x_resources[] = {
+       {
+               .name = "smc91x-regs",
+               .start = 0x20300300,
+               .end = 0x20300300 + 16,
+               .flags = IORESOURCE_MEM,
+       }, {
+               .start = IRQ_PF3,
+               .end = IRQ_PF3,
+               .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
+       },
+};
+
+static struct platform_device smc91x_device = {
+       .name = "smc91x",
+       .id = 0,
+       .num_resources = ARRAY_SIZE(smc91x_resources),
+       .resource = smc91x_resources,
+};
+#endif
+
+#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
+static struct mtd_partition bfin_spi_flash_partitions[] = {
+       {
+               .name = "bootloader(spi)",
+               .size = 0x00040000,
+               .offset = 0,
+               .mask_flags = MTD_CAP_ROM
+       }, {
+               .name = "linux kernel(spi)",
+               .size = 0x180000,
+               .offset = MTDPART_OFS_APPEND,
+       }, {
+               .name = "file system(spi)",
+               .size = MTDPART_SIZ_FULL,
+               .offset = MTDPART_OFS_APPEND,
+       }
+};
+
+static struct flash_platform_data bfin_spi_flash_data = {
+       .name = "m25p80",
+       .parts = bfin_spi_flash_partitions,
+       .nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions),
+       .type = "m25p64",
+};
+
+/* SPI flash chip (m25p64) */
+static struct bfin5xx_spi_chip spi_flash_chip_info = {
+       .enable_dma = 0,         /* use dma transfer with this chip*/
+       .bits_per_word = 8,
+};
+#endif
+
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
+       .enable_dma = 1,
+       .bits_per_word = 8,
+};
+#endif
+
+#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
+static struct bfin5xx_spi_chip spidev_chip_info = {
+       .enable_dma = 0,
+       .bits_per_word = 8,
+};
+#endif
+
+static struct spi_board_info bfin_spi_board_info[] __initdata = {
+#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
+       {
+               /* the modalias must be the same as spi device driver name */
+               .modalias = "m25p80", /* Name of spi_driver for this device */
+               .max_speed_hz = 20000000,     /* max spi clock (SCK) speed in HZ */
+               .bus_num = 0, /* Framework bus number */
+               .chip_select = 2, /* Framework chip select. */
+               .platform_data = &bfin_spi_flash_data,
+               .controller_data = &spi_flash_chip_info,
+               .mode = SPI_MODE_3,
+       },
+#endif
+
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
+       {
+               .modalias = "spi_mmc_dummy",
+               .max_speed_hz = 20000000,     /* max spi clock (SCK) speed in HZ */
+               .bus_num = 0,
+               .chip_select = 0,
+               .platform_data = NULL,
+               .controller_data = &spi_mmc_chip_info,
+               .mode = SPI_MODE_3,
+       },
+       {
+               .modalias = "spi_mmc",
+               .max_speed_hz = 20000000,     /* max spi clock (SCK) speed in HZ */
+               .bus_num = 0,
+               .chip_select = CONFIG_SPI_MMC_CS_CHAN,
+               .platform_data = NULL,
+               .controller_data = &spi_mmc_chip_info,
+               .mode = SPI_MODE_3,
+       },
+#endif
+
+#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
+       {
+               .modalias = "spidev",
+               .max_speed_hz = 3125000,     /* max spi clock (SCK) speed in HZ */
+               .bus_num = 0,
+               .chip_select = 7,
+               .controller_data = &spidev_chip_info,
+       },
+#endif
+};
+
+#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
+/* SPI (0) */
+static struct resource bfin_spi0_resource[] = {
+       [0] = {
+               .start = SPI0_REGBASE,
+               .end   = SPI0_REGBASE + 0xFF,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = CH_SPI,
+               .end   = CH_SPI,
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+/* SPI controller data */
+static struct bfin5xx_spi_master bfin_spi0_info = {
+       .num_chipselect = 8,
+       .enable_dma = 1,  /* master has the ability to do dma transfer */
+       .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
+};
+
+static struct platform_device bfin_spi0_device = {
+       .name = "bfin-spi",
+       .id = 0, /* Bus number */
+       .num_resources = ARRAY_SIZE(bfin_spi0_resource),
+       .resource = bfin_spi0_resource,
+       .dev = {
+               .platform_data = &bfin_spi0_info, /* Passed to driver */
+       },
+};
+#endif  /* spi master and devices */
+
+#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
+static struct resource bfin_uart_resources[] = {
+       {
+               .start = 0xFFC00400,
+               .end = 0xFFC004FF,
+               .flags = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device bfin_uart_device = {
+       .name = "bfin-uart",
+       .id = 1,
+       .num_resources = ARRAY_SIZE(bfin_uart_resources),
+       .resource = bfin_uart_resources,
+};
+#endif
+
+#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
+static struct resource bfin_sir_resources[] = {
+#ifdef CONFIG_BFIN_SIR0
+       {
+               .start = 0xFFC00400,
+               .end = 0xFFC004FF,
+               .flags = IORESOURCE_MEM,
+       },
+#endif
+};
+
+static struct platform_device bfin_sir_device = {
+       .name = "bfin_sir",
+       .id = 0,
+       .num_resources = ARRAY_SIZE(bfin_sir_resources),
+       .resource = bfin_sir_resources,
+};
+#endif
+
+#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
+static struct platform_device bfin_sport0_uart_device = {
+       .name = "bfin-sport-uart",
+       .id = 0,
+};
+
+static struct platform_device bfin_sport1_uart_device = {
+       .name = "bfin-sport-uart",
+       .id = 1,
+};
+#endif
+
+#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
+#include <linux/input.h>
+#include <linux/gpio_keys.h>
+
+static struct gpio_keys_button bfin_gpio_keys_table[] = {
+       {BTN_0, GPIO_PF4, 0, "gpio-keys: BTN0"},
+       {BTN_1, GPIO_PF5, 0, "gpio-keys: BTN1"},
+       {BTN_2, GPIO_PF6, 0, "gpio-keys: BTN2"},
+}; /* Mapped to the first three PF Test Points */
+
+static struct gpio_keys_platform_data bfin_gpio_keys_data = {
+       .buttons        = bfin_gpio_keys_table,
+       .nbuttons       = ARRAY_SIZE(bfin_gpio_keys_table),
+};
+
+static struct platform_device bfin_device_gpiokeys = {
+       .name      = "gpio-keys",
+       .dev = {
+               .platform_data = &bfin_gpio_keys_data,
+       },
+};
+#endif
+
+static struct resource bfin_gpios_resources = {
+       .start = 0,
+       .end   = MAX_BLACKFIN_GPIOS - 1,
+       .flags = IORESOURCE_IRQ,
+};
+
+static struct platform_device bfin_gpios_device = {
+       .name = "simple-gpio",
+       .id = -1,
+       .num_resources = 1,
+       .resource = &bfin_gpios_resources,
+};
+
+#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
+#include <linux/i2c-gpio.h>
+
+static struct i2c_gpio_platform_data i2c_gpio_data = {
+       .sda_pin                = 8,
+       .scl_pin                = 9,
+       .sda_is_open_drain      = 0,
+       .scl_is_open_drain      = 0,
+       .udelay                 = 40,
+}; /* This hasn't actually been used these pins
+    * are (currently) free pins on the expansion connector */
+
+static struct platform_device i2c_gpio_device = {
+       .name           = "i2c-gpio",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &i2c_gpio_data,
+       },
+};
+#endif
+
+#ifdef CONFIG_I2C_BOARDINFO
+static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
+};
+#endif
+
+static const unsigned int cclk_vlev_datasheet[] =
+{
+       VRPAIR(VLEV_085, 250000000),
+       VRPAIR(VLEV_090, 376000000),
+       VRPAIR(VLEV_095, 426000000),
+       VRPAIR(VLEV_100, 426000000),
+       VRPAIR(VLEV_105, 476000000),
+       VRPAIR(VLEV_110, 476000000),
+       VRPAIR(VLEV_115, 476000000),
+       VRPAIR(VLEV_120, 600000000),
+       VRPAIR(VLEV_125, 600000000),
+       VRPAIR(VLEV_130, 600000000),
+};
+
+static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
+       .tuple_tab = cclk_vlev_datasheet,
+       .tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
+       .vr_settling_time = 25 /* us */,
+};
+
+static struct platform_device bfin_dpmc = {
+       .name = "bfin dpmc",
+       .dev = {
+               .platform_data = &bfin_dmpc_vreg_data,
+       },
+};
+
+static struct platform_device *stamp_devices[] __initdata = {
+
+       &bfin_dpmc,
+
+#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
+       &rtc_device,
+#endif
+
+#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
+       &smc91x_device,
+#endif
+
+
+#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
+       &bfin_spi0_device,
+#endif
+
+#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
+       &bfin_uart_device,
+#endif
+
+#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
+       &bfin_sir_device,
+#endif
+
+#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
+       &bfin_sport0_uart_device,
+       &bfin_sport1_uart_device,
+#endif
+
+#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
+       &bfin_device_gpiokeys,
+#endif
+
+#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
+       &i2c_gpio_device,
+#endif
+
+       &bfin_gpios_device,
+};
+
+static int __init blackstamp_init(void)
+{
+       int ret;
+
+       printk(KERN_INFO "%s(): registering device resources\n", __func__);
+
+#ifdef CONFIG_I2C_BOARDINFO
+       i2c_register_board_info(0, bfin_i2c_board_info,
+                               ARRAY_SIZE(bfin_i2c_board_info));
+#endif
+
+       ret = platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
+       if (ret < 0)
+               return ret;
+
+#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
+       /* setup BF533_STAMP CPLD to route AMS3 to Ethernet MAC */
+       bfin_write_FIO_DIR(bfin_read_FIO_DIR() | PF0);
+       bfin_write_FIO_FLAG_S(PF0);
+       SSYNC();
+#endif
+
+       spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
+       return 0;
+}
+
+arch_initcall(blackstamp_init);
index ed2b0b8f5dc93f4673accc7013329fa67baaf748..575843f6d9ef37c1c144213a2bcc033af368f021 100644 (file)
@@ -36,7 +36,6 @@
 #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
 #include <linux/usb/isp1362.h>
 #endif
-#include <linux/ata_platform.h>
 #include <linux/irq.h>
 #include <asm/dma.h>
 #include <asm/bfin5xx_spi.h>
@@ -53,16 +52,16 @@ const char bfin_board_name[] = "Bluetechnix CM BF533";
 #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name = "bootloader",
+               .name = "bootloader(spi)",
                .size = 0x00020000,
                .offset = 0,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name = "kernel",
+               .name = "linux kernel(spi)",
                .size = 0xe0000,
                .offset = 0x20000
        }, {
-               .name = "file system",
+               .name = "file system(spi)",
                .size = 0x700000,
                .offset = 0x00100000,
        }
@@ -307,43 +306,6 @@ static struct platform_device isp1362_hcd_device = {
 };
 #endif
 
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-#define PATA_INT       38
-
-static struct pata_platform_info bfin_pata_platform_data = {
-       .ioport_shift = 2,
-       .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED,
-};
-
-static struct resource bfin_pata_resources[] = {
-       {
-               .start = 0x2030C000,
-               .end = 0x2030C01F,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = 0x2030D018,
-               .end = 0x2030D01B,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = PATA_INT,
-               .end = PATA_INT,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device bfin_pata_device = {
-       .name = "pata_platform",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(bfin_pata_resources),
-       .resource = bfin_pata_resources,
-       .dev = {
-               .platform_data = &bfin_pata_platform_data,
-       }
-};
-#endif
-
 static const unsigned int cclk_vlev_datasheet[] =
 {
        VRPAIR(VLEV_085, 250000000),
@@ -403,10 +365,6 @@ static struct platform_device *cm_bf533_devices[] __initdata = {
 #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
        &bfin_spi0_device,
 #endif
-
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       &bfin_pata_device,
-#endif
 };
 
 static int __init cm_bf533_init(void)
@@ -416,10 +374,6 @@ static int __init cm_bf533_init(void)
 #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
        spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
 #endif
-
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
-#endif
        return 0;
 }
 
index 079389cbd8591d89ee96a798251f745a38c7589f..cc2e7eeb1d5a68346050b434e98b1755ec2bc2be 100644 (file)
@@ -37,7 +37,6 @@
 #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
 #include <linux/usb/isp1362.h>
 #endif
-#include <linux/ata_platform.h>
 #include <linux/irq.h>
 #include <asm/dma.h>
 #include <asm/bfin5xx_spi.h>
@@ -90,16 +89,16 @@ static struct platform_device smc91x_device = {
 #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name = "bootloader",
+               .name = "bootloader(spi)",
                .size = 0x00020000,
                .offset = 0,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name = "kernel",
+               .name = "linux kernel(spi)",
                .size = 0xe0000,
                .offset = MTDPART_OFS_APPEND,
        }, {
-               .name = "file system",
+               .name = "file system(spi)",
                .size = MTDPART_SIZ_FULL,
                .offset = MTDPART_OFS_APPEND,
        }
@@ -255,43 +254,6 @@ static struct platform_device bfin_sir_device = {
 };
 #endif
 
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-#define PATA_INT       55
-
-static struct pata_platform_info bfin_pata_platform_data = {
-       .ioport_shift = 1,
-       .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED,
-};
-
-static struct resource bfin_pata_resources[] = {
-       {
-               .start = 0x20314020,
-               .end = 0x2031403F,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = 0x2031401C,
-               .end = 0x2031401F,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = PATA_INT,
-               .end = PATA_INT,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device bfin_pata_device = {
-       .name = "pata_platform",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(bfin_pata_resources),
-       .resource = bfin_pata_resources,
-       .dev = {
-               .platform_data = &bfin_pata_platform_data,
-       }
-};
-#endif
-
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 #include <linux/input.h>
 #include <linux/gpio_keys.h>
@@ -404,10 +366,6 @@ static struct platform_device *ezkit_devices[] __initdata = {
        &bfin_sir_device,
 #endif
 
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       &bfin_pata_device,
-#endif
-
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
        &bfin_device_gpiokeys,
 #endif
@@ -424,10 +382,6 @@ static int __init ezkit_init(void)
        printk(KERN_INFO "%s(): registering device resources\n", __func__);
        platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices));
        spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
-
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
-#endif
        return 0;
 }
 
index 13ae49515f73d3f70d8ffb83746cd1b22046e6a6..050ffca53530eaf8e431cc43eb772d8628b67379 100644 (file)
@@ -38,7 +38,6 @@
 #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
 #include <linux/usb/isp1362.h>
 #endif
-#include <linux/ata_platform.h>
 #include <linux/irq.h>
 #include <linux/i2c.h>
 #include <asm/dma.h>
@@ -114,15 +113,15 @@ static struct platform_device net2272_bfin_device = {
 #if defined(CONFIG_MTD_BFIN_ASYNC) || defined(CONFIG_MTD_BFIN_ASYNC_MODULE)
 static struct mtd_partition stamp_partitions[] = {
        {
-               .name   = "Bootloader",
+               .name   = "bootloader(nor)",
                .size   = 0x40000,
                .offset = 0,
        }, {
-               .name   = "Kernel",
+               .name   = "linux kernel(nor)",
                .size   = 0xE0000,
                .offset = MTDPART_OFS_APPEND,
        }, {
-               .name   = "RootFS",
+               .name   = "file system(nor)",
                .size   = MTDPART_SIZ_FULL,
                .offset = MTDPART_OFS_APPEND,
        }
@@ -164,16 +163,16 @@ static struct platform_device stamp_flash_device = {
 #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name = "bootloader",
+               .name = "bootloader(spi)",
                .size = 0x00040000,
                .offset = 0,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name = "kernel",
+               .name = "linux kernel(spi)",
                .size = 0xe0000,
                .offset = MTDPART_OFS_APPEND,
        }, {
-               .name = "file system",
+               .name = "file system(spi)",
                .size = MTDPART_SIZ_FULL,
                .offset = MTDPART_OFS_APPEND,
        }
@@ -404,43 +403,6 @@ static struct platform_device bfin_sport1_uart_device = {
 };
 #endif
 
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-#define PATA_INT       55
-
-static struct pata_platform_info bfin_pata_platform_data = {
-       .ioport_shift = 1,
-       .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED,
-};
-
-static struct resource bfin_pata_resources[] = {
-       {
-               .start = 0x20314020,
-               .end = 0x2031403F,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = 0x2031401C,
-               .end = 0x2031401F,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = PATA_INT,
-               .end = PATA_INT,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device bfin_pata_device = {
-       .name = "pata_platform",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(bfin_pata_resources),
-       .resource = bfin_pata_resources,
-       .dev = {
-               .platform_data = &bfin_pata_platform_data,
-       }
-};
-#endif
-
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 #include <linux/input.h>
 #include <linux/gpio_keys.h>
@@ -583,10 +545,6 @@ static struct platform_device *stamp_devices[] __initdata = {
        &bfin_sport1_uart_device,
 #endif
 
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       &bfin_pata_device,
-#endif
-
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
        &bfin_device_gpiokeys,
 #endif
@@ -625,10 +583,6 @@ static int __init stamp_init(void)
 #endif
 
        spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
-
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
-#endif
        return 0;
 }
 
index c671e8549b17fd5d95da3fa5117f7fb476c70f7e..d59db86195b6ff50f3b160d5a9b0301f23390979 100644 (file)
 #include <linux/linkage.h>
 #include <linux/init.h>
 #include <asm/blackfin.h>
-#include <asm/trace.h>
 #ifdef CONFIG_BFIN_KERNEL_CLOCK
 #include <asm/mach-common/clocks.h>
 #include <asm/mach/mem_init.h>
 #endif
 
-.extern ___bss_stop
-.extern ___bss_start
-.extern _bf53x_relocate_l1_mem
-
-#define INITIAL_STACK  0xFFB01000
-
-__INIT
-
-ENTRY(__start)
-       /* R0: argument of command line string, passed from uboot, save it */
-       R7 = R0;
-       /* Enable Cycle Counter and Nesting Of Interrupts */
-#ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES
-       R0 = SYSCFG_SNEN;
-#else
-       R0 = SYSCFG_SNEN | SYSCFG_CCEN;
-#endif
-       SYSCFG = R0;
-       R0 = 0;
-
-       /* Clear Out All the data and pointer Registers */
-       R1 = R0;
-       R2 = R0;
-       R3 = R0;
-       R4 = R0;
-       R5 = R0;
-       R6 = R0;
-
-       P0 = R0;
-       P1 = R0;
-       P2 = R0;
-       P3 = R0;
-       P4 = R0;
-       P5 = R0;
-
-       LC0 = r0;
-       LC1 = r0;
-       L0 = r0;
-       L1 = r0;
-       L2 = r0;
-       L3 = r0;
-
-       /* Clear Out All the DAG Registers */
-       B0 = r0;
-       B1 = r0;
-       B2 = r0;
-       B3 = r0;
-
-       I0 = r0;
-       I1 = r0;
-       I2 = r0;
-       I3 = r0;
-
-       M0 = r0;
-       M1 = r0;
-       M2 = r0;
-       M3 = r0;
-
-       trace_buffer_init(p0,r0);
-       P0 = R1;
-       R0 = R1;
-
-       p0.h = hi(FIO_MASKA_C);
-       p0.l = lo(FIO_MASKA_C);
-       r0 = 0xFFFF(Z);
-       w[p0] = r0.L;   /* Disable all interrupts */
-       ssync;
-
-       p0.h = hi(FIO_MASKB_C);
-       p0.l = lo(FIO_MASKB_C);
-       r0 = 0xFFFF(Z);
-       w[p0] = r0.L;   /* Disable all interrupts */
-       ssync;
-
-       /* Turn off the icache */
-       p0.l = LO(IMEM_CONTROL);
-       p0.h = HI(IMEM_CONTROL);
-       R1 = [p0];
-       R0 = ~ENICPLB;
-       R0 = R0 & R1;
-
-       /* Anomaly 05000125 */
-#if ANOMALY_05000125
-       CLI R2;
-       SSYNC;
-#endif
-       [p0] = R0;
-       SSYNC;
-#if ANOMALY_05000125
-       STI R2;
-#endif
-
-       /* Turn off the dcache */
-       p0.l = LO(DMEM_CONTROL);
-       p0.h = HI(DMEM_CONTROL);
-       R1 = [p0];
-       R0 = ~ENDCPLB;
-       R0 = R0 & R1;
-
-       /* Anomaly 05000125 */
-#if ANOMALY_05000125
-       CLI R2;
-       SSYNC;
-#endif
-       [p0] = R0;
-       SSYNC;
-#if ANOMALY_05000125
-       STI R2;
-#endif
-
-       /* Initialise UART - when booting from u-boot, the UART is not disabled
-        * so if we dont initalize here, our serial console gets hosed */
-       p0.h = hi(BFIN_UART_LCR);
-       p0.l = lo(BFIN_UART_LCR);
-       r0 = 0x0(Z);
-       w[p0] = r0.L;   /* To enable DLL writes */
-       ssync;
-
-       p0.h = hi(BFIN_UART_DLL);
-       p0.l = lo(BFIN_UART_DLL);
-       r0 = 0x0(Z);
-       w[p0] = r0.L;
-       ssync;
-
-       p0.h = hi(BFIN_UART_DLH);
-       p0.l = lo(BFIN_UART_DLH);
-       r0 = 0x00(Z);
-       w[p0] = r0.L;
-       ssync;
-
-       p0.h = hi(BFIN_UART_GCTL);
-       p0.l = lo(BFIN_UART_GCTL);
-       r0 = 0x0(Z);
-       w[p0] = r0.L;   /* To enable UART clock */
-       ssync;
-
-       /* Initialize stack pointer */
-       sp.l = lo(INITIAL_STACK);
-       sp.h = hi(INITIAL_STACK);
-       fp = sp;
-       usp = sp;
-
-#ifdef CONFIG_EARLY_PRINTK
-       SP += -12;
-       call _init_early_exception_vectors;
-       SP += 12;
-#endif
-
-       /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
-       call _bf53x_relocate_l1_mem;
-#ifdef CONFIG_BFIN_KERNEL_CLOCK
-       call _start_dma_code;
-#endif
-
-       /* Code for initializing Async memory banks */
-
-       p2.h = hi(EBIU_AMBCTL1);
-       p2.l = lo(EBIU_AMBCTL1);
-       r0.h = hi(AMBCTL1VAL);
-       r0.l = lo(AMBCTL1VAL);
-       [p2] = r0;
-       ssync;
-
-       p2.h = hi(EBIU_AMBCTL0);
-       p2.l = lo(EBIU_AMBCTL0);
-       r0.h = hi(AMBCTL0VAL);
-       r0.l = lo(AMBCTL0VAL);
-       [p2] = r0;
-       ssync;
-
-       p2.h = hi(EBIU_AMGCTL);
-       p2.l = lo(EBIU_AMGCTL);
-       r0 = AMGCTLVAL;
-       w[p2] = r0;
-       ssync;
-
-       /* This section keeps the processor in supervisor mode
-        * during kernel boot.  Switches to user mode at end of boot.
-        * See page 3-9 of Hardware Reference manual for documentation.
-        */
-
-       /* EVT15 = _real_start */
-
-       p0.l = lo(EVT15);
-       p0.h = hi(EVT15);
-       p1.l = _real_start;
-       p1.h = _real_start;
-       [p0] = p1;
-       csync;
-
-       p0.l = lo(IMASK);
-       p0.h = hi(IMASK);
-       p1.l = IMASK_IVG15;
-       p1.h = 0x0;
-       [p0] = p1;
-       csync;
-
-       raise 15;
-       p0.l = .LWAIT_HERE;
-       p0.h = .LWAIT_HERE;
-       reti = p0;
-#if ANOMALY_05000281
-       nop; nop; nop;
-#endif
-       rti;
-
-.LWAIT_HERE:
-       jump .LWAIT_HERE;
-ENDPROC(__start)
-
-ENTRY(_real_start)
-       [ -- sp ] = reti;
-       p0.l = lo(WDOG_CTL);
-       p0.h = hi(WDOG_CTL);
-       r0 = 0xAD6(z);
-       w[p0] = r0;     /* watchdog off for now */
-       ssync;
-
-       /* Code update for BSS size == 0
-        * Zero out the bss region.
-        */
-
-       p1.l = ___bss_start;
-       p1.h = ___bss_start;
-       p2.l = ___bss_stop;
-       p2.h = ___bss_stop;
-       r0 = 0;
-       p2 -= p1;
-       lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2;
-.L_clear_bss:
-       B[p1++] = r0;
-
-       /* In case there is a NULL pointer reference
-        * Zero out region before stext
-        */
-
-       p1.l = 0x0;
-       p1.h = 0x0;
-       r0.l = __stext;
-       r0.h = __stext;
-       r0 = r0 >> 1;
-       p2 = r0;
-       r0 = 0;
-       lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2;
-.L_clear_zero:
-       W[p1++] = r0;
-
-       /* pass the uboot arguments to the global value command line */
-       R0 = R7;
-       call _cmdline_init;
-
-       p1.l = __rambase;
-       p1.h = __rambase;
-       r0.l = __sdata;
-       r0.h = __sdata;
-       [p1] = r0;
-
-       p1.l = __ramstart;
-       p1.h = __ramstart;
-       p3.l = ___bss_stop;
-       p3.h = ___bss_stop;
-
-       r1 = p3;
-       [p1] = r1;
-
-       /*
-        * load the current thread pointer and stack
-        */
-       r1.l = _init_thread_union;
-       r1.h = _init_thread_union;
-
-       r2.l = 0x2000;
-       r2.h = 0x0000;
-       r1 = r1 + r2;
-       sp = r1;
-       usp = sp;
-       fp = sp;
-       jump.l _start_kernel;
-ENDPROC(_real_start)
-
-__FINIT
-
 .section .l1.text
 #ifdef CONFIG_BFIN_KERNEL_CLOCK
 ENTRY(_start_dma_code)
@@ -412,13 +129,6 @@ ENTRY(_start_dma_code)
        [P2] = R1;
        SSYNC;
 
-       p0.h = hi(SIC_IWR);
-       p0.l = lo(SIC_IWR);
-       r0.l = lo(IWR_ENABLE_ALL);
-       r0.h = hi(IWR_ENABLE_ALL);
-       [p0] = r0;
-       SSYNC;
-
        RTS;
 ENDPROC(_start_dma_code)
 #endif /* CONFIG_BFIN_KERNEL_CLOCK */
index 7d79e0f9503deb989f33a1df82e3906c02b76a21..f51994b7a2b9c06ce4179b57ac01ad7b39f34471 100644 (file)
@@ -31,7 +31,7 @@
 #include <linux/irq.h>
 #include <asm/blackfin.h>
 
-void program_IAR(void)
+void __init program_IAR(void)
 {
        /* Program the IAR0 Register with the configured priority */
        bfin_write_SIC_IAR0(((CONFIG_PLLWAKE_ERROR - 7) << PLLWAKE_ERROR_POS) |
index 7e789dbef036648b25f63b6b9b41ff426286c14a..42a57b0acb292d4046b674afffe720f2d6f94cda 100644 (file)
@@ -15,6 +15,12 @@ config BFIN537_BLUETECHNIX_CM
        help
          CM-BF537 support for EVAL- and DEV-Board.
 
+config BFIN537_BLUETECHNIX_TCM
+       bool "Bluetechnix TCM-BF537"
+       depends on (BF537)
+       help
+         TCM-BF537 support for EVAL- and DEV-Board.
+
 config PNAV10
        bool "PNAV board"
        depends on (BF537)
index c94f7a5b82117480a6384856981603bf8ce28d19..7168cc14afd82a7011821649fdd48283d24266b2 100644 (file)
@@ -5,5 +5,6 @@
 obj-$(CONFIG_GENERIC_BF537_BOARD)      += generic_board.o
 obj-$(CONFIG_BFIN537_STAMP)            += stamp.o
 obj-$(CONFIG_BFIN537_BLUETECHNIX_CM)   += cm_bf537.o
+obj-$(CONFIG_BFIN537_BLUETECHNIX_TCM)  += tcm_bf537.o
 obj-$(CONFIG_PNAV10)                   += pnav10.o
 obj-$(CONFIG_CAMSIG_MINOTAUR)          += minotaur.o
index 73f2142875e241d5257c92b860179b33b3207050..dde14720b0ea5d8f4dc4a6a3c81472a997d1e637 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/platform_device.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
+#include <linux/mtd/physmap.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/flash.h>
 #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
@@ -56,16 +57,16 @@ const char bfin_board_name[] = "Bluetechnix CM BF537";
 #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name = "bootloader",
+               .name = "bootloader(spi)",
                .size = 0x00020000,
                .offset = 0,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name = "kernel",
+               .name = "linux kernel(spi)",
                .size = 0xe0000,
                .offset = 0x20000
        }, {
-               .name = "file system",
+               .name = "file system(spi)",
                .size = 0x700000,
                .offset = 0x00100000,
        }
@@ -307,6 +308,55 @@ static struct platform_device net2272_bfin_device = {
 };
 #endif
 
+#if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE)
+static struct mtd_partition cm_partitions[] = {
+       {
+               .name   = "bootloader(nor)",
+               .size   = 0x40000,
+               .offset = 0,
+       }, {
+               .name   = "linux kernel(nor)",
+               .size   = 0xE0000,
+               .offset = MTDPART_OFS_APPEND,
+       }, {
+               .name   = "file system(nor)",
+               .size   = MTDPART_SIZ_FULL,
+               .offset = MTDPART_OFS_APPEND,
+       }
+};
+
+static struct physmap_flash_data cm_flash_data = {
+       .width    = 2,
+       .parts    = cm_partitions,
+       .nr_parts = ARRAY_SIZE(cm_partitions),
+};
+
+static unsigned cm_flash_gpios[] = { GPIO_PF4 };
+
+static struct resource cm_flash_resource[] = {
+       {
+               .name  = "cfi_probe",
+               .start = 0x20000000,
+               .end   = 0x201fffff,
+               .flags = IORESOURCE_MEM,
+       }, {
+               .start = (unsigned long)cm_flash_gpios,
+               .end   = ARRAY_SIZE(cm_flash_gpios),
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+static struct platform_device cm_flash_device = {
+       .name          = "gpio-addr-flash",
+       .id            = 0,
+       .dev = {
+               .platform_data = &cm_flash_data,
+       },
+       .num_resources = ARRAY_SIZE(cm_flash_resource),
+       .resource      = cm_flash_resource,
+};
+#endif
+
 #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
 static struct resource bfin_uart_resources[] = {
        {
@@ -395,7 +445,7 @@ static struct platform_device bfin_mac_device = {
 #endif
 
 #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-#define PATA_INT       64
+#define PATA_INT       IRQ_PF14
 
 static struct pata_platform_info bfin_pata_platform_data = {
        .ioport_shift = 2,
@@ -510,6 +560,10 @@ static struct platform_device *cm_bf537_devices[] __initdata = {
 #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
        &bfin_pata_device,
 #endif
+
+#if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE)
+       &cm_flash_device,
+#endif
 };
 
 static int __init cm_bf537_init(void)
index 01b63e2ec18f81030420945b4a8867a42b098b6c..78a13d5bfd555b6b7afab4f01d13b68cb7a5bb61 100644 (file)
@@ -38,7 +38,6 @@
 #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
 #include <linux/usb/isp1362.h>
 #endif
-#include <linux/ata_platform.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
 #include <linux/usb/sl811.h>
@@ -307,16 +306,16 @@ static struct platform_device net2272_bfin_device = {
        || defined(CONFIG_MTD_M25P80_MODULE)
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name = "bootloader",
+               .name = "bootloader(spi)",
                .size = 0x00020000,
                .offset = 0,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name = "kernel",
+               .name = "linux kernel(spi)",
                .size = 0xe0000,
                .offset = 0x20000
        }, {
-               .name = "file system",
+               .name = "file system(spi)",
                .size = 0x700000,
                .offset = 0x00100000,
        }
@@ -619,43 +618,6 @@ static struct platform_device bfin_sport1_uart_device = {
 };
 #endif
 
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-#define PATA_INT       55
-
-static struct pata_platform_info bfin_pata_platform_data = {
-       .ioport_shift = 1,
-       .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED,
-};
-
-static struct resource bfin_pata_resources[] = {
-       {
-               .start = 0x20314020,
-               .end = 0x2031403F,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = 0x2031401C,
-               .end = 0x2031401F,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = PATA_INT,
-               .end = PATA_INT,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device bfin_pata_device = {
-       .name = "pata_platform",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(bfin_pata_resources),
-       .resource = bfin_pata_resources,
-       .dev = {
-               .platform_data = &bfin_pata_platform_data,
-       }
-};
-#endif
-
 static struct platform_device *stamp_devices[] __initdata = {
 #if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE)
        &bfin_pcmcia_cf_device,
@@ -717,10 +679,6 @@ static struct platform_device *stamp_devices[] __initdata = {
        &bfin_sport0_uart_device,
        &bfin_sport1_uart_device,
 #endif
-
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       &bfin_pata_device,
-#endif
 };
 
 static int __init stamp_init(void)
@@ -732,9 +690,6 @@ static int __init stamp_init(void)
                                ARRAY_SIZE(bfin_spi_board_info));
 #endif
 
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
-#endif
        return 0;
 }
 
index 18ddf7a520052ea7a57e506ffd0fcde9d98d1c64..48c4cd2d1be69433b7001610cfe03d12a9f02d75 100644 (file)
@@ -100,16 +100,16 @@ static struct platform_device net2272_bfin_device = {
 
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name       = "uboot",
+               .name       = "bootloader(spi)",
                .size       = PSIZE_UBOOT,
                .offset     = 0x000000,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name       = "initramfs",
+               .name       = "initramfs(spi)",
                .size       = PSIZE_INITRAMFS,
                .offset     = PSIZE_UBOOT
        }, {
-               .name       = "opt",
+               .name       = "opt(spi)",
                .size       = FLASH_SIZE - (PSIZE_UBOOT + PSIZE_INITRAMFS),
                .offset     = PSIZE_UBOOT + PSIZE_INITRAMFS,
        }
index 51c3bab14a69facc7336835375699d55e6eedc20..f9174c11cbd471a1813efdef763583aa44405cea 100644 (file)
@@ -231,16 +231,16 @@ static struct platform_device net2272_bfin_device = {
        || defined(CONFIG_MTD_M25P80_MODULE)
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name = "bootloader",
+               .name = "bootloader(spi)",
                .size = 0x00020000,
                .offset = 0,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name = "kernel",
+               .name = "linux kernel(spi)",
                .size = 0xe0000,
                .offset = 0x20000
        }, {
-               .name = "file system",
+               .name = "file system(spi)",
                .size = 0x700000,
                .offset = 0x00100000,
        }
index 6dbc76fb080b55f8428742ea2fd74de4cb5e24e2..e93964fdb4323d483ea1167cd12123ca24f94ee4 100644 (file)
@@ -364,11 +364,11 @@ const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL };
 
 static struct mtd_partition bfin_plat_nand_partitions[] = {
        {
-               .name   = "linux kernel",
+               .name   = "linux kernel(nand)",
                .size   = 0x400000,
                .offset = 0,
        }, {
-               .name   = "file system",
+               .name   = "file system(nand)",
                .size   = MTDPART_SIZ_FULL,
                .offset = MTDPART_OFS_APPEND,
        },
@@ -439,19 +439,19 @@ static void bfin_plat_nand_init(void) {}
 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
 static struct mtd_partition stamp_partitions[] = {
        {
-               .name       = "Bootloader",
+               .name       = "bootloader(nor)",
                .size       = 0x40000,
                .offset     = 0,
        }, {
-               .name       = "Kernel",
+               .name       = "linux kernel(nor)",
                .size       = 0xE0000,
                .offset     = MTDPART_OFS_APPEND,
        }, {
-               .name       = "RootFS",
+               .name       = "file system(nor)",
                .size       = 0x400000 - 0x40000 - 0xE0000 - 0x10000,
                .offset     = MTDPART_OFS_APPEND,
        }, {
-               .name       = "MAC Address",
+               .name       = "MAC Address(nor)",
                .size       = MTDPART_SIZ_FULL,
                .offset     = 0x3F0000,
                .mask_flags = MTD_WRITEABLE,
@@ -485,16 +485,16 @@ static struct platform_device stamp_flash_device = {
        || defined(CONFIG_MTD_M25P80_MODULE)
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name = "bootloader",
+               .name = "bootloader(spi)",
                .size = 0x00040000,
                .offset = 0,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name = "kernel",
+               .name = "linux kernel(spi)",
                .size = 0xe0000,
                .offset = MTDPART_OFS_APPEND,
        }, {
-               .name = "file system",
+               .name = "file system(spi)",
                .size = MTDPART_SIZ_FULL,
                .offset = MTDPART_OFS_APPEND,
        }
diff --git a/arch/blackfin/mach-bf537/boards/tcm_bf537.c b/arch/blackfin/mach-bf537/boards/tcm_bf537.c
new file mode 100644 (file)
index 0000000..d5ff705
--- /dev/null
@@ -0,0 +1,590 @@
+/*
+ * File:         arch/blackfin/mach-bf537/boards/tcm_bf537.c
+ * Based on:     arch/blackfin/mach-bf533/boards/cm_bf537.c
+ * Author:       Aidan Williams <aidan@nicta.com.au>
+ *
+ * Created:      2005
+ * Description:  Board description file
+ *
+ * Modified:
+ *               Copyright 2005 National ICT Australia (NICTA)
+ *               Copyright 2004-2006 Analog Devices Inc.
+ *
+ * Bugs:         Enter bugs at http://blackfin.uclinux.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.
+ *
+ * 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, see the file COPYING, or write
+ * to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <linux/device.h>
+#include <linux/etherdevice.h>
+#include <linux/platform_device.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/physmap.h>
+#include <linux/spi/spi.h>
+#include <linux/spi/flash.h>
+#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
+#include <linux/usb/isp1362.h>
+#endif
+#include <linux/ata_platform.h>
+#include <linux/irq.h>
+#include <asm/dma.h>
+#include <asm/bfin5xx_spi.h>
+#include <asm/portmux.h>
+#include <asm/dpmc.h>
+
+/*
+ * Name the Board for the /proc/cpuinfo
+ */
+const char bfin_board_name[] = "Bluetechnix TCM BF537";
+
+#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
+/* all SPI peripherals info goes here */
+
+#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
+static struct mtd_partition bfin_spi_flash_partitions[] = {
+       {
+               .name = "bootloader(spi)",
+               .size = 0x00020000,
+               .offset = 0,
+               .mask_flags = MTD_CAP_ROM
+       }, {
+               .name = "linux kernel(spi)",
+               .size = 0xe0000,
+               .offset = 0x20000
+       }, {
+               .name = "file system(spi)",
+               .size = 0x700000,
+               .offset = 0x00100000,
+       }
+};
+
+static struct flash_platform_data bfin_spi_flash_data = {
+       .name = "m25p80",
+       .parts = bfin_spi_flash_partitions,
+       .nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions),
+       .type = "m25p64",
+};
+
+/* SPI flash chip (m25p64) */
+static struct bfin5xx_spi_chip spi_flash_chip_info = {
+       .enable_dma = 0,         /* use dma transfer with this chip*/
+       .bits_per_word = 8,
+};
+#endif
+
+#if defined(CONFIG_SPI_ADC_BF533) || defined(CONFIG_SPI_ADC_BF533_MODULE)
+/* SPI ADC chip */
+static struct bfin5xx_spi_chip spi_adc_chip_info = {
+       .enable_dma = 1,         /* use dma transfer with this chip*/
+       .bits_per_word = 16,
+};
+#endif
+
+#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
+static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
+       .enable_dma = 0,
+       .bits_per_word = 16,
+};
+#endif
+
+#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
+static struct bfin5xx_spi_chip ad9960_spi_chip_info = {
+       .enable_dma = 0,
+       .bits_per_word = 16,
+};
+#endif
+
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
+       .enable_dma = 1,
+       .bits_per_word = 8,
+};
+#endif
+
+static struct spi_board_info bfin_spi_board_info[] __initdata = {
+#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
+       {
+               /* the modalias must be the same as spi device driver name */
+               .modalias = "m25p80", /* Name of spi_driver for this device */
+               .max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */
+               .bus_num = 0, /* Framework bus number */
+               .chip_select = 1, /* Framework chip select. On STAMP537 it is SPISSEL1*/
+               .platform_data = &bfin_spi_flash_data,
+               .controller_data = &spi_flash_chip_info,
+               .mode = SPI_MODE_3,
+       },
+#endif
+
+#if defined(CONFIG_SPI_ADC_BF533) || defined(CONFIG_SPI_ADC_BF533_MODULE)
+       {
+               .modalias = "bfin_spi_adc", /* Name of spi_driver for this device */
+               .max_speed_hz = 6250000,     /* max spi clock (SCK) speed in HZ */
+               .bus_num = 0, /* Framework bus number */
+               .chip_select = 1, /* Framework chip select. */
+               .platform_data = NULL, /* No spi_driver specific config */
+               .controller_data = &spi_adc_chip_info,
+       },
+#endif
+
+#if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
+       {
+               .modalias = "ad1836-spi",
+               .max_speed_hz = 3125000,     /* max spi clock (SCK) speed in HZ */
+               .bus_num = 0,
+               .chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
+               .controller_data = &ad1836_spi_chip_info,
+       },
+#endif
+
+#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
+       {
+               .modalias = "ad9960-spi",
+               .max_speed_hz = 10000000,     /* max spi clock (SCK) speed in HZ */
+               .bus_num = 0,
+               .chip_select = 1,
+               .controller_data = &ad9960_spi_chip_info,
+       },
+#endif
+
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
+       {
+               .modalias = "spi_mmc_dummy",
+               .max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */
+               .bus_num = 0,
+               .chip_select = 7,
+               .platform_data = NULL,
+               .controller_data = &spi_mmc_chip_info,
+               .mode = SPI_MODE_3,
+       },
+       {
+               .modalias = "spi_mmc",
+               .max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */
+               .bus_num = 0,
+               .chip_select = CONFIG_SPI_MMC_CS_CHAN,
+               .platform_data = NULL,
+               .controller_data = &spi_mmc_chip_info,
+               .mode = SPI_MODE_3,
+       },
+#endif
+};
+
+/* SPI (0) */
+static struct resource bfin_spi0_resource[] = {
+       [0] = {
+               .start = SPI0_REGBASE,
+               .end   = SPI0_REGBASE + 0xFF,
+               .flags = IORESOURCE_MEM,
+               },
+       [1] = {
+               .start = CH_SPI,
+               .end   = CH_SPI,
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+/* SPI controller data */
+static struct bfin5xx_spi_master bfin_spi0_info = {
+       .num_chipselect = 8,
+       .enable_dma = 1,  /* master has the ability to do dma transfer */
+       .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
+};
+
+static struct platform_device bfin_spi0_device = {
+       .name = "bfin-spi",
+       .id = 0, /* Bus number */
+       .num_resources = ARRAY_SIZE(bfin_spi0_resource),
+       .resource = bfin_spi0_resource,
+       .dev = {
+               .platform_data = &bfin_spi0_info, /* Passed to driver */
+       },
+};
+#endif  /* spi master and devices */
+
+#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
+static struct platform_device rtc_device = {
+       .name = "rtc-bfin",
+       .id   = -1,
+};
+#endif
+
+#if defined(CONFIG_FB_HITACHI_TX09) || defined(CONFIG_FB_HITACHI_TX09_MODULE)
+static struct platform_device hitachi_fb_device = {
+       .name = "hitachi-tx09",
+};
+#endif
+
+#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
+static struct resource smc91x_resources[] = {
+       {
+               .start = 0x20200300,
+               .end = 0x20200300 + 16,
+               .flags = IORESOURCE_MEM,
+       }, {
+               .start = IRQ_PF14,
+               .end = IRQ_PF14,
+               .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
+               },
+};
+
+static struct platform_device smc91x_device = {
+       .name = "smc91x",
+       .id = 0,
+       .num_resources = ARRAY_SIZE(smc91x_resources),
+       .resource = smc91x_resources,
+};
+#endif
+
+#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
+static struct resource isp1362_hcd_resources[] = {
+       {
+               .start = 0x20308000,
+               .end = 0x20308000,
+               .flags = IORESOURCE_MEM,
+       }, {
+               .start = 0x20308004,
+               .end = 0x20308004,
+               .flags = IORESOURCE_MEM,
+       }, {
+               .start = IRQ_PG15,
+               .end = IRQ_PG15,
+               .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
+       },
+};
+
+static struct isp1362_platform_data isp1362_priv = {
+       .sel15Kres = 1,
+       .clknotstop = 0,
+       .oc_enable = 0,
+       .int_act_high = 0,
+       .int_edge_triggered = 0,
+       .remote_wakeup_connected = 0,
+       .no_power_switching = 1,
+       .power_switching_mode = 0,
+};
+
+static struct platform_device isp1362_hcd_device = {
+       .name = "isp1362-hcd",
+       .id = 0,
+       .dev = {
+               .platform_data = &isp1362_priv,
+       },
+       .num_resources = ARRAY_SIZE(isp1362_hcd_resources),
+       .resource = isp1362_hcd_resources,
+};
+#endif
+
+#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
+static struct resource net2272_bfin_resources[] = {
+       {
+               .start = 0x20200000,
+               .end = 0x20200000 + 0x100,
+               .flags = IORESOURCE_MEM,
+       }, {
+               .start = IRQ_PH14,
+               .end = IRQ_PH14,
+               .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
+       },
+};
+
+static struct platform_device net2272_bfin_device = {
+       .name = "net2272",
+       .id = -1,
+       .num_resources = ARRAY_SIZE(net2272_bfin_resources),
+       .resource = net2272_bfin_resources,
+};
+#endif
+
+#if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE)
+static struct mtd_partition cm_partitions[] = {
+       {
+               .name   = "bootloader(nor)",
+               .size   = 0x40000,
+               .offset = 0,
+       }, {
+               .name   = "linux kernel(nor)",
+               .size   = 0xE0000,
+               .offset = MTDPART_OFS_APPEND,
+       }, {
+               .name   = "file system(nor)",
+               .size   = MTDPART_SIZ_FULL,
+               .offset = MTDPART_OFS_APPEND,
+       }
+};
+
+static struct physmap_flash_data cm_flash_data = {
+       .width    = 2,
+       .parts    = cm_partitions,
+       .nr_parts = ARRAY_SIZE(cm_partitions),
+};
+
+static unsigned cm_flash_gpios[] = { GPIO_PF4, GPIO_PF5 };
+
+static struct resource cm_flash_resource[] = {
+       {
+               .name  = "cfi_probe",
+               .start = 0x20000000,
+               .end   = 0x201fffff,
+               .flags = IORESOURCE_MEM,
+       }, {
+               .start = (unsigned long)cm_flash_gpios,
+               .end   = ARRAY_SIZE(cm_flash_gpios),
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+static struct platform_device cm_flash_device = {
+       .name          = "gpio-addr-flash",
+       .id            = 0,
+       .dev = {
+               .platform_data = &cm_flash_data,
+       },
+       .num_resources = ARRAY_SIZE(cm_flash_resource),
+       .resource      = cm_flash_resource,
+};
+#endif
+
+#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
+static struct resource bfin_uart_resources[] = {
+       {
+               .start = 0xFFC00400,
+               .end = 0xFFC004FF,
+               .flags = IORESOURCE_MEM,
+       }, {
+               .start = 0xFFC02000,
+               .end = 0xFFC020FF,
+               .flags = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device bfin_uart_device = {
+       .name = "bfin-uart",
+       .id = 1,
+       .num_resources = ARRAY_SIZE(bfin_uart_resources),
+       .resource = bfin_uart_resources,
+};
+#endif
+
+#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
+static struct resource bfin_sir_resources[] = {
+#ifdef CONFIG_BFIN_SIR0
+       {
+               .start = 0xFFC00400,
+               .end = 0xFFC004FF,
+               .flags = IORESOURCE_MEM,
+       },
+#endif
+#ifdef CONFIG_BFIN_SIR1
+       {
+               .start = 0xFFC02000,
+               .end = 0xFFC020FF,
+               .flags = IORESOURCE_MEM,
+       },
+#endif
+};
+
+static struct platform_device bfin_sir_device = {
+       .name = "bfin_sir",
+       .id = 0,
+       .num_resources = ARRAY_SIZE(bfin_sir_resources),
+       .resource = bfin_sir_resources,
+};
+#endif
+
+#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE)
+static struct resource bfin_twi0_resource[] = {
+       [0] = {
+               .start = TWI0_REGBASE,
+               .end   = TWI0_REGBASE,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_TWI,
+               .end   = IRQ_TWI,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device i2c_bfin_twi_device = {
+       .name = "i2c-bfin-twi",
+       .id = 0,
+       .num_resources = ARRAY_SIZE(bfin_twi0_resource),
+       .resource = bfin_twi0_resource,
+};
+#endif
+
+#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
+static struct platform_device bfin_sport0_uart_device = {
+       .name = "bfin-sport-uart",
+       .id = 0,
+};
+
+static struct platform_device bfin_sport1_uart_device = {
+       .name = "bfin-sport-uart",
+       .id = 1,
+};
+#endif
+
+#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+static struct platform_device bfin_mac_device = {
+       .name = "bfin_mac",
+};
+#endif
+
+#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
+#define PATA_INT       IRQ_PF14
+
+static struct pata_platform_info bfin_pata_platform_data = {
+       .ioport_shift = 2,
+       .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED,
+};
+
+static struct resource bfin_pata_resources[] = {
+       {
+               .start = 0x2030C000,
+               .end = 0x2030C01F,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .start = 0x2030D018,
+               .end = 0x2030D01B,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .start = PATA_INT,
+               .end = PATA_INT,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device bfin_pata_device = {
+       .name = "pata_platform",
+       .id = -1,
+       .num_resources = ARRAY_SIZE(bfin_pata_resources),
+       .resource = bfin_pata_resources,
+       .dev = {
+               .platform_data = &bfin_pata_platform_data,
+       }
+};
+#endif
+
+static const unsigned int cclk_vlev_datasheet[] =
+{
+       VRPAIR(VLEV_085, 250000000),
+       VRPAIR(VLEV_090, 376000000),
+       VRPAIR(VLEV_095, 426000000),
+       VRPAIR(VLEV_100, 426000000),
+       VRPAIR(VLEV_105, 476000000),
+       VRPAIR(VLEV_110, 476000000),
+       VRPAIR(VLEV_115, 476000000),
+       VRPAIR(VLEV_120, 500000000),
+       VRPAIR(VLEV_125, 533000000),
+       VRPAIR(VLEV_130, 600000000),
+};
+
+static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
+       .tuple_tab = cclk_vlev_datasheet,
+       .tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
+       .vr_settling_time = 25 /* us */,
+};
+
+static struct platform_device bfin_dpmc = {
+       .name = "bfin dpmc",
+       .dev = {
+               .platform_data = &bfin_dmpc_vreg_data,
+       },
+};
+
+static struct platform_device *cm_bf537_devices[] __initdata = {
+
+       &bfin_dpmc,
+
+#if defined(CONFIG_FB_HITACHI_TX09) || defined(CONFIG_FB_HITACHI_TX09_MODULE)
+       &hitachi_fb_device,
+#endif
+
+#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
+       &rtc_device,
+#endif
+
+#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
+       &bfin_uart_device,
+#endif
+
+#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
+       &bfin_sir_device,
+#endif
+
+#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE)
+       &i2c_bfin_twi_device,
+#endif
+
+#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
+       &bfin_sport0_uart_device,
+       &bfin_sport1_uart_device,
+#endif
+
+#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
+       &isp1362_hcd_device,
+#endif
+
+#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
+       &smc91x_device,
+#endif
+
+#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+       &bfin_mac_device,
+#endif
+
+#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
+       &net2272_bfin_device,
+#endif
+
+#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
+       &bfin_spi0_device,
+#endif
+
+#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
+       &bfin_pata_device,
+#endif
+
+#if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE)
+       &cm_flash_device,
+#endif
+};
+
+static int __init cm_bf537_init(void)
+{
+       printk(KERN_INFO "%s(): registering device resources\n", __func__);
+       platform_add_devices(cm_bf537_devices, ARRAY_SIZE(cm_bf537_devices));
+#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
+       spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
+#endif
+
+#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
+       irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
+#endif
+       return 0;
+}
+
+arch_initcall(cm_bf537_init);
+
+void bfin_get_ether_addr(char *addr)
+{
+       random_ether_addr(addr);
+       printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
+}
+EXPORT_SYMBOL(bfin_get_ether_addr);
index 6b019eaee0b61e7847043ebee2503bae4493900f..64e0287ab2661adfd8b8668cca8e41c134d34cb2 100644 (file)
 #include <linux/linkage.h>
 #include <linux/init.h>
 #include <asm/blackfin.h>
-#include <asm/trace.h>
-
 #ifdef CONFIG_BFIN_KERNEL_CLOCK
 #include <asm/mach-common/clocks.h>
 #include <asm/mach/mem_init.h>
 #endif
 
-.extern ___bss_stop
-.extern ___bss_start
-.extern _bf53x_relocate_l1_mem
-
-#define INITIAL_STACK  0xFFB01000
-
-__INIT
-
-ENTRY(__start)
-       /* R0: argument of command line string, passed from uboot, save it */
-       R7 = R0;
-       /* Enable Cycle Counter and Nesting Of Interrupts */
-#ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES
-       R0 = SYSCFG_SNEN;
-#else
-       R0 = SYSCFG_SNEN | SYSCFG_CCEN;
-#endif
-       SYSCFG = R0;
-       R0 = 0;
-
-       /* Clear Out All the data and pointer Registers */
-       R1 = R0;
-       R2 = R0;
-       R3 = R0;
-       R4 = R0;
-       R5 = R0;
-       R6 = R0;
-
-       P0 = R0;
-       P1 = R0;
-       P2 = R0;
-       P3 = R0;
-       P4 = R0;
-       P5 = R0;
-
-       LC0 = r0;
-       LC1 = r0;
-       L0 = r0;
-       L1 = r0;
-       L2 = r0;
-       L3 = r0;
-
-       /* Clear Out All the DAG Registers */
-       B0 = r0;
-       B1 = r0;
-       B2 = r0;
-       B3 = r0;
-
-       I0 = r0;
-       I1 = r0;
-       I2 = r0;
-       I3 = r0;
-
-       M0 = r0;
-       M1 = r0;
-       M2 = r0;
-       M3 = r0;
-
-       trace_buffer_init(p0,r0);
-       P0 = R1;
-       R0 = R1;
-
-       /* Turn off the icache */
-       p0.l = LO(IMEM_CONTROL);
-       p0.h = HI(IMEM_CONTROL);
-       R1 = [p0];
-       R0 = ~ENICPLB;
-       R0 = R0 & R1;
-
-       /* Anomaly 05000125 */
-#if ANOMALY_05000125
-       CLI R2;
-       SSYNC;
-#endif
-       [p0] = R0;
-       SSYNC;
-#if ANOMALY_05000125
-       STI R2;
-#endif
-
-       /* Turn off the dcache */
-       p0.l = LO(DMEM_CONTROL);
-       p0.h = HI(DMEM_CONTROL);
-       R1 = [p0];
-       R0 = ~ENDCPLB;
-       R0 = R0 & R1;
-
-       /* Anomaly 05000125 */
-#if ANOMALY_05000125
-       CLI R2;
-       SSYNC;
-#endif
-       [p0] = R0;
-       SSYNC;
-#if ANOMALY_05000125
-       STI R2;
-#endif
-
-       /* Initialise General-Purpose I/O Modules on BF537 */
-       /* Rev 0.0 Anomaly 05000212 - PORTx_FER,
-        * PORT_MUX Registers Do Not accept "writes" correctly:
-        */
-       p0.h = hi(BFIN_PORT_MUX);
-       p0.l = lo(BFIN_PORT_MUX);
-#if ANOMALY_05000212
-       R0.L = W[P0]; /* Read */
-       SSYNC;
-#endif
-       R0 = (PGDE_UART | PFTE_UART)(Z);
-#if ANOMALY_05000212
-       W[P0] = R0.L; /* Write */
-       SSYNC;
-#endif
-       W[P0] = R0.L; /* Enable both UARTS */
-       SSYNC;
-
-       p0.h = hi(PORTF_FER);
-       p0.l = lo(PORTF_FER);
-#if ANOMALY_05000212
-       R0.L = W[P0]; /* Read */
-       SSYNC;
-#endif
-       R0 = 0x000F(Z);
-#if ANOMALY_05000212
-       W[P0] = R0.L; /* Write */
-       SSYNC;
-#endif
-       /* Enable peripheral function of PORTF for UART0 and UART1 */
-       W[P0] = R0.L;
-       SSYNC;
-
-#if !defined(CONFIG_BF534)
-       p0.h = hi(EMAC_SYSTAT);
-       p0.l = lo(EMAC_SYSTAT);
-       R0.h = 0xFFFF; /* Clear EMAC Interrupt Status bits */
-       R0.l = 0xFFFF;
-       [P0] = R0;
-       SSYNC;
-#endif
-
-       /* Initialise UART - when booting from u-boot, the UART is not disabled
-        * so if we dont initalize here, our serial console gets hosed */
-       p0.h = hi(BFIN_UART_LCR);
-       p0.l = lo(BFIN_UART_LCR);
-       r0 = 0x0(Z);
-       w[p0] = r0.L;   /* To enable DLL writes */
-       ssync;
-
-       p0.h = hi(BFIN_UART_DLL);
-       p0.l = lo(BFIN_UART_DLL);
-       r0 = 0x0(Z);
-       w[p0] = r0.L;
-       ssync;
-
-       p0.h = hi(BFIN_UART_DLH);
-       p0.l = lo(BFIN_UART_DLH);
-       r0 = 0x00(Z);
-       w[p0] = r0.L;
-       ssync;
-
-       p0.h = hi(BFIN_UART_GCTL);
-       p0.l = lo(BFIN_UART_GCTL);
-       r0 = 0x0(Z);
-       w[p0] = r0.L;   /* To enable UART clock */
-       ssync;
-
-       /* Initialize stack pointer */
-       sp.l = lo(INITIAL_STACK);
-       sp.h = hi(INITIAL_STACK);
-       fp = sp;
-       usp = sp;
-
-#ifdef CONFIG_EARLY_PRINTK
-       SP += -12;
-       call _init_early_exception_vectors;
-       SP += 12;
-#endif
-
-       /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
-       call _bf53x_relocate_l1_mem;
-#ifdef CONFIG_BFIN_KERNEL_CLOCK
-       call _start_dma_code;
-#endif
-
-       /* Code for initializing Async memory banks */
-
-       p2.h = hi(EBIU_AMBCTL1);
-       p2.l = lo(EBIU_AMBCTL1);
-       r0.h = hi(AMBCTL1VAL);
-       r0.l = lo(AMBCTL1VAL);
-       [p2] = r0;
-       ssync;
-
-       p2.h = hi(EBIU_AMBCTL0);
-       p2.l = lo(EBIU_AMBCTL0);
-       r0.h = hi(AMBCTL0VAL);
-       r0.l = lo(AMBCTL0VAL);
-       [p2] = r0;
-       ssync;
-
-       p2.h = hi(EBIU_AMGCTL);
-       p2.l = lo(EBIU_AMGCTL);
-       r0 = AMGCTLVAL;
-       w[p2] = r0;
-       ssync;
-
-       /* This section keeps the processor in supervisor mode
-        * during kernel boot.  Switches to user mode at end of boot.
-        * See page 3-9 of Hardware Reference manual for documentation.
-        */
-
-       /* EVT15 = _real_start */
-
-       p0.l = lo(EVT15);
-       p0.h = hi(EVT15);
-       p1.l = _real_start;
-       p1.h = _real_start;
-       [p0] = p1;
-       csync;
-
-       p0.l = lo(IMASK);
-       p0.h = hi(IMASK);
-       p1.l = IMASK_IVG15;
-       p1.h = 0x0;
-       [p0] = p1;
-       csync;
-
-       raise 15;
-       p0.l = .LWAIT_HERE;
-       p0.h = .LWAIT_HERE;
-       reti = p0;
-#if ANOMALY_05000281
-       nop; nop; nop;
-#endif
-       rti;
-
-.LWAIT_HERE:
-       jump .LWAIT_HERE;
-ENDPROC(__start)
-
-ENTRY(_real_start)
-       [ -- sp ] = reti;
-       p0.l = lo(WDOG_CTL);
-       p0.h = hi(WDOG_CTL);
-       r0 = 0xAD6(z);
-       w[p0] = r0;     /* watchdog off for now */
-       ssync;
-
-       /* Code update for BSS size == 0
-        * Zero out the bss region.
-        */
-
-       p1.l = ___bss_start;
-       p1.h = ___bss_start;
-       p2.l = ___bss_stop;
-       p2.h = ___bss_stop;
-       r0 = 0;
-       p2 -= p1;
-       lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2;
-.L_clear_bss:
-       B[p1++] = r0;
-
-       /* In case there is a NULL pointer reference
-        * Zero out region before stext
-        */
-
-       p1.l = 0x0;
-       p1.h = 0x0;
-       r0.l = __stext;
-       r0.h = __stext;
-       r0 = r0 >> 1;
-       p2 = r0;
-       r0 = 0;
-       lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2;
-.L_clear_zero:
-       W[p1++] = r0;
-
-       /* pass the uboot arguments to the global value command line */
-       R0 = R7;
-       call _cmdline_init;
-
-       p1.l = __rambase;
-       p1.h = __rambase;
-       r0.l = __sdata;
-       r0.h = __sdata;
-       [p1] = r0;
-
-       p1.l = __ramstart;
-       p1.h = __ramstart;
-       p3.l = ___bss_stop;
-       p3.h = ___bss_stop;
-
-       r1 = p3;
-       [p1] = r1;
-
-       /*
-        * load the current thread pointer and stack
-        */
-       r1.l = _init_thread_union;
-       r1.h = _init_thread_union;
-
-       r2.l = 0x2000;
-       r2.h = 0x0000;
-       r1 = r1 + r2;
-       sp = r1;
-       usp = sp;
-       fp = sp;
-       jump.l _start_kernel;
-ENDPROC(_real_start)
-
-__FINIT
-
 .section .l1.text
 #ifdef CONFIG_BFIN_KERNEL_CLOCK
 ENTRY(_start_dma_code)
@@ -452,13 +138,6 @@ ENTRY(_start_dma_code)
        [P2] = R1;
        SSYNC;
 
-       p0.h = hi(SIC_IWR);
-       p0.l = lo(SIC_IWR);
-       r0.l = lo(IWR_ENABLE_ALL);
-       r0.h = hi(IWR_ENABLE_ALL);
-       [p0] = r0;
-       SSYNC;
-
        RTS;
 ENDPROC(_start_dma_code)
 #endif /* CONFIG_BFIN_KERNEL_CLOCK */
index a8b915f202ec8870162b2822bc79057e1e38a8b1..b1300b3f1812977c5c525cd801490f3a9b44b744 100644 (file)
@@ -31,7 +31,7 @@
 #include <linux/irq.h>
 #include <asm/blackfin.h>
 
-void program_IAR(void)
+void __init program_IAR(void)
 {
        /* Program the IAR0 Register with the configured priority */
        bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) |
index 4f4ae8787edfb0716e80ad35d5cf032c55ef10ab..58abbed0a2258edae1f37d0d747e0eb532b8a386 100644 (file)
@@ -319,12 +319,12 @@ static struct platform_device bfin_atapi_device = {
 #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE)
 static struct mtd_partition partition_info[] = {
        {
-               .name = "Linux Kernel",
+               .name = "linux kernel(nand)",
                .offset = 0,
                .size = 4 * SIZE_1M,
        },
        {
-               .name = "File System",
+               .name = "file system(nand)",
                .offset = 4 * SIZE_1M,
                .size = (256 - 4) * SIZE_1M,
        },
@@ -377,12 +377,12 @@ static struct platform_device bf54x_sdh_device = {
 /* SPI flash chip (m25p16) */
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name = "bootloader",
+               .name = "bootloader(spi)",
                .size = 0x00040000,
                .offset = 0,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name = "linux kernel",
+               .name = "linux kernel(spi)",
                .size = 0x1c0000,
                .offset = 0x40000
        }
index 166fa2201ee7a0827e03cbfc8493d9cbd99d3662..0d6333ada1d98e01209c63ec8e3c809d62108349 100644 (file)
@@ -365,12 +365,12 @@ static struct platform_device bfin_atapi_device = {
 #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE)
 static struct mtd_partition partition_info[] = {
        {
-               .name = "Linux Kernel",
+               .name = "linux kernel(nand)",
                .offset = 0,
                .size = 4 * SIZE_1M,
        },
        {
-               .name = "File System",
+               .name = "file system(nand)",
                .offset = MTDPART_OFS_APPEND,
                .size = MTDPART_SIZ_FULL,
        },
@@ -419,15 +419,15 @@ static struct platform_device bf54x_sdh_device = {
 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
 static struct mtd_partition ezkit_partitions[] = {
        {
-               .name       = "Bootloader",
+               .name       = "bootloader(nor)",
                .size       = 0x40000,
                .offset     = 0,
        }, {
-               .name       = "Kernel",
+               .name       = "linux kernel(nor)",
                .size       = 0x1C0000,
                .offset     = MTDPART_OFS_APPEND,
        }, {
-               .name       = "RootFS",
+               .name       = "file system(nor)",
                .size       = MTDPART_SIZ_FULL,
                .offset     = MTDPART_OFS_APPEND,
        }
@@ -461,12 +461,12 @@ static struct platform_device ezkit_flash_device = {
 /* SPI flash chip (m25p16) */
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name = "bootloader",
+               .name = "bootloader(spi)",
                .size = 0x00040000,
                .offset = 0,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name = "linux kernel",
+               .name = "linux kernel(spi)",
                .size = MTDPART_SIZ_FULL,
                .offset = MTDPART_OFS_APPEND,
        }
index 06b9178cfcfe4a571b1fdded8396f53e11e355cf..e3000f70a26e034701b558c67ae3dfd4493ac466 100644 (file)
 #include <linux/linkage.h>
 #include <linux/init.h>
 #include <asm/blackfin.h>
-#include <asm/trace.h>
 #ifdef CONFIG_BFIN_KERNEL_CLOCK
 #include <asm/mach-common/clocks.h>
 #include <asm/mach/mem_init.h>
 #endif
 
-.extern ___bss_stop
-.extern ___bss_start
-.extern _bf53x_relocate_l1_mem
-
-#define INITIAL_STACK   0xFFB01000
-
-__INIT
-
-ENTRY(__start)
-       /* R0: argument of command line string, passed from uboot, save it */
-       R7 = R0;
-       /* Enable Cycle Counter and Nesting Of Interrupts */
-#ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES
-       R0 = SYSCFG_SNEN;
-#else
-       R0 = SYSCFG_SNEN | SYSCFG_CCEN;
-#endif
-       SYSCFG = R0;
-       R0 = 0;
-
-       /* Clear Out All the data and pointer  Registers*/
-       R1 = R0;
-       R2 = R0;
-       R3 = R0;
-       R4 = R0;
-       R5 = R0;
-       R6 = R0;
-
-       P0 = R0;
-       P1 = R0;
-       P2 = R0;
-       P3 = R0;
-       P4 = R0;
-       P5 = R0;
-
-       LC0 = r0;
-       LC1 = r0;
-       L0 = r0;
-       L1 = r0;
-       L2 = r0;
-       L3 = r0;
-
-       /* Clear Out All the DAG Registers*/
-       B0 = r0;
-       B1 = r0;
-       B2 = r0;
-       B3 = r0;
-
-       I0 = r0;
-       I1 = r0;
-       I2 = r0;
-       I3 = r0;
-
-       M0 = r0;
-       M1 = r0;
-       M2 = r0;
-       M3 = r0;
-
-       trace_buffer_init(p0,r0);
-       P0 = R1;
-       R0 = R1;
-
-       /* Turn off the icache */
-       p0.l = LO(IMEM_CONTROL);
-       p0.h = HI(IMEM_CONTROL);
-       R1 = [p0];
-       R0 = ~ENICPLB;
-       R0 = R0 & R1;
-       [p0] = R0;
-       SSYNC;
-
-       /* Turn off the dcache */
-       p0.l = LO(DMEM_CONTROL);
-       p0.h = HI(DMEM_CONTROL);
-       R1 = [p0];
-       R0 = ~ENDCPLB;
-       R0 = R0 & R1;
-       [p0] = R0;
-       SSYNC;
-
-       /* Initialize stack pointer */
-       SP.L = LO(INITIAL_STACK);
-       SP.H = HI(INITIAL_STACK);
-       FP = SP;
-       USP = SP;
-
-#ifdef CONFIG_EARLY_PRINTK
-       SP += -12;
-       call _init_early_exception_vectors;
-       SP += 12;
-#endif
-
-       /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
-       call _bf53x_relocate_l1_mem;
-#ifdef CONFIG_BFIN_KERNEL_CLOCK
-       call _start_dma_code;
-#endif
-       /* Code for initializing Async memory banks */
-
-       p2.h = hi(EBIU_AMBCTL1);
-       p2.l = lo(EBIU_AMBCTL1);
-       r0.h = hi(AMBCTL1VAL);
-       r0.l = lo(AMBCTL1VAL);
-       [p2] = r0;
-       ssync;
-
-       p2.h = hi(EBIU_AMBCTL0);
-       p2.l = lo(EBIU_AMBCTL0);
-       r0.h = hi(AMBCTL0VAL);
-       r0.l = lo(AMBCTL0VAL);
-       [p2] = r0;
-       ssync;
-
-       p2.h = hi(EBIU_AMGCTL);
-       p2.l = lo(EBIU_AMGCTL);
-       r0 = AMGCTLVAL;
-       w[p2] = r0;
-       ssync;
-
-       p2.h = hi(EBIU_MBSCTL);
-       p2.l = lo(EBIU_MBSCTL);
-       r0.h = hi(CONFIG_EBIU_MBSCTLVAL);
-       r0.l = lo(CONFIG_EBIU_MBSCTLVAL);
-       [p2] = r0;
-       ssync;
-
-       p2.h = hi(EBIU_MODE);
-       p2.l = lo(EBIU_MODE);
-       r0.h = hi(CONFIG_EBIU_MODEVAL);
-       r0.l = lo(CONFIG_EBIU_MODEVAL);
-       [p2] = r0;
-       ssync;
-
-       p2.h = hi(EBIU_FCTL);
-       p2.l = lo(EBIU_FCTL);
-       r0.h = hi(CONFIG_EBIU_FCTLVAL);
-       r0.l = lo(CONFIG_EBIU_FCTLVAL);
-       [p2] = r0;
-       ssync;
-
-       /* This section keeps the processor in supervisor mode
-        * during kernel boot.  Switches to user mode at end of boot.
-        * See page 3-9 of Hardware Reference manual for documentation.
-        */
-
-       /* EVT15 = _real_start */
-
-       p0.l = lo(EVT15);
-       p0.h = hi(EVT15);
-       p1.l = _real_start;
-       p1.h = _real_start;
-       [p0] = p1;
-       csync;
-
-       p0.l = lo(IMASK);
-       p0.h = hi(IMASK);
-       p1.l = IMASK_IVG15;
-       p1.h = 0x0;
-       [p0] = p1;
-       csync;
-
-       raise 15;
-       p0.l = .LWAIT_HERE;
-       p0.h = .LWAIT_HERE;
-       reti = p0;
-#if ANOMALY_05000281
-       nop;
-       nop;
-       nop;
-#endif
-       rti;
-
-.LWAIT_HERE:
-       jump .LWAIT_HERE;
-ENDPROC(__start)
-
-ENTRY(_real_start)
-       [ -- sp ] = reti;
-       p0.l = lo(WDOG_CTL);
-       p0.h = hi(WDOG_CTL);
-       r0 = 0xAD6(z);
-       w[p0] = r0;     /* watchdog off for now */
-       ssync;
-
-       /* Code update for BSS size == 0
-        * Zero out the bss region.
-        */
-
-       p1.l = ___bss_start;
-       p1.h = ___bss_start;
-       p2.l = ___bss_stop;
-       p2.h = ___bss_stop;
-       r0 = 0;
-       p2 -= p1;
-       lsetup (.L_clear_bss, .L_clear_bss ) lc0 = p2;
-.L_clear_bss:
-       B[p1++] = r0;
-
-       /* In case there is a NULL pointer reference
-        * Zero out region before stext
-        */
-
-       p1.l = 0x0;
-       p1.h = 0x0;
-       r0.l = __stext;
-       r0.h = __stext;
-       r0 = r0 >> 1;
-       p2 = r0;
-       r0 = 0;
-       lsetup (.L_clear_zero, .L_clear_zero ) lc0 = p2;
-.L_clear_zero:
-       W[p1++] = r0;
-
-       /* pass the uboot arguments to the global value command line */
-       R0 = R7;
-       call _cmdline_init;
-
-       p1.l = __rambase;
-       p1.h = __rambase;
-       r0.l = __sdata;
-       r0.h = __sdata;
-       [p1] = r0;
-
-       p1.l = __ramstart;
-       p1.h = __ramstart;
-       p3.l = ___bss_stop;
-       p3.h = ___bss_stop;
-
-       r1 = p3;
-       [p1] = r1;
-
-
-       /*
-        *  load the current thread pointer and stack
-        */
-       r1.l = _init_thread_union;
-       r1.h = _init_thread_union;
-
-       r2.l = 0x2000;
-       r2.h = 0x0000;
-       r1 = r1 + r2;
-       sp = r1;
-       usp = sp;
-       fp = sp;
-       call _start_kernel;
-.L_exit:
-       jump.s  .L_exit;
-ENDPROC(_real_start)
-
-__FINIT
-
 .section .l1.text
 #ifdef CONFIG_BFIN_KERNEL_CLOCK
 ENTRY(_start_dma_code)
@@ -443,13 +191,6 @@ ENTRY(_start_dma_code)
        SSYNC;
 #endif
 
-       p0.h = hi(SIC_IWR0);
-       p0.l = lo(SIC_IWR0);
-       r0.l = lo(IWR_ENABLE_ALL);
-       r0.h = hi(IWR_ENABLE_ALL);
-       [p0] = r0;
-       SSYNC;
-
        RTS;
 ENDPROC(_start_dma_code)
 #endif /* CONFIG_BFIN_KERNEL_CLOCK */
index 2665653cee37e708ff997f2dee2238d9107db4f9..9dd0fa3ac4de39610697177c035282fd636528f6 100644 (file)
@@ -31,7 +31,7 @@
 #include <linux/irq.h>
 #include <asm/blackfin.h>
 
-void program_IAR(void)
+void __init program_IAR(void)
 {
        /* Program the IAR0 Register with the configured priority */
        bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) |
index 466ef5929a254d76d62333fc198554d41245cfd7..8f40990eea2f217bccbae00d523e0a049da208dc 100644 (file)
@@ -54,16 +54,16 @@ const char bfin_board_name[] = "Bluetechnix CM BF561";
 #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
 static struct mtd_partition bfin_spi_flash_partitions[] = {
        {
-               .name = "bootloader",
+               .name = "bootloader(spi)",
                .size = 0x00020000,
                .offset = 0,
                .mask_flags = MTD_CAP_ROM
        }, {
-               .name = "kernel",
+               .name = "linux kernel(spi)",
                .size = 0xe0000,
                .offset = 0x20000
        }, {
-               .name = "file system",
+               .name = "file system(spi)",
                .size = 0x700000,
                .offset = 0x00100000,
        }
@@ -306,7 +306,7 @@ static struct platform_device bfin_sir_device = {
 #endif
 
 #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-#define PATA_INT       119
+#define PATA_INT       IRQ_PF46
 
 static struct pata_platform_info bfin_pata_platform_data = {
        .ioport_shift = 2,
index bc6feded8569760b66bb6b576e66e266341e8889..50b4cdceccfef7f665349a2bd502ece0bbcb8b29 100644 (file)
@@ -35,7 +35,6 @@
 #include <linux/spi/spi.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
-#include <linux/ata_platform.h>
 #include <asm/dma.h>
 #include <asm/bfin5xx_spi.h>
 #include <asm/portmux.h>
@@ -243,15 +242,15 @@ static struct platform_device bfin_sir_device = {
 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
 static struct mtd_partition ezkit_partitions[] = {
        {
-               .name       = "Bootloader",
+               .name       = "bootloader(nor)",
                .size       = 0x40000,
                .offset     = 0,
        }, {
-               .name       = "Kernel",
+               .name       = "linux kernel(nor)",
                .size       = 0x1C0000,
                .offset     = MTDPART_OFS_APPEND,
        }, {
-               .name       = "RootFS",
+               .name       = "file system(nor)",
                .size       = MTDPART_SIZ_FULL,
                .offset     = MTDPART_OFS_APPEND,
        }
@@ -350,43 +349,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
 #endif
 };
 
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-#define PATA_INT       55
-
-static struct pata_platform_info bfin_pata_platform_data = {
-       .ioport_shift = 1,
-       .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED,
-};
-
-static struct resource bfin_pata_resources[] = {
-       {
-               .start = 0x20314020,
-               .end = 0x2031403F,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = 0x2031401C,
-               .end = 0x2031401F,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = PATA_INT,
-               .end = PATA_INT,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device bfin_pata_device = {
-       .name = "pata_platform",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(bfin_pata_resources),
-       .resource = bfin_pata_resources,
-       .dev = {
-               .platform_data = &bfin_pata_platform_data,
-       }
-};
-#endif
-
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
 #include <linux/input.h>
 #include <linux/gpio_keys.h>
@@ -499,10 +461,6 @@ static struct platform_device *ezkit_devices[] __initdata = {
        &bfin_sir_device,
 #endif
 
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       &bfin_pata_device,
-#endif
-
 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
        &bfin_device_gpiokeys,
 #endif
@@ -538,10 +496,6 @@ static int __init ezkit_init(void)
 #endif
 
        spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
-
-#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
-       irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
-#endif
        return 0;
 }
 
index cf1a2dff01e71b9fab72a90aa8a3e42cf937c2a0..c7a81e34703d286ae21da5f0a91009ae3d7d19a3 100644 (file)
 #include <linux/linkage.h>
 #include <linux/init.h>
 #include <asm/blackfin.h>
-#include <asm/trace.h>
-
-#if CONFIG_BFIN_KERNEL_CLOCK
+#ifdef CONFIG_BFIN_KERNEL_CLOCK
 #include <asm/mach-common/clocks.h>
 #include <asm/mach/mem_init.h>
 #endif
 
-.extern ___bss_stop
-.extern ___bss_start
-.extern _bf53x_relocate_l1_mem
-
-#define INITIAL_STACK  0xFFB01000
-
-__INIT
-
-ENTRY(__start)
-       /* R0: argument of command line string, passed from uboot, save it */
-       R7 = R0;
-       /* Enable Cycle Counter and Nesting Of Interrupts */
-#ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES
-       R0 = SYSCFG_SNEN;
-#else
-       R0 = SYSCFG_SNEN | SYSCFG_CCEN;
-#endif
-       SYSCFG = R0;
-       R0 = 0;
-
-       /* Clear Out All the data and pointer Registers */
-       R1 = R0;
-       R2 = R0;
-       R3 = R0;
-       R4 = R0;
-       R5 = R0;
-       R6 = R0;
-
-       P0 = R0;
-       P1 = R0;
-       P2 = R0;
-       P3 = R0;
-       P4 = R0;
-       P5 = R0;
-
-       LC0 = r0;
-       LC1 = r0;
-       L0 = r0;
-       L1 = r0;
-       L2 = r0;
-       L3 = r0;
-
-       /* Clear Out All the DAG Registers */
-       B0 = r0;
-       B1 = r0;
-       B2 = r0;
-       B3 = r0;
-
-       I0 = r0;
-       I1 = r0;
-       I2 = r0;
-       I3 = r0;
-
-       M0 = r0;
-       M1 = r0;
-       M2 = r0;
-       M3 = r0;
-
-       trace_buffer_init(p0,r0);
-       P0 = R1;
-       R0 = R1;
-
-       /* Turn off the icache */
-       p0.l = LO(IMEM_CONTROL);
-       p0.h = HI(IMEM_CONTROL);
-       R1 = [p0];
-       R0 = ~ENICPLB;
-       R0 = R0 & R1;
-
-#if ANOMALY_05000125
-       CLI R2;
-       SSYNC;
-#endif
-       [p0] = R0;
-       SSYNC;
-#if ANOMALY_05000125
-       STI R2;
-#endif
-
-       /* Turn off the dcache */
-       p0.l = LO(DMEM_CONTROL);
-       p0.h = HI(DMEM_CONTROL);
-       R1 = [p0];
-       R0 = ~ENDCPLB;
-       R0 = R0 & R1;
-
-       /* Anomaly 05000125 */
-#if ANOMALY_05000125
-       CLI R2;
-       SSYNC;
-#endif
-       [p0] = R0;
-       SSYNC;
-#if ANOMALY_05000125
-       STI R2;
-#endif
-
-       /* Initialise UART - when booting from u-boot, the UART is not disabled
-        * so if we dont initalize here, our serial console gets hosed */
-       p0.h = hi(BFIN_UART_LCR);
-       p0.l = lo(BFIN_UART_LCR);
-       r0 = 0x0(Z);
-       w[p0] = r0.L;   /* To enable DLL writes */
-       ssync;
-
-       p0.h = hi(BFIN_UART_DLL);
-       p0.l = lo(BFIN_UART_DLL);
-       r0 = 0x0(Z);
-       w[p0] = r0.L;
-       ssync;
-
-       p0.h = hi(BFIN_UART_DLH);
-       p0.l = lo(BFIN_UART_DLH);
-       r0 = 0x00(Z);
-       w[p0] = r0.L;
-       ssync;
-
-       p0.h = hi(BFIN_UART_GCTL);
-       p0.l = lo(BFIN_UART_GCTL);
-       r0 = 0x0(Z);
-       w[p0] = r0.L;   /* To enable UART clock */
-       ssync;
-
-       /* Initialize stack pointer */
-       sp.l = lo(INITIAL_STACK);
-       sp.h = hi(INITIAL_STACK);
-       fp = sp;
-       usp = sp;
-
-#ifdef CONFIG_EARLY_PRINTK
-       SP += -12;
-       call _init_early_exception_vectors;
-       SP += 12;
-#endif
-
-       /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
-       call _bf53x_relocate_l1_mem;
-#if CONFIG_BFIN_KERNEL_CLOCK
-       call _start_dma_code;
-#endif
-
-       /* Code for initializing Async memory banks */
-
-       p2.h = hi(EBIU_AMBCTL1);
-       p2.l = lo(EBIU_AMBCTL1);
-       r0.h = hi(AMBCTL1VAL);
-       r0.l = lo(AMBCTL1VAL);
-       [p2] = r0;
-       ssync;
-
-       p2.h = hi(EBIU_AMBCTL0);
-       p2.l = lo(EBIU_AMBCTL0);
-       r0.h = hi(AMBCTL0VAL);
-       r0.l = lo(AMBCTL0VAL);
-       [p2] = r0;
-       ssync;
-
-       p2.h = hi(EBIU_AMGCTL);
-       p2.l = lo(EBIU_AMGCTL);
-       r0 = AMGCTLVAL;
-       w[p2] = r0;
-       ssync;
-
-       /* This section keeps the processor in supervisor mode
-        * during kernel boot.  Switches to user mode at end of boot.
-        * See page 3-9 of Hardware Reference manual for documentation.
-        */
-
-       /* EVT15 = _real_start */
-
-       p0.l = lo(EVT15);
-       p0.h = hi(EVT15);
-       p1.l = _real_start;
-       p1.h = _real_start;
-       [p0] = p1;
-       csync;
-
-       p0.l = lo(IMASK);
-       p0.h = hi(IMASK);
-       p1.l = IMASK_IVG15;
-       p1.h = 0x0;
-       [p0] = p1;
-       csync;
-
-       raise 15;
-       p0.l = .LWAIT_HERE;
-       p0.h = .LWAIT_HERE;
-       reti = p0;
-#if ANOMALY_05000281
-       nop; nop; nop;
-#endif
-       rti;
-
-.LWAIT_HERE:
-       jump .LWAIT_HERE;
-ENDPROC(__start)
-
-ENTRY(_real_start)
-       [ -- sp ] = reti;
-       p0.l = lo(WDOGA_CTL);
-       p0.h = hi(WDOGA_CTL);
-       r0 = 0xAD6(z);
-       w[p0] = r0;     /* watchdog off for now */
-       ssync;
-
-       /* Code update for BSS size == 0
-        * Zero out the bss region.
-        */
-
-       p1.l = ___bss_start;
-       p1.h = ___bss_start;
-       p2.l = ___bss_stop;
-       p2.h = ___bss_stop;
-       r0 = 0;
-       p2 -= p1;
-       lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2;
-.L_clear_bss:
-       B[p1++] = r0;
-
-       /* In case there is a NULL pointer reference
-        * Zero out region before stext
-        */
-
-       p1.l = 0x0;
-       p1.h = 0x0;
-       r0.l = __stext;
-       r0.h = __stext;
-       r0 = r0 >> 1;
-       p2 = r0;
-       r0 = 0;
-       lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2;
-.L_clear_zero:
-       W[p1++] = r0;
-
-       /* pass the uboot arguments to the global value command line */
-       R0 = R7;
-       call _cmdline_init;
-
-       p1.l = __rambase;
-       p1.h = __rambase;
-       r0.l = __sdata;
-       r0.h = __sdata;
-       [p1] = r0;
-
-       p1.l = __ramstart;
-       p1.h = __ramstart;
-       p3.l = ___bss_stop;
-       p3.h = ___bss_stop;
-
-       r1 = p3;
-       [p1] = r1;
-
-       /*
-        * load the current thread pointer and stack
-        */
-       r1.l = _init_thread_union;
-       r1.h = _init_thread_union;
-
-       r2.l = 0x2000;
-       r2.h = 0x0000;
-       r1 = r1 + r2;
-       sp = r1;
-       usp = sp;
-       fp = sp;
-       jump.l _start_kernel;
-ENDPROC(_real_start)
-
-__FINIT
-
 .section .l1.text
-#if CONFIG_BFIN_KERNEL_CLOCK
+#ifdef CONFIG_BFIN_KERNEL_CLOCK
 ENTRY(_start_dma_code)
        p0.h = hi(SICA_IWR0);
        p0.l = lo(SICA_IWR0);
index 09b541b0f7c20c284cb1d549e88a205b82b97d06..9d2f2334472088876cc113376095c10c4dd0721d 100644 (file)
@@ -31,7 +31,7 @@
 #include <linux/irq.h>
 #include <asm/blackfin.h>
 
-void program_IAR(void)
+void __init program_IAR(void)
 {
        /* Program the IAR0 Register with the configured priority */
        bfin_write_SICA_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) |
index 422bfee34adcec22b834a41a36b55f9e3337dffa..e6ed57c56d4b7ef1d46d59f0809862e97dbfe2ea 100644 (file)
@@ -3,9 +3,10 @@
 #
 
 obj-y := \
-       cache.o cacheinit.o entry.o \
-       interrupt.o lock.o irqpanic.o arch_checks.o ints-priority.o
+       cache.o entry.o head.o \
+       interrupt.o irqpanic.o arch_checks.o ints-priority.o
 
+obj-$(CONFIG_BFIN_ICACHE_LOCK) += lock.o
 obj-$(CONFIG_PM)          += pm.o dpmc_modes.o
 obj-$(CONFIG_CPU_FREQ)    += cpufreq.o
 obj-$(CONFIG_CPU_VOLTAGE) += dpmc.o
index f9160d83b91f5ecd632d011f71c6f29e9f7746f3..5986758b2752b75737141ebb5cec6d76c423c38d 100644 (file)
@@ -27,6 +27,7 @@
  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+#include <asm/fixed_code.h>
 #include <asm/mach/anomaly.h>
 #include <asm/mach-common/clocks.h>
 
 # endif
 
 #endif /* CONFIG_BFIN_KERNEL_CLOCK */
+
+#if CONFIG_BOOT_LOAD < FIXED_CODE_END
+# error "The kernel load address must be after the fixed code section"
+#endif
+
+#if (CONFIG_BOOT_LOAD & 0x3)
+# error "The kernel load address must be 4 byte aligned"
+#endif
index 0521b15882044e7665dcb400703a13792285db77..85f8c79b3c377b1c2a9e0d4f01fc370a4e4bce6e 100644 (file)
 #include <asm/cache.h>
 
 .text
-.align 2
-ENTRY(_cache_invalidate)
-
-       /*
-        * Icache or DcacheA or DcacheB Invalidation
-        * or any combination thereof
-        * R0 has bits
-        * CPLB_ENABLE_ICACHE_P,CPLB_ENABLE_DCACHE_P,CPLB_ENABLE_DCACHE2_P
-        * set as required
-        */
-       [--SP] = R7;
-
-       R7 = R0;
-       CC = BITTST(R7,CPLB_ENABLE_ICACHE_P);
-       IF !CC JUMP .Lno_icache;
-       [--SP] = RETS;
-       CALL _icache_invalidate;
-       RETS = [SP++];
-.Lno_icache:
-       CC = BITTST(R7,CPLB_ENABLE_DCACHE_P);
-       IF !CC JUMP .Lno_dcache_a;
-       R0 = 0;         /* specifies bank A */
-       [--SP] = RETS;
-       CALL _dcache_invalidate;
-       RETS = [SP++];
-.Lno_dcache_a:
-       CC = BITTST(R7,CPLB_ENABLE_DCACHE2_P);
-       IF !CC JUMP .Lno_dcache_b;
-       R0 = 0;
-       BITSET(R0, 23);         /* specifies bank B */
-       [--SP] = RETS;
-       CALL  _dcache_invalidate;
-       RETS = [SP++];
-.Lno_dcache_b:
-       R7 = [SP++];
-       RTS;
-ENDPROC(_cache_invalidate)
-
-/* Invalidate the Entire Instruction cache by
- * disabling IMC bit
- */
-ENTRY(_icache_invalidate)
-ENTRY(_invalidate_entire_icache)
-       [--SP] = ( R7:5);
-
-       P0.L = LO(IMEM_CONTROL);
-       P0.H = HI(IMEM_CONTROL);
-       R7 = [P0];
-
-       /* Clear the IMC bit , All valid bits in the instruction
-        * cache are set to the invalid state
-        */
-       BITCLR(R7,IMC_P);
-       CLI R6;
-       SSYNC;          /* SSYNC required before invalidating cache. */
-       .align 8;
-       [P0] = R7;
-       SSYNC;
-       STI R6;
-
-       /* Configures the instruction cache agian */
-       R6 = (IMC | ENICPLB);
-       R7 = R7 | R6;
-
-       CLI R6;
-       SSYNC;          /* SSYNC required before writing to IMEM_CONTROL. */
-       .align 8;
-       [P0] = R7;
-       SSYNC;
-       STI R6;
-
-       ( R7:5) = [SP++];
-       RTS;
-ENDPROC(_invalidate_entire_icache)
-ENDPROC(_icache_invalidate)
 
 /*
  * blackfin_cache_flush_range(start, end)
@@ -190,46 +115,6 @@ ENTRY(_blackfin_dcache_invalidate_range)
        RTS;
 ENDPROC(_blackfin_dcache_invalidate_range)
 
-/* Invalidate the Entire Data cache by
- * clearing DMC[1:0] bits
- */
-ENTRY(_invalidate_entire_dcache)
-ENTRY(_dcache_invalidate)
-       [--SP] = ( R7:6);
-
-       P0.L = LO(DMEM_CONTROL);
-       P0.H = HI(DMEM_CONTROL);
-       R7 = [P0];
-
-       /* Clear the DMC[1:0] bits, All valid bits in the data
-        * cache are set to the invalid state
-        */
-       BITCLR(R7,DMC0_P);
-       BITCLR(R7,DMC1_P);
-       CLI R6;
-       SSYNC;          /* SSYNC required before writing to DMEM_CONTROL. */
-       .align 8;
-       [P0] = R7;
-       SSYNC;
-       STI R6;
-
-       /* Configures the data cache again */
-
-       R6 = DMEM_CNTR;
-       R7 = R7 | R6;
-
-       CLI R6;
-       SSYNC;          /* SSYNC required before writing to DMEM_CONTROL. */
-       .align 8;
-       [P0] = R7;
-       SSYNC;
-       STI R6;
-
-       ( R7:6) = [SP++];
-       RTS;
-ENDPROC(_dcache_invalidate)
-ENDPROC(_invalidate_entire_dcache)
-
 ENTRY(_blackfin_dcache_flush_range)
        R2 = -L1_CACHE_BYTES;
        R2 = R0 & R2;
diff --git a/arch/blackfin/mach-common/cacheinit.S b/arch/blackfin/mach-common/cacheinit.S
deleted file mode 100644 (file)
index 22fada0..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * File:         arch/blackfin/mach-common/cacheinit.S
- * Based on:
- * Author:       LG Soft India
- *
- * Created:      ?
- * Description:  cache initialization
- *
- * Modified:
- *               Copyright 2004-2006 Analog Devices Inc.
- *
- * Bugs:         Enter bugs at http://blackfin.uclinux.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.
- *
- * 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, see the file COPYING, or write
- * to the Free Software Foundation, Inc.,
- * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-/* This function sets up the data and instruction cache. The
- * tables like icplb table, dcplb table and Page Descriptor table
- * are defined in cplbtab.h. You can configure those tables for
- * your suitable requirements
- */
-
-#include <linux/linkage.h>
-#include <asm/blackfin.h>
-
-.text
-
-#if ANOMALY_05000125
-#if defined(CONFIG_BFIN_ICACHE)
-ENTRY(_bfin_write_IMEM_CONTROL)
-
-       /* Enable Instruction Cache */
-       P0.l = LO(IMEM_CONTROL);
-       P0.h = HI(IMEM_CONTROL);
-
-       /* Anomaly 05000125 */
-       CLI R1;
-       SSYNC;          /* SSYNC required before writing to IMEM_CONTROL. */
-       .align 8;
-       [P0] = R0;
-       SSYNC;
-       STI R1;
-       RTS;
-
-ENDPROC(_bfin_write_IMEM_CONTROL)
-#endif
-
-#if defined(CONFIG_BFIN_DCACHE)
-ENTRY(_bfin_write_DMEM_CONTROL)
-       P0.l = LO(DMEM_CONTROL);
-       P0.h = HI(DMEM_CONTROL);
-
-       CLI R1;
-       SSYNC;          /* SSYNC required before writing to DMEM_CONTROL. */
-       .align 8;
-       [P0] = R0;
-       SSYNC;
-       STI R1;
-       RTS;
-
-ENDPROC(_bfin_write_DMEM_CONTROL)
-#endif
-
-#endif
index 5e3f1d8a4fb881138f63a56fa8ea6bf0c9b8c144..838b0b2ce9a534133704f14f5d149d5732721d78 100644 (file)
@@ -78,62 +78,6 @@ ENTRY(_hibernate_mode)
        jump .Lforever;
 ENDPROC(_hibernate_mode)
 
-ENTRY(_deep_sleep)
-       [--SP] = ( R7:0, P5:0 );
-       [--SP] =  RETS;
-
-       CLI R4;
-
-       R0 = IWR_ENABLE(0);
-       R1 = IWR_DISABLE_ALL;
-       R2 = IWR_DISABLE_ALL;
-
-       call _set_sic_iwr;
-
-       call _set_dram_srfs;
-
-       /* Clear all the interrupts,bits sticky */
-       R0 = 0xFFFF (Z);
-       call _set_rtc_istat
-
-       P0.H = hi(PLL_CTL);
-       P0.L = lo(PLL_CTL);
-       R0 = W[P0](z);
-       BITSET (R0, 5);
-       W[P0] = R0.L;
-
-       call _test_pll_locked;
-
-       SSYNC;
-       IDLE;
-
-       call _unset_dram_srfs;
-
-       call _test_pll_locked;
-
-       R0 = IWR_ENABLE(0);
-       R1 = IWR_DISABLE_ALL;
-       R2 = IWR_DISABLE_ALL;
-
-       call _set_sic_iwr;
-
-       P0.H = hi(PLL_CTL);
-       P0.L = lo(PLL_CTL);
-       R0 = w[p0](z);
-       BITCLR (R0, 3);
-       BITCLR (R0, 5);
-       BITCLR (R0, 8);
-       w[p0] = R0;
-       IDLE;
-       call _test_pll_locked;
-
-       STI R4;
-
-       RETS = [SP++];
-       ( R7:0, P5:0 ) = [SP++];
-       RTS;
-ENDPROC(_deep_sleep)
-
 ENTRY(_sleep_deeper)
        [--SP] = ( R7:0, P5:0 );
        [--SP] =  RETS;
index eceb484d90f9da1144a1c1afca1e019f29a3f672..117c01c2c6b0847eb8beb5631f7563d2de2663dd 100644 (file)
@@ -158,14 +158,16 @@ ENTRY(_ex_single_step)
        cc = r7 == r6;
        if cc jump _bfin_return_from_exception;
 
+#ifdef CONFIG_KGDB
        /* Don't do single step in hardware exception handler */
         p5.l = lo(IPEND);
         p5.h = hi(IPEND);
        r6 = [p5];
+       cc = bittst(r6, 4);
+       if cc jump _bfin_return_from_exception;
        cc = bittst(r6, 5);
        if cc jump _bfin_return_from_exception;
 
-#ifdef CONFIG_KGDB
        /* skip single step if current interrupt priority is higher than
         * that of the first instruction, from which gdb starts single step */
        r6 >>= 6;
@@ -186,17 +188,27 @@ ENTRY(_ex_single_step)
        if cc jump .Ldo_single_step;
        r6 += -1;
        cc = r6 < r7;
-       if cc jump _bfin_return_from_exception;
+       if cc jump 1f;
 .Ldo_single_step:
-#endif
-
+#else
        /* If we were in user mode, do the single step normally.  */
+       p5.l = lo(IPEND);
+       p5.h = hi(IPEND);
        r6 = [p5];
        r7 = 0xffe0 (z);
        r7 = r7 & r6;
        cc = r7 == 0;
-       if cc jump 1f;
+       if !cc jump 1f;
+#endif
 
+       /* Single stepping only a single instruction, so clear the trace
+        * bit here.  */
+       r7 = syscfg;
+       bitclr (r7, 0);
+       syscfg = R7;
+       jump _ex_trap_c;
+
+1:
        /*
         * We were in an interrupt handler.  By convention, all of them save
         * SYSCFG with their first instruction, so by checking whether our
@@ -224,15 +236,11 @@ ENTRY(_ex_single_step)
        cc = R7 == R6;
        if !cc jump _bfin_return_from_exception;
 
-1:
-       /* Single stepping only a single instruction, so clear the trace
-        * bit here.  */
        r7 = syscfg;
        bitclr (r7, 0);
        syscfg = R7;
 
-       jump _ex_trap_c;
-
+       /* Fall through to _bfin_return_from_exception.  */
 ENDPROC(_ex_single_step)
 
 ENTRY(_bfin_return_from_exception)
@@ -1414,6 +1422,12 @@ ENTRY(_sys_call_table)
        .long _sys_semtimedop
        .long _sys_timerfd_settime
        .long _sys_timerfd_gettime
+       .long _sys_signalfd4            /* 360 */
+       .long _sys_eventfd2
+       .long _sys_epoll_create1
+       .long _sys_dup3
+       .long _sys_pipe2
+       .long _sys_inotify_init1        /* 365 */
 
        .rept NR_syscalls-(.-_sys_call_table)/4
        .long _sys_ni_syscall
diff --git a/arch/blackfin/mach-common/head.S b/arch/blackfin/mach-common/head.S
new file mode 100644 (file)
index 0000000..191b4e9
--- /dev/null
@@ -0,0 +1,207 @@
+/*
+ * Common Blackfin startup code
+ *
+ * Copyright 2004-2008 Analog Devices Inc.
+ *
+ * Enter bugs at http://blackfin.uclinux.org/
+ *
+ * Licensed under the GPL-2 or later.
+ */
+
+#include <linux/linkage.h>
+#include <linux/init.h>
+#include <asm/blackfin.h>
+#include <asm/thread_info.h>
+#include <asm/trace.h>
+
+__INIT
+
+#define INITIAL_STACK  (L1_SCRATCH_START + L1_SCRATCH_LENGTH - 12)
+
+ENTRY(__start)
+       /* R0: argument of command line string, passed from uboot, save it */
+       R7 = R0;
+       /* Enable Cycle Counter and Nesting Of Interrupts */
+#ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES
+       R0 = SYSCFG_SNEN;
+#else
+       R0 = SYSCFG_SNEN | SYSCFG_CCEN;
+#endif
+       SYSCFG = R0;
+       R0 = 0;
+
+       /* Clear Out All the data and pointer Registers */
+       R1 = R0;
+       R2 = R0;
+       R3 = R0;
+       R4 = R0;
+       R5 = R0;
+       R6 = R0;
+
+       P0 = R0;
+       P1 = R0;
+       P2 = R0;
+       P3 = R0;
+       P4 = R0;
+       P5 = R0;
+
+       LC0 = r0;
+       LC1 = r0;
+       L0 = r0;
+       L1 = r0;
+       L2 = r0;
+       L3 = r0;
+
+       /* Clear Out All the DAG Registers */
+       B0 = r0;
+       B1 = r0;
+       B2 = r0;
+       B3 = r0;
+
+       I0 = r0;
+       I1 = r0;
+       I2 = r0;
+       I3 = r0;
+
+       M0 = r0;
+       M1 = r0;
+       M2 = r0;
+       M3 = r0;
+
+       trace_buffer_init(p0,r0);
+       P0 = R1;
+       R0 = R1;
+
+       /* Turn off the icache */
+       p0.l = LO(IMEM_CONTROL);
+       p0.h = HI(IMEM_CONTROL);
+       R1 = [p0];
+       R0 = ~ENICPLB;
+       R0 = R0 & R1;
+       [p0] = R0;
+       SSYNC;
+
+       /* Turn off the dcache */
+       p0.l = LO(DMEM_CONTROL);
+       p0.h = HI(DMEM_CONTROL);
+       R1 = [p0];
+       R0 = ~ENDCPLB;
+       R0 = R0 & R1;
+       [p0] = R0;
+       SSYNC;
+
+       /* Save RETX, in case of doublefault */
+       p0.l = ___retx;
+       p0.h = ___retx;
+       R0 = RETX;
+       [P0] = R0;
+
+       /* Initialize stack pointer */
+       sp.l = lo(INITIAL_STACK);
+       sp.h = hi(INITIAL_STACK);
+       fp = sp;
+       usp = sp;
+
+#ifdef CONFIG_EARLY_PRINTK
+       call _init_early_exception_vectors;
+#endif
+
+       /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
+       call _bf53x_relocate_l1_mem;
+#ifdef CONFIG_BFIN_KERNEL_CLOCK
+       call _start_dma_code;
+#endif
+
+       /* This section keeps the processor in supervisor mode
+        * during kernel boot.  Switches to user mode at end of boot.
+        * See page 3-9 of Hardware Reference manual for documentation.
+        */
+
+       /* EVT15 = _real_start */
+
+       p0.l = lo(EVT15);
+       p0.h = hi(EVT15);
+       p1.l = _real_start;
+       p1.h = _real_start;
+       [p0] = p1;
+       csync;
+
+       p0.l = lo(IMASK);
+       p0.h = hi(IMASK);
+       p1.l = IMASK_IVG15;
+       p1.h = 0x0;
+       [p0] = p1;
+       csync;
+
+       raise 15;
+       p0.l = .LWAIT_HERE;
+       p0.h = .LWAIT_HERE;
+       reti = p0;
+#if ANOMALY_05000281
+       nop; nop; nop;
+#endif
+       rti;
+
+.LWAIT_HERE:
+       jump .LWAIT_HERE;
+ENDPROC(__start)
+
+/* A little BF561 glue ... */
+#ifndef WDOG_CTL
+# define WDOG_CTL WDOGA_CTL
+#endif
+
+ENTRY(_real_start)
+       /* Enable nested interrupts */
+       [--sp] = reti;
+
+       /* watchdog off for now */
+       p0.l = lo(WDOG_CTL);
+       p0.h = hi(WDOG_CTL);
+       r0 = 0xAD6(z);
+       w[p0] = r0;
+       ssync;
+
+       /* Zero out the bss region
+        * Note: this will fail if bss is 0 bytes ...
+        */
+       r0 = 0 (z);
+       r1.l = ___bss_start;
+       r1.h = ___bss_start;
+       r2.l = ___bss_stop;
+       r2.h = ___bss_stop;
+       r2 = r2 - r1;
+       r2 >>= 2;
+       p1 = r1;
+       p2 = r2;
+       lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2;
+.L_clear_bss:
+       [p1++] = r0;
+
+       /* In case there is a NULL pointer reference,
+        * zero out region before stext
+        */
+       p1 = r0;
+       r2.l = __stext;
+       r2.h = __stext;
+       r2 >>= 2;
+       p2 = r2;
+       lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2;
+.L_clear_zero:
+       [p1++] = r0;
+
+       /* Pass the u-boot arguments to the global value command line */
+       R0 = R7;
+       call _cmdline_init;
+
+       /* Load the current thread pointer and stack */
+       sp.l = _init_thread_union;
+       sp.h = _init_thread_union;
+       p1 = THREAD_SIZE (z);
+       sp = sp + p1;
+       usp = sp;
+       fp = sp;
+       jump.l _start_kernel;
+ENDPROC(_real_start)
+
+__FINIT
index 64d746114e4b2897ee28cc6c4a4d0091d0b5a6b3..62f8883a5c273e21ceefa5f867fb5876330d8b57 100644 (file)
@@ -71,6 +71,7 @@ atomic_t num_spurious;
 
 #ifdef CONFIG_PM
 unsigned long bfin_sic_iwr[3]; /* Up to 3 SIC_IWRx registers */
+unsigned vr_wakeup;
 #endif
 
 struct ivgx {
@@ -184,17 +185,56 @@ static void bfin_internal_unmask_irq(unsigned int irq)
 #ifdef CONFIG_PM
 int bfin_internal_set_wake(unsigned int irq, unsigned int state)
 {
-       unsigned bank, bit;
+       unsigned bank, bit, wakeup = 0;
        unsigned long flags;
        bank = SIC_SYSIRQ(irq) / 32;
        bit = SIC_SYSIRQ(irq) % 32;
 
+       switch (irq) {
+#ifdef IRQ_RTC
+       case IRQ_RTC:
+       wakeup |= WAKE;
+       break;
+#endif
+#ifdef IRQ_CAN0_RX
+       case IRQ_CAN0_RX:
+       wakeup |= CANWE;
+       break;
+#endif
+#ifdef IRQ_CAN1_RX
+       case IRQ_CAN1_RX:
+       wakeup |= CANWE;
+       break;
+#endif
+#ifdef IRQ_USB_INT0
+       case IRQ_USB_INT0:
+       wakeup |= USBWE;
+       break;
+#endif
+#ifdef IRQ_KEY
+       case IRQ_KEY:
+       wakeup |= KPADWE;
+       break;
+#endif
+#ifdef IRQ_CNT
+       case IRQ_CNT:
+       wakeup |= ROTWE;
+       break;
+#endif
+       default:
+       break;
+       }
+
        local_irq_save(flags);
 
-       if (state)
+       if (state) {
                bfin_sic_iwr[bank] |= (1 << bit);
-       else
+               vr_wakeup  |= wakeup;
+
+       } else {
                bfin_sic_iwr[bank] &= ~(1 << bit);
+               vr_wakeup  &= ~wakeup;
+       }
 
        local_irq_restore(flags);
 
@@ -943,6 +983,11 @@ int __init init_arch_irq(void)
 
        local_irq_disable();
 
+#if defined(CONFIG_BF527) || defined(CONFIG_BF536) || defined(CONFIG_BF537)
+       /* Clear EMAC Interrupt Status bits so we can demux it later */
+       bfin_write_EMAC_SYSTAT(-1);
+#endif
+
 #ifdef CONFIG_BF54x
 # ifdef CONFIG_PINTx_REASSIGN
        pint[0]->assign = CONFIG_PINT0_ASSIGN;
@@ -1028,13 +1073,22 @@ int __init init_arch_irq(void)
            IMASK_IVG10 | IMASK_IVG9 | IMASK_IVG8 | IMASK_IVG7 | IMASK_IVGHW;
 
 #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561)
-       bfin_write_SIC_IWR0(IWR_ENABLE_ALL);
-       bfin_write_SIC_IWR1(IWR_ENABLE_ALL);
+       bfin_write_SIC_IWR0(IWR_DISABLE_ALL);
+#if defined(CONFIG_BF52x)
+       /* BF52x system reset does not properly reset SIC_IWR1 which
+        * will screw up the bootrom as it relies on MDMA0/1 waking it
+        * up from IDLE instructions.  See this report for more info:
+        * http://blackfin.uclinux.org/gf/tracker/4323
+        */
+       bfin_write_SIC_IWR1(IWR_ENABLE(10) | IWR_ENABLE(11));
+#else
+       bfin_write_SIC_IWR1(IWR_DISABLE_ALL);
+#endif
 # ifdef CONFIG_BF54x
-       bfin_write_SIC_IWR2(IWR_ENABLE_ALL);
+       bfin_write_SIC_IWR2(IWR_DISABLE_ALL);
 # endif
 #else
-       bfin_write_SIC_IWR(IWR_ENABLE_ALL);
+       bfin_write_SIC_IWR(IWR_DISABLE_ALL);
 #endif
 
        return 0;
index 30b887e67dd6776def5ef53238ebe3fead7a6bbd..9daf01201e9fd86e111ffa4b85ca0e5dd4974788 100644 (file)
  */
 
 #include <linux/linkage.h>
-#include <asm/cplb.h>
 #include <asm/blackfin.h>
 
 .text
 
-#ifdef CONFIG_BFIN_ICACHE_LOCK
-
 /* When you come here, it is assumed that
  * R0 - Which way to be locked
  */
@@ -189,18 +186,38 @@ ENTRY(_cache_lock)
        RTS;
 ENDPROC(_cache_lock)
 
-#endif /* BFIN_ICACHE_LOCK */
-
-/* Return the ILOC bits of IMEM_CONTROL
+/* Invalidate the Entire Instruction cache by
+ * disabling IMC bit
  */
+ENTRY(_invalidate_entire_icache)
+       [--SP] = ( R7:5);
 
-ENTRY(_read_iloc)
-       P1.H = HI(IMEM_CONTROL);
-       P1.L = LO(IMEM_CONTROL);
-       R1 = 0xF;
-       R0 = [P1];
-       R0 = R0 >> 3;
-       R0 = R0 & R1;
+       P0.L = LO(IMEM_CONTROL);
+       P0.H = HI(IMEM_CONTROL);
+       R7 = [P0];
+
+       /* Clear the IMC bit , All valid bits in the instruction
+        * cache are set to the invalid state
+        */
+       BITCLR(R7,IMC_P);
+       CLI R6;
+       SSYNC;          /* SSYNC required before invalidating cache. */
+       .align 8;
+       [P0] = R7;
+       SSYNC;
+       STI R6;
+
+       /* Configures the instruction cache agian */
+       R6 = (IMC | ENICPLB);
+       R7 = R7 | R6;
+
+       CLI R6;
+       SSYNC;          /* SSYNC required before writing to IMEM_CONTROL. */
+       .align 8;
+       [P0] = R7;
+       SSYNC;
+       STI R6;
 
+       ( R7:5) = [SP++];
        RTS;
-ENDPROC(_read_iloc)
+ENDPROC(_invalidate_entire_icache)
index 4fe6a2366b133e2a9e0a5101d9728f3394335e73..e28c6af1f4158e12b89bcecbee68363ede5d5745 100644 (file)
@@ -83,13 +83,22 @@ void bfin_pm_suspend_standby_enter(void)
        bfin_pm_standby_restore();
 
 #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x)  || defined(CONFIG_BF561)
-       bfin_write_SIC_IWR0(IWR_ENABLE_ALL);
-       bfin_write_SIC_IWR1(IWR_ENABLE_ALL);
+       bfin_write_SIC_IWR0(IWR_DISABLE_ALL);
+#if defined(CONFIG_BF52x)
+       /* BF52x system reset does not properly reset SIC_IWR1 which
+        * will screw up the bootrom as it relies on MDMA0/1 waking it
+        * up from IDLE instructions.  See this report for more info:
+        * http://blackfin.uclinux.org/gf/tracker/4323
+        */
+       bfin_write_SIC_IWR1(IWR_ENABLE(10) | IWR_ENABLE(11));
+#else
+       bfin_write_SIC_IWR1(IWR_DISABLE_ALL);
+#endif
 # ifdef CONFIG_BF54x
-       bfin_write_SIC_IWR2(IWR_ENABLE_ALL);
+       bfin_write_SIC_IWR2(IWR_DISABLE_ALL);
 # endif
 #else
-       bfin_write_SIC_IWR(IWR_ENABLE_ALL);
+       bfin_write_SIC_IWR(IWR_DISABLE_ALL);
 #endif
 
        local_irq_restore(flags);
@@ -229,28 +238,12 @@ int bfin_pm_suspend_mem_enter(void)
        wakeup = bfin_read_VR_CTL() & ~FREQ;
        wakeup |= SCKELOW;
 
-       /* FIXME: merge this somehow with set_irq_wake */
-#ifdef CONFIG_PM_BFIN_WAKE_RTC
-       wakeup |= WAKE;
-#endif
 #ifdef CONFIG_PM_BFIN_WAKE_PH6
        wakeup |= PHYWE;
 #endif
-#ifdef CONFIG_PM_BFIN_WAKE_CAN
-       wakeup |= CANWE;
-#endif
 #ifdef CONFIG_PM_BFIN_WAKE_GP
        wakeup |= GPWE;
 #endif
-#ifdef CONFIG_PM_BFIN_WAKE_USB
-       wakeup |= USBWE;
-#endif
-#ifdef CONFIG_PM_BFIN_WAKE_KEYPAD
-       wakeup |= KPADWE;
-#endif
-#ifdef CONFIG_PM_BFIN_WAKE_ROTARY
-       wakeup |= ROTWE;
-#endif
 
        local_irq_save(flags);
 
@@ -268,7 +261,7 @@ int bfin_pm_suspend_mem_enter(void)
        icache_disable();
        bf53x_suspend_l1_mem(memptr);
 
-       do_hibernate(wakeup);   /* Goodbye */
+       do_hibernate(wakeup | vr_wakeup);       /* Goodbye */
 
        bf53x_resume_l1_mem(memptr);
 
index 5af3c31c9365a8962d1d8d89a081f8764c16fa0f..9d2be43ac3da97fcc0360ff68dd0f4aadf9d6e00 100644 (file)
@@ -66,7 +66,7 @@ static struct sram_piece free_l1_data_B_sram_head, used_l1_data_B_sram_head;
 static struct sram_piece free_l1_inst_sram_head, used_l1_inst_sram_head;
 #endif
 
-#ifdef L2_LENGTH
+#if L2_LENGTH != 0
 static struct sram_piece free_l2_sram_head, used_l2_sram_head;
 #endif
 
@@ -175,7 +175,7 @@ static void __init l1_inst_sram_init(void)
 
 static void __init l2_sram_init(void)
 {
-#ifdef L2_LENGTH
+#if L2_LENGTH != 0
        free_l2_sram_head.next =
                kmem_cache_alloc(sram_piece_cache, GFP_KERNEL);
        if (!free_l2_sram_head.next) {
@@ -367,7 +367,7 @@ int sram_free(const void *addr)
                 && addr < (void *)(L1_DATA_B_START + L1_DATA_B_LENGTH))
                return l1_data_B_sram_free(addr);
 #endif
-#ifdef L2_LENGTH
+#if L2_LENGTH != 0
        else if (addr >= (void *)L2_START
                 && addr < (void *)(L2_START + L2_LENGTH))
                return l2_sram_free(addr);
@@ -604,7 +604,7 @@ int l1sram_free(const void *addr)
 
 void *l2_sram_alloc(size_t size)
 {
-#ifdef L2_LENGTH
+#if L2_LENGTH != 0
        unsigned flags;
        void *addr;
 
@@ -640,7 +640,7 @@ EXPORT_SYMBOL(l2_sram_zalloc);
 
 int l2_sram_free(const void *addr)
 {
-#ifdef L2_LENGTH
+#if L2_LENGTH != 0
        unsigned flags;
        int ret;
 
@@ -779,7 +779,7 @@ static int sram_proc_read(char *buf, char **start, off_t offset, int count,
                        &free_l1_inst_sram_head, &used_l1_inst_sram_head))
                goto not_done;
 #endif
-#ifdef L2_LENGTH
+#if L2_LENGTH != 0
        if (_sram_proc_read(buf, &len, count, "L2",
                        &free_l2_sram_head, &used_l2_sram_head))
                goto not_done;
diff --git a/arch/ia64/configs/sn2_defconfig b/arch/ia64/configs/sn2_defconfig
deleted file mode 100644 (file)
index 7f6b237..0000000
+++ /dev/null
@@ -1,1285 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.23
-# Thu Oct 18 16:03:40 2007
-#
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# General setup
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-CONFIG_LOCALVERSION=""
-# CONFIG_LOCALVERSION_AUTO is not set
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-CONFIG_SYSVIPC_SYSCTL=y
-CONFIG_POSIX_MQUEUE=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_TASKSTATS=y
-# CONFIG_TASK_DELAY_ACCT is not set
-CONFIG_TASK_XACCT=y
-CONFIG_TASK_IO_ACCOUNTING=y
-# CONFIG_USER_NS is not set
-# CONFIG_AUDIT is not set
-# CONFIG_IKCONFIG is not set
-CONFIG_LOG_BUF_SHIFT=20
-CONFIG_CGROUPS=y
-CONFIG_CPUSETS=y
-CONFIG_FAIR_GROUP_SCHED=y
-CONFIG_FAIR_USER_SCHED=y
-CONFIG_SYSFS_DEPRECATED=y
-CONFIG_RELAY=y
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_SYSCTL=y
-# CONFIG_EMBEDDED is not set
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_KALLSYMS=y
-CONFIG_KALLSYMS_ALL=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=y
-CONFIG_ANON_INODES=y
-CONFIG_EPOLL=y
-CONFIG_SIGNALFD=y
-CONFIG_EVENTFD=y
-CONFIG_SHMEM=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_SLUB_DEBUG=y
-# CONFIG_SLAB is not set
-CONFIG_SLUB=y
-# CONFIG_SLOB is not set
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-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
-CONFIG_STOP_MACHINE=y
-CONFIG_BLOCK=y
-# CONFIG_BLK_DEV_IO_TRACE is not set
-CONFIG_BLK_DEV_BSG=y
-CONFIG_BLOCK_COMPAT=y
-
-#
-# 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
-#
-CONFIG_IA64=y
-CONFIG_64BIT=y
-CONFIG_QUICKLIST=y
-CONFIG_MMU=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y
-CONFIG_GENERIC_FIND_NEXT_BIT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_TIME=y
-CONFIG_GENERIC_TIME_VSYSCALL=y
-CONFIG_DMI=y
-CONFIG_EFI=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-CONFIG_IA64_UNCACHED_ALLOCATOR=y
-CONFIG_AUDIT_ARCH=y
-# CONFIG_IA64_GENERIC is not set
-# CONFIG_IA64_DIG is not set
-# CONFIG_IA64_HP_ZX1 is not set
-# CONFIG_IA64_HP_ZX1_SWIOTLB is not set
-CONFIG_IA64_SGI_SN2=y
-# CONFIG_IA64_HP_SIM is not set
-# CONFIG_ITANIUM is not set
-CONFIG_MCKINLEY=y
-# CONFIG_IA64_PAGE_SIZE_4KB is not set
-# CONFIG_IA64_PAGE_SIZE_8KB is not set
-# CONFIG_IA64_PAGE_SIZE_16KB is not set
-CONFIG_IA64_PAGE_SIZE_64KB=y
-CONFIG_PGTABLE_3=y
-# CONFIG_PGTABLE_4 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_IA64_L1_CACHE_SHIFT=7
-# CONFIG_IA64_CYCLONE is not set
-CONFIG_IOSAPIC=y
-CONFIG_IA64_SGI_SN_XP=m
-CONFIG_FORCE_MAX_ZONEORDER=17
-CONFIG_SMP=y
-CONFIG_NR_CPUS=1024
-# CONFIG_HOTPLUG_CPU is not set
-CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
-CONFIG_SCHED_SMT=y
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=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_SPARSEMEM_VMEMMAP_ENABLE=y
-CONFIG_SPLIT_PTLOCK_CPUS=4
-CONFIG_MIGRATION=y
-CONFIG_RESOURCES_64BIT=y
-CONFIG_ZONE_DMA_FLAG=0
-CONFIG_NR_QUICK=1
-CONFIG_VIRT_TO_BUS=y
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_SPARSEMEM_ENABLE=y
-CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
-CONFIG_NUMA=y
-CONFIG_NODES_SHIFT=10
-CONFIG_ARCH_POPULATES_NODE_MAP=y
-CONFIG_VIRTUAL_MEM_MAP=y
-CONFIG_HOLES_IN_ZONE=y
-CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
-CONFIG_HAVE_ARCH_NODEDATA_EXTENSION=y
-CONFIG_IA32_SUPPORT=y
-CONFIG_COMPAT=y
-CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
-CONFIG_IA64_MCA_RECOVERY=y
-CONFIG_PERFMON=y
-CONFIG_IA64_PALINFO=y
-CONFIG_IA64_MC_ERR_INJECT=y
-CONFIG_SGI_SN=y
-# CONFIG_IA64_ESI is not set
-# CONFIG_IA64_HP_AML_NFW is not set
-
-#
-# SN Devices
-#
-CONFIG_SGI_IOC3=y
-
-#
-# Firmware Drivers
-#
-CONFIG_EFI_VARS=y
-CONFIG_EFI_PCDP=y
-CONFIG_DMIID=y
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-
-#
-# Power management and ACPI
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_ACPI=y
-# CONFIG_ACPI_PROCFS is not set
-CONFIG_ACPI_PROC_EVENT=y
-# CONFIG_ACPI_BUTTON is not set
-# CONFIG_ACPI_FAN is not set
-# CONFIG_ACPI_DOCK is not set
-# CONFIG_ACPI_PROCESSOR is not set
-CONFIG_ACPI_NUMA=y
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-# CONFIG_ACPI_CONTAINER is not set
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI, PCMCIA)
-#
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PCI_SYSCALL=y
-CONFIG_PCIEPORTBUS=y
-CONFIG_HOTPLUG_PCI_PCIE=y
-CONFIG_PCIEAER=y
-CONFIG_ARCH_SUPPORTS_MSI=y
-# CONFIG_PCI_MSI is not set
-# CONFIG_PCI_DEBUG is not set
-CONFIG_HOTPLUG_PCI=y
-# CONFIG_HOTPLUG_PCI_FAKE is not set
-# CONFIG_HOTPLUG_PCI_ACPI is not set
-# CONFIG_HOTPLUG_PCI_CPCI is not set
-# CONFIG_HOTPLUG_PCI_SHPC is not set
-CONFIG_HOTPLUG_PCI_SGI=y
-# CONFIG_PCCARD is not set
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-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
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_FIB_HASH=y
-# CONFIG_IP_PNP 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=m
-CONFIG_INET_XFRM_MODE_TRANSPORT=y
-CONFIG_INET_XFRM_MODE_TUNNEL=y
-CONFIG_INET_XFRM_MODE_BEET=y
-CONFIG_INET_LRO=y
-CONFIG_INET_DIAG=m
-CONFIG_INET_TCP_DIAG=m
-# 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=m
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-# CONFIG_IPV6_OPTIMISTIC_DAD is not set
-# CONFIG_INET6_AH is not set
-# CONFIG_INET6_ESP is not set
-# CONFIG_INET6_IPCOMP is not set
-# CONFIG_IPV6_MIP6 is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
-CONFIG_INET6_XFRM_MODE_TRANSPORT=m
-CONFIG_INET6_XFRM_MODE_TUNNEL=m
-CONFIG_INET6_XFRM_MODE_BEET=m
-# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-CONFIG_IPV6_SIT=m
-# CONFIG_IPV6_TUNNEL is not set
-# CONFIG_IPV6_MULTIPLE_TABLES is not set
-# CONFIG_NETWORK_SECMARK is not set
-# CONFIG_NETFILTER is not set
-# CONFIG_IP_DCCP is not set
-# CONFIG_IP_SCTP is not set
-# 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_AF_RXRPC is not set
-
-#
-# Wireless
-#
-# CONFIG_CFG80211 is not set
-# CONFIG_WIRELESS_EXT is not set
-# CONFIG_MAC80211 is not set
-# CONFIG_IEEE80211 is not set
-# CONFIG_RFKILL is not set
-# CONFIG_NET_9P is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-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
-# CONFIG_CONNECTOR is not set
-# CONFIG_MTD is not set
-# CONFIG_PARPORT is not set
-CONFIG_PNP=y
-# CONFIG_PNP_DEBUG is not set
-
-#
-# Protocols
-#
-CONFIG_PNPACPI=y
-CONFIG_BLK_DEV=y
-# 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=m
-CONFIG_BLK_DEV_NBD=m
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-# CONFIG_CDROM_PKTCDVD is not set
-CONFIG_ATA_OVER_ETH=m
-CONFIG_MISC_DEVICES=y
-# CONFIG_PHANTOM is not set
-# CONFIG_EEPROM_93CX6 is not set
-CONFIG_SGI_IOC4=y
-# CONFIG_TIFM_CORE 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=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 is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-CONFIG_IDE_PROC_FS=y
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_BLK_DEV_PLATFORM is not set
-# CONFIG_BLK_DEV_IDEPNP is not set
-
-#
-# PCI IDE chipsets support
-#
-CONFIG_BLK_DEV_IDEPCI=y
-CONFIG_IDEPCI_SHARE_IRQ=y
-CONFIG_IDEPCI_PCIBUS_ORDER=y
-# CONFIG_BLK_DEV_OFFBOARD is not set
-# CONFIG_BLK_DEV_GENERIC is not set
-# CONFIG_BLK_DEV_OPTI621 is not set
-CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_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
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-CONFIG_BLK_DEV_SGIIOC4=y
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-# CONFIG_BLK_DEV_TC86C001 is not set
-# CONFIG_IDE_ARM is not set
-CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=y
-CONFIG_SCSI_DMA=y
-# CONFIG_SCSI_TGT is not set
-CONFIG_SCSI_NETLINK=y
-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=m
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-# CONFIG_SCSI_MULTI_LUN is not set
-CONFIG_SCSI_CONSTANTS=y
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-CONFIG_SCSI_WAIT_SCAN=m
-
-#
-# SCSI Transports
-#
-CONFIG_SCSI_SPI_ATTRS=y
-CONFIG_SCSI_FC_ATTRS=y
-CONFIG_SCSI_ISCSI_ATTRS=m
-CONFIG_SCSI_SAS_ATTRS=y
-CONFIG_SCSI_SAS_LIBSAS=y
-# CONFIG_SCSI_SAS_ATA is not set
-# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set
-CONFIG_SCSI_SRP_ATTRS=y
-CONFIG_SCSI_LOWLEVEL=y
-CONFIG_ISCSI_TCP=m
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_ACARD is not set
-# 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_ADVANSYS 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=y
-CONFIG_SCSI_QLA_FC=y
-# 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_DEBUG is not set
-# CONFIG_SCSI_SRP is not set
-CONFIG_ATA=y
-CONFIG_ATA_NONSTANDARD=y
-CONFIG_ATA_ACPI=y
-# 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=y
-# CONFIG_SATA_INIC162X is not set
-# CONFIG_PATA_ACPI 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_CMD640_PCI 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_NS87415 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_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=y
-# CONFIG_MD_RAID5_RESHAPE is not set
-CONFIG_MD_MULTIPATH=y
-# CONFIG_MD_FAULTY is not set
-CONFIG_BLK_DEV_DM=y
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-# CONFIG_DM_MULTIPATH_RDAC is not set
-# CONFIG_DM_DELAY is not set
-CONFIG_FUSION=y
-CONFIG_FUSION_SPI=y
-CONFIG_FUSION_FC=y
-CONFIG_FUSION_SAS=y
-CONFIG_FUSION_MAX_SGE=128
-CONFIG_FUSION_CTL=m
-CONFIG_FUSION_LOGGING=y
-
-#
-# IEEE 1394 (FireWire) support
-#
-# CONFIG_FIREWIRE is not set
-# CONFIG_IEEE1394 is not set
-# CONFIG_I2O is not set
-CONFIG_NETDEVICES=y
-# CONFIG_NETDEVICES_MULTIQUEUE is not set
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_MACVLAN is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-# CONFIG_VETH is not set
-# CONFIG_NET_SB1000 is not set
-# CONFIG_IP1000 is not set
-# CONFIG_ARCNET is not set
-# CONFIG_NET_ETHERNET is not set
-CONFIG_NETDEV_1000=y
-# CONFIG_ACENIC is not set
-# CONFIG_DL2K is not set
-# CONFIG_E1000 is not set
-# CONFIG_E1000E 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=y
-# CONFIG_BNX2 is not set
-# CONFIG_QLA3XXX is not set
-# CONFIG_ATL1 is not set
-CONFIG_NETDEV_10000=y
-CONFIG_CHELSIO_T1=m
-CONFIG_CHELSIO_T1_1G=y
-# CONFIG_CHELSIO_T1_NAPI is not set
-CONFIG_CHELSIO_T3=m
-CONFIG_IXGBE=m
-# CONFIG_IXGB is not set
-CONFIG_S2IO=m
-# CONFIG_S2IO_NAPI is not set
-# CONFIG_MYRI10GE is not set
-# CONFIG_NETXEN_NIC is not set
-# CONFIG_NIU is not set
-# CONFIG_MLX4_CORE is not set
-# CONFIG_TEHUTI is not set
-# CONFIG_TR is not set
-
-#
-# Wireless LAN
-#
-# CONFIG_WLAN_PRE80211 is not set
-# CONFIG_WLAN_80211 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_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=y
-# CONFIG_NETCONSOLE_DYNAMIC is not set
-CONFIG_NETPOLL=y
-# CONFIG_NETPOLL_TRAP is not set
-CONFIG_NET_POLL_CONTROLLER=y
-# CONFIG_ISDN is not set
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-# CONFIG_INPUT_FF_MEMLESS is not set
-# CONFIG_INPUT_POLLDEV is not set
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_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_TABLET is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-# CONFIG_SERIO is not set
-# CONFIG_GAMEPORT is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-# CONFIG_VT_UNICODE is not set
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_VT_HW_CONSOLE_BINDING is not set
-CONFIG_SERIAL_NONSTANDARD=y
-# CONFIG_COMPUTONE is not set
-# CONFIG_ROCKETPORT is not set
-# CONFIG_CYCLADES is not set
-# CONFIG_DIGIEPCA is not set
-# CONFIG_MOXA_INTELLIO is not set
-# CONFIG_MOXA_SMARTIO is not set
-# CONFIG_MOXA_SMARTIO_NEW is not set
-# CONFIG_ISI is not set
-# CONFIG_SYNCLINKMP is not set
-# CONFIG_SYNCLINK_GT is not set
-# CONFIG_N_HDLC is not set
-# CONFIG_SPECIALIX is not set
-# CONFIG_SX is not set
-# CONFIG_RIO is not set
-# CONFIG_STALDRV is not set
-CONFIG_SGI_SNSC=y
-CONFIG_SGI_TIOCX=y
-CONFIG_SGI_MBCS=m
-
-#
-# Serial drivers
-#
-# CONFIG_SERIAL_8250 is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_SERIAL_SGI_L1_CONSOLE=y
-# CONFIG_SERIAL_JSM is not set
-CONFIG_SERIAL_SGI_IOC4=y
-CONFIG_SERIAL_SGI_IOC3=y
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-# CONFIG_IPMI_HANDLER is not set
-# CONFIG_WATCHDOG is not set
-# CONFIG_HW_RANDOM is not set
-CONFIG_EFI_RTC=y
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-CONFIG_RAW_DRIVER=m
-CONFIG_MAX_RAW_DEVS=256
-# CONFIG_HPET is not set
-# CONFIG_HANGCHECK_TIMER is not set
-CONFIG_MMTIMER=y
-# CONFIG_TCG_TPM is not set
-CONFIG_DEVPORT=y
-# CONFIG_I2C is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-# CONFIG_W1 is not set
-# CONFIG_POWER_SUPPLY is not set
-# CONFIG_HWMON is not set
-
-#
-# Sonics Silicon Backplane
-#
-CONFIG_SSB_POSSIBLE=y
-# CONFIG_SSB is not set
-
-#
-# Multifunction device drivers
-#
-# CONFIG_MFD_SM501 is not set
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-# CONFIG_DVB_CORE is not set
-# CONFIG_DAB is not set
-
-#
-# Graphics support
-#
-CONFIG_AGP=y
-CONFIG_AGP_SGI_TIOCA=y
-# CONFIG_DRM is not set
-# CONFIG_VGASTATE is not set
-CONFIG_VIDEO_OUTPUT_CONTROL=m
-# CONFIG_FB is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Display device support
-#
-# CONFIG_DISPLAY_SUPPORT is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-CONFIG_DUMMY_CONSOLE=y
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-CONFIG_HID_SUPPORT=y
-CONFIG_HID=y
-CONFIG_HID_DEBUG=y
-# CONFIG_HIDRAW is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_HID_FF is not set
-# CONFIG_USB_HIDDEV is not set
-
-#
-# USB HID Boot Protocol drivers
-#
-# CONFIG_USB_KBD is not set
-# CONFIG_USB_MOUSE is not set
-CONFIG_USB_SUPPORT=y
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-# CONFIG_USB_DEVICEFS is not set
-CONFIG_USB_DEVICE_CLASS=y
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_PERSIST is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-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_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=m
-# 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
-# CONFIG_USB_R8A66597_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 is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK 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_BERRY_CHARGE 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_IOWARRIOR is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-# CONFIG_MMC is not set
-# CONFIG_NEW_LEDS is not set
-CONFIG_INFINIBAND=m
-# CONFIG_INFINIBAND_USER_MAD is not set
-CONFIG_INFINIBAND_USER_ACCESS=m
-CONFIG_INFINIBAND_USER_MEM=y
-CONFIG_INFINIBAND_ADDR_TRANS=y
-CONFIG_INFINIBAND_MTHCA=m
-CONFIG_INFINIBAND_MTHCA_DEBUG=y
-# CONFIG_INFINIBAND_AMSO1100 is not set
-# CONFIG_INFINIBAND_CXGB3 is not set
-# CONFIG_MLX4_INFINIBAND is not set
-CONFIG_INFINIBAND_IPOIB=m
-# CONFIG_INFINIBAND_IPOIB_CM is not set
-CONFIG_INFINIBAND_IPOIB_DEBUG=y
-# CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set
-CONFIG_INFINIBAND_SRP=m
-# CONFIG_INFINIBAND_ISER is not set
-# CONFIG_RTC_CLASS is not set
-
-#
-# Userspace I/O
-#
-# CONFIG_UIO is not set
-CONFIG_MSPEC=y
-
-#
-# 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 is not set
-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 is not set
-CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=y
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-CONFIG_REISERFS_FS_XATTR=y
-CONFIG_REISERFS_FS_POSIX_ACL=y
-CONFIG_REISERFS_FS_SECURITY=y
-# CONFIG_JFS_FS is not set
-CONFIG_FS_POSIX_ACL=y
-CONFIG_XFS_FS=y
-CONFIG_XFS_QUOTA=y
-# CONFIG_XFS_SECURITY is not set
-CONFIG_XFS_POSIX_ACL=y
-CONFIG_XFS_RT=y
-# 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=y
-CONFIG_QUOTA_NETLINK_INTERFACE=y
-CONFIG_PRINT_QUOTA_WARNING=y
-# CONFIG_QFMT_V1 is not set
-# CONFIG_QFMT_V2 is not set
-CONFIG_QUOTACTL=y
-CONFIG_DNOTIFY=y
-CONFIG_AUTOFS_FS=m
-CONFIG_AUTOFS4_FS=m
-CONFIG_FUSE_FS=m
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS is not set
-CONFIG_UDF_FS=m
-CONFIG_UDF_NLS=y
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=y
-# CONFIG_MSDOS_FS is not set
-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_HUGETLBFS=y
-CONFIG_HUGETLB_PAGE=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
-CONFIG_NETWORK_FILESYSTEMS=y
-CONFIG_NFS_FS=m
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
-CONFIG_NFS_V4=y
-CONFIG_NFS_DIRECTIO=y
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_SUNRPC_XPRT_RDMA=m
-# CONFIG_SUNRPC_BIND34 is not set
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-# CONFIG_SMB_NLS_DEFAULT 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
-
-#
-# 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=y
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_KARMA_PARTITION is not set
-CONFIG_EFI_PARTITION=y
-# CONFIG_SYSV68_PARTITION is not set
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
-CONFIG_NLS_CODEPAGE_437=y
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII 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
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-CONFIG_NLS_UTF8=y
-# CONFIG_DLM is not set
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-# CONFIG_CRC_CCITT is not set
-CONFIG_CRC16=m
-# CONFIG_CRC_ITU_T is not set
-CONFIG_CRC32=y
-# CONFIG_CRC7 is not set
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=m
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_GENERIC_ALLOCATOR=y
-CONFIG_PLIST=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAS_DMA=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_IRQ_PER_CPU=y
-
-#
-# Instrumentation Support
-#
-# CONFIG_PROFILING is not set
-# CONFIG_KPROBES is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_MAGIC_SYSRQ=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_SHIRQ is not set
-CONFIG_DETECT_SOFTLOCKUP=y
-CONFIG_SCHED_DEBUG=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_TIMER_STATS is not set
-# CONFIG_SLUB_DEBUG_ON 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_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_INFO=y
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_BOOT_PRINTK_DELAY is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_FAULT_INJECTION is not set
-CONFIG_IA64_GRANULE_16MB=y
-# CONFIG_IA64_GRANULE_64MB is not set
-# CONFIG_IA64_PRINT_HAZARDS is not set
-# CONFIG_DISABLE_VHPT is not set
-# CONFIG_IA64_DEBUG_CMPXCHG is not set
-# CONFIG_IA64_DEBUG_IRQ is not set
-CONFIG_SYSVIPC_COMPAT=y
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-CONFIG_XOR_BLOCKS=y
-CONFIG_ASYNC_CORE=y
-CONFIG_ASYNC_MEMCPY=y
-CONFIG_ASYNC_XOR=y
-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_XCBC is not set
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_MD4 is not set
-CONFIG_CRYPTO_MD5=y
-CONFIG_CRYPTO_SHA1=m
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_TGR192 is not set
-# CONFIG_CRYPTO_GF128MUL is not set
-CONFIG_CRYPTO_ECB=m
-CONFIG_CRYPTO_CBC=m
-CONFIG_CRYPTO_PCBC=m
-# CONFIG_CRYPTO_LRW is not set
-# CONFIG_CRYPTO_XTS is not set
-# CONFIG_CRYPTO_CRYPTD is not set
-CONFIG_CRYPTO_DES=m
-# CONFIG_CRYPTO_FCRYPT is not set
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_SEED is not set
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-CONFIG_CRYPTO_CRC32C=m
-# CONFIG_CRYPTO_CAMELLIA is not set
-# CONFIG_CRYPTO_TEST is not set
-# CONFIG_CRYPTO_AUTHENC is not set
-# CONFIG_CRYPTO_HW is not set
index 06efd1f9b800d9d209f201515ac094c28a8a2707..ff88c48c5d19a9ba07d047b784f05dfe89e55d2f 100644 (file)
@@ -262,7 +262,7 @@ ia32_syscall_table:
        data8 sys_uselib
        data8 sys_swapon
        data8 sys_reboot
-       data8 sys32_readdir
+       data8 compat_sys_old_readdir
        data8 sys32_mmap          /* 90 */
        data8 sys32_munmap
        data8 sys_truncate
index c5c872b250da5e420a661fb25223115fe2c7b424..dd0c53687a96d9f022b7a119d7f6310168c9a25c 100644 (file)
@@ -276,13 +276,6 @@ typedef struct compat_siginfo {
        } _sifields;
 } compat_siginfo_t;
 
-struct old_linux32_dirent {
-       u32     d_ino;
-       u32     d_offset;
-       u16     d_namlen;
-       char    d_name[1];
-};
-
 /*
  * IA-32 ELF specific definitions for IA-64.
  */
index 465116aecb85adf03880caf8285abeecc8c300e3..bf196cbb37969ca5016b937e2074e71b48a03fff 100644 (file)
@@ -1210,138 +1210,6 @@ sys32_settimeofday (struct compat_timeval __user *tv, struct timezone __user *tz
        return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL);
 }
 
-struct getdents32_callback {
-       struct compat_dirent __user *current_dir;
-       struct compat_dirent __user *previous;
-       int count;
-       int error;
-};
-
-struct readdir32_callback {
-       struct old_linux32_dirent __user * dirent;
-       int count;
-};
-
-static int
-filldir32 (void *__buf, const char *name, int namlen, loff_t offset, u64 ino,
-          unsigned int d_type)
-{
-       struct compat_dirent __user * dirent;
-       struct getdents32_callback * buf = (struct getdents32_callback *) __buf;
-       int reclen = ROUND_UP(offsetof(struct compat_dirent, d_name) + namlen + 1, 4);
-       u32 d_ino;
-
-       buf->error = -EINVAL;   /* only used if we fail.. */
-       if (reclen > buf->count)
-               return -EINVAL;
-       d_ino = ino;
-       if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
-               return -EOVERFLOW;
-       buf->error = -EFAULT;   /* only used if we fail.. */
-       dirent = buf->previous;
-       if (dirent)
-               if (put_user(offset, &dirent->d_off))
-                       return -EFAULT;
-       dirent = buf->current_dir;
-       buf->previous = dirent;
-       if (put_user(d_ino, &dirent->d_ino)
-           || put_user(reclen, &dirent->d_reclen)
-           || copy_to_user(dirent->d_name, name, namlen)
-           || put_user(0, dirent->d_name + namlen))
-               return -EFAULT;
-       dirent = (struct compat_dirent __user *) ((char __user *) dirent + reclen);
-       buf->current_dir = dirent;
-       buf->count -= reclen;
-       return 0;
-}
-
-asmlinkage long
-sys32_getdents (unsigned int fd, struct compat_dirent __user *dirent, unsigned int count)
-{
-       struct file * file;
-       struct compat_dirent __user * lastdirent;
-       struct getdents32_callback buf;
-       int error;
-
-       error = -EFAULT;
-       if (!access_ok(VERIFY_WRITE, dirent, count))
-               goto out;
-
-       error = -EBADF;
-       file = fget(fd);
-       if (!file)
-               goto out;
-
-       buf.current_dir = dirent;
-       buf.previous = NULL;
-       buf.count = count;
-       buf.error = 0;
-
-       error = vfs_readdir(file, filldir32, &buf);
-       if (error < 0)
-               goto out_putf;
-       error = buf.error;
-       lastdirent = buf.previous;
-       if (lastdirent) {
-               if (put_user(file->f_pos, &lastdirent->d_off))
-                       error = -EFAULT;
-               else
-                       error = count - buf.count;
-       }
-
-out_putf:
-       fput(file);
-out:
-       return error;
-}
-
-static int
-fillonedir32 (void * __buf, const char * name, int namlen, loff_t offset, u64 ino,
-             unsigned int d_type)
-{
-       struct readdir32_callback * buf = (struct readdir32_callback *) __buf;
-       struct old_linux32_dirent __user * dirent;
-       u32 d_ino;
-
-       if (buf->count)
-               return -EINVAL;
-       d_ino = ino;
-       if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
-               return -EOVERFLOW;
-       buf->count++;
-       dirent = buf->dirent;
-       if (put_user(d_ino, &dirent->d_ino)
-           || put_user(offset, &dirent->d_offset)
-           || put_user(namlen, &dirent->d_namlen)
-           || copy_to_user(dirent->d_name, name, namlen)
-           || put_user(0, dirent->d_name + namlen))
-               return -EFAULT;
-       return 0;
-}
-
-asmlinkage long
-sys32_readdir (unsigned int fd, void __user *dirent, unsigned int count)
-{
-       int error;
-       struct file * file;
-       struct readdir32_callback buf;
-
-       error = -EBADF;
-       file = fget(fd);
-       if (!file)
-               goto out;
-
-       buf.count = 0;
-       buf.dirent = dirent;
-
-       error = vfs_readdir(file, fillonedir32, &buf);
-       if (error >= 0)
-               error = buf.count;
-       fput(file);
-out:
-       return error;
-}
-
 struct sel_arg_struct {
        unsigned int n;
        unsigned int inp;
index 541be835fc5a16f7ee6019fa6f2812f3e310a1cb..e1d58f819d78bd7df803d4c3b7cb555281cc4d18 100644 (file)
@@ -9,7 +9,7 @@
 /* Maximum address we can use for the control code buffer */
 #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
 
-#define KEXEC_CONTROL_CODE_SIZE (8192 + 8192 + 4096)
+#define KEXEC_CONTROL_PAGE_SIZE (8192 + 8192 + 4096)
 
 /* The native architecture */
 #define KEXEC_ARCH KEXEC_ARCH_IA_64
index 3676468612b607fbfacbd4447941b1e1253cea48..da8f020d82c1f5acb7e20fc2dd6ef4a1b8d86333 100644 (file)
@@ -58,7 +58,7 @@ static struct local_tlb_flush_counts {
        unsigned int count;
 } __attribute__((__aligned__(32))) local_tlb_flush_counts[NR_CPUS];
 
-static DEFINE_PER_CPU(unsigned int, shadow_flush_counts[NR_CPUS]) ____cacheline_aligned;
+static DEFINE_PER_CPU(unsigned short, shadow_flush_counts[NR_CPUS]) ____cacheline_aligned;
 
 #define IPI_CALL_FUNC          0
 #define IPI_CPU_STOP           1
@@ -254,7 +254,7 @@ smp_local_flush_tlb(void)
 void
 smp_flush_tlb_cpumask(cpumask_t xcpumask)
 {
-       unsigned int *counts = __ia64_per_cpu_var(shadow_flush_counts);
+       unsigned short *counts = __ia64_per_cpu_var(shadow_flush_counts);
        cpumask_t cpumask = xcpumask;
        int mycpu, cpu, flush_mycpu = 0;
 
@@ -262,7 +262,7 @@ smp_flush_tlb_cpumask(cpumask_t xcpumask)
        mycpu = smp_processor_id();
 
        for_each_cpu_mask(cpu, cpumask)
-               counts[cpu] = local_tlb_flush_counts[cpu].count;
+               counts[cpu] = local_tlb_flush_counts[cpu].count & 0xffff;
 
        mb();
        for_each_cpu_mask(cpu, cpumask) {
@@ -276,7 +276,7 @@ smp_flush_tlb_cpumask(cpumask_t xcpumask)
                smp_local_flush_tlb();
 
        for_each_cpu_mask(cpu, cpumask)
-               while(counts[cpu] == local_tlb_flush_counts[cpu].count)
+               while(counts[cpu] == (local_tlb_flush_counts[cpu].count & 0xffff))
                        udelay(FLUSH_DELAY);
 
        preempt_enable();
index 77b15f80f1011eec04b8a63b6b62448b49fe9bb8..7545037a86254f1f5da925f9b96f80fafcfc1a33 100644 (file)
@@ -324,7 +324,6 @@ pcibios_setup_root_windows(struct pci_bus *bus, struct pci_controller *ctrl)
 struct pci_bus * __devinit
 pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
 {
-       struct pci_root_info info;
        struct pci_controller *controller;
        unsigned int windows = 0;
        struct pci_bus *pbus;
@@ -346,22 +345,24 @@ pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
        acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window,
                        &windows);
        if (windows) {
+               struct pci_root_info info;
+
                controller->window =
                        kmalloc_node(sizeof(*controller->window) * windows,
                                     GFP_KERNEL, controller->node);
                if (!controller->window)
                        goto out2;
-       }
 
-       name = kmalloc(16, GFP_KERNEL);
-       if (!name)
-               goto out3;
+               name = kmalloc(16, GFP_KERNEL);
+               if (!name)
+                       goto out3;
 
-       sprintf(name, "PCI Bus %04x:%02x", domain, bus);
-       info.controller = controller;
-       info.name = name;
-       acpi_walk_resources(device->handle, METHOD_NAME__CRS, add_window,
-                       &info);
+               sprintf(name, "PCI Bus %04x:%02x", domain, bus);
+               info.controller = controller;
+               info.name = name;
+               acpi_walk_resources(device->handle, METHOD_NAME__CRS,
+                       add_window, &info);
+       }
        /*
         * See arch/x86/pci/acpi.c.
         * The desired pci bus might already be scanned in a quirk. We
index fbe2932fa9e9660d0a896dea589d4ac1ad6e17c3..6251a4b10be7a9a2004592b6aa7dff7994c09b0e 100644 (file)
@@ -291,6 +291,28 @@ struct hvcall_mpp_data {
 };
 
 int h_get_mpp(struct hvcall_mpp_data *);
+
+#ifdef CONFIG_PPC_PSERIES
+extern int CMO_PrPSP;
+extern int CMO_SecPSP;
+extern unsigned long CMO_PageSize;
+
+static inline int cmo_get_primary_psp(void)
+{
+       return CMO_PrPSP;
+}
+
+static inline int cmo_get_secondary_psp(void)
+{
+       return CMO_SecPSP;
+}
+
+static inline unsigned long cmo_get_page_size(void)
+{
+       return CMO_PageSize;
+}
+#endif /* CONFIG_PPC_PSERIES */
+
 #endif /* __ASSEMBLY__ */
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_HVCALL_H */
index 048480e340f20c937c2d1d8c9b8ef1eee7388b49..da01b20aea5959a9c13447dfd30108f4e2c0513a 100644 (file)
@@ -6,12 +6,7 @@
 #ifndef _ASM_POWERPC_IDE_H
 #define _ASM_POWERPC_IDE_H
 
-#ifdef __KERNEL__
-
-#ifndef __powerpc64__
-#include <linux/sched.h>
-#include <asm/mpc8xx.h>
-#endif
+#include <linux/compiler.h>
 #include <asm/io.h>
 
 #define __ide_mm_insw(p, a, c) readsw((void __iomem *)(p), (a), (c))
 #define __ide_mm_outsw(p, a, c)        writesw((void __iomem *)(p), (a), (c))
 #define __ide_mm_outsl(p, a, c)        writesl((void __iomem *)(p), (a), (c))
 
-#ifndef  __powerpc64__
-#include <linux/ioport.h>
-
-/* FIXME: use ide_platform host driver */
-static __inline__ int ide_default_irq(unsigned long base)
-{
-#ifdef CONFIG_PPLUS
-       switch (base) {
-       case 0x1f0:     return 14;
-       case 0x170:     return 15;
-       }
-#endif
-       return 0;
-}
-
-/* FIXME: use ide_platform host driver */
-static __inline__ unsigned long ide_default_io_base(int index)
-{
-#ifdef CONFIG_PPLUS
-       switch (index) {
-       case 0:         return 0x1f0;
-       case 1:         return 0x170;
-       }
-#endif
-       return 0;
-}
-
-#ifdef CONFIG_BLK_DEV_MPC8xx_IDE
-#define IDE_ARCH_ACK_INTR  1
-#define ide_ack_intr(hwif) ((hwif)->ack_intr ? (hwif)->ack_intr(hwif) : 1)
-#endif
-
-#endif /* __powerpc64__ */
-
-#endif /* __KERNEL__ */
-
 #endif /* _ASM_POWERPC_IDE_H */
index 17ba3a881bfdff71d813d2030087b6ab04207ba0..5f68ecfdf516bf85d2094396363849647dae9ebd 100644 (file)
@@ -20,7 +20,7 @@
 #define TRACE_ENABLE_INTS      bl .trace_hardirqs_on
 #define TRACE_DISABLE_INTS     bl .trace_hardirqs_off
 #define TRACE_AND_RESTORE_IRQ_PARTIAL(en,skip) \
-       cmpdi   en, 0;                          \
+       cmpdi   en,0;                           \
        bne     95f;                            \
        stb     en,PACASOFTIRQEN(r13);          \
        bl      .trace_hardirqs_off;            \
@@ -29,7 +29,8 @@
        li      en,1;
 #define TRACE_AND_RESTORE_IRQ(en)              \
        TRACE_AND_RESTORE_IRQ_PARTIAL(en,96f);  \
-96:    stb     en,PACASOFTIRQEN(r13)
+       stb     en,PACASOFTIRQEN(r13);          \
+96:
 #else
 #define TRACE_ENABLE_INTS
 #define TRACE_DISABLE_INTS
index acdcdc66f1b6ed6ee499a8a453b56ed90f66c08c..3736d9b332896bb83ba0b9c5c7358e4510766386 100644 (file)
@@ -22,7 +22,7 @@
 #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
 #endif
 
-#define KEXEC_CONTROL_CODE_SIZE 4096
+#define KEXEC_CONTROL_PAGE_SIZE 4096
 
 /* The native architecture */
 #ifdef __powerpc64__
index 9102b8bf0ead02863ac30fcc0f055fa1cf41c743..6b993ef452ff8010c6c539f34145621fa6b3c4dd 100644 (file)
@@ -147,7 +147,6 @@ static inline void get_mmu_context(struct mm_struct *mm)
 static inline int init_new_context(struct task_struct *t, struct mm_struct *mm)
 {
        mm->context.id = NO_CONTEXT;
-       mm->context.vdso_base = 0;
        return 0;
 }
 
index e084272ed1c26f4d5dc985c254f9550093041875..f6cc7a43b4faadeb17f080794ff7e8d2a06f4a72 100644 (file)
@@ -92,7 +92,7 @@ COMPAT_SYS_SPU(readlink)
 SYSCALL(uselib)
 SYSCALL(swapon)
 SYSCALL(reboot)
-SYSX(sys_ni_syscall,old32_readdir,old_readdir)
+SYSX(sys_ni_syscall,compat_sys_old_readdir,old_readdir)
 SYSCALL_SPU(mmap)
 SYSCALL_SPU(munmap)
 SYSCALL_SPU(truncate)
index e0debcca0bfadaf03dbc6f3c35a56f1ad4a3aee2..a323c9b32ee12f76604631a532e2c5dc85436aa1 100644 (file)
@@ -86,6 +86,19 @@ static int __init parse_savemaxmem(char *p)
 }
 __setup("savemaxmem=", parse_savemaxmem);
 
+
+static size_t copy_oldmem_vaddr(void *vaddr, char *buf, size_t csize,
+                               unsigned long offset, int userbuf)
+{
+       if (userbuf) {
+               if (copy_to_user((char __user *)buf, (vaddr + offset), csize))
+                       return -EFAULT;
+       } else
+               memcpy(buf, (vaddr + offset), csize);
+
+       return csize;
+}
+
 /**
  * copy_oldmem_page - copy one page from "oldmem"
  * @pfn: page frame number to be copied
@@ -107,16 +120,16 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
        if (!csize)
                return 0;
 
-       vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0);
+       csize = min(csize, PAGE_SIZE);
 
-       if (userbuf) {
-               if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) {
-                       iounmap(vaddr);
-                       return -EFAULT;
-               }
-       } else
-               memcpy(buf, (vaddr + offset), csize);
+       if (pfn < max_pfn) {
+               vaddr = __va(pfn << PAGE_SHIFT);
+               csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
+       } else {
+               vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0);
+               csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
+               iounmap(vaddr);
+       }
 
-       iounmap(vaddr);
        return csize;
 }
index 99ee2f0f0f2bdcef067df7179e9614c459838983..8bb65751929948fbc35e29fce9fb899058d9b39a 100644 (file)
@@ -1155,7 +1155,7 @@ flush_tlbs:
        lis     r10, 0x40
 1:     addic.  r10, r10, -0x1000
        tlbie   r10
-       blt     1b
+       bgt     1b
        sync
        blr
 
index 9d42eb57aea3305f1ad866f6709c988363681891..a06362223f8d984e699f84ad9a25859609607887 100644 (file)
@@ -233,17 +233,6 @@ void ibmebus_free_irq(u32 ist, void *dev_id)
 }
 EXPORT_SYMBOL(ibmebus_free_irq);
 
-static ssize_t name_show(struct device *dev,
-                        struct device_attribute *attr, char *buf)
-{
-       return sprintf(buf, "%s\n", to_of_device(dev)->node->name);
-}
-
-static struct device_attribute ibmebus_dev_attrs[] = {
-       __ATTR_RO(name),
-       __ATTR_NULL
-};
-
 static char *ibmebus_chomp(const char *in, size_t count)
 {
        char *out = kmalloc(count + 1, GFP_KERNEL);
@@ -327,7 +316,6 @@ static struct bus_attribute ibmebus_bus_attrs[] = {
 
 struct bus_type ibmebus_bus_type = {
        .uevent    = of_device_uevent,
-       .dev_attrs = ibmebus_dev_attrs,
        .bus_attrs = ibmebus_bus_attrs
 };
 EXPORT_SYMBOL(ibmebus_bus_type);
index 1a09719c7628219b5f75ededaf848ec8158fa227..b3eef30b5131a0d1eaf43551ae0d0aa2ccda6d92 100644 (file)
@@ -416,6 +416,8 @@ static void pseries_cmo_data(struct seq_file *m)
        unsigned long cmo_faults = 0;
        unsigned long cmo_fault_time = 0;
 
+       seq_printf(m, "cmo_enabled=%d\n", firmware_has_feature(FW_FEATURE_CMO));
+
        if (!firmware_has_feature(FW_FEATURE_CMO))
                return;
 
@@ -427,6 +429,9 @@ static void pseries_cmo_data(struct seq_file *m)
        seq_printf(m, "cmo_faults=%lu\n", cmo_faults);
        seq_printf(m, "cmo_fault_time_usec=%lu\n",
                   cmo_fault_time / tb_ticks_per_usec);
+       seq_printf(m, "cmo_primary_psp=%d\n", cmo_get_primary_psp());
+       seq_printf(m, "cmo_secondary_psp=%d\n", cmo_get_secondary_psp());
+       seq_printf(m, "cmo_page_size=%lu\n", cmo_get_page_size());
 }
 
 static int pseries_lparcfg_data(struct seq_file *m, void *v)
index cbaa34196797ea55a67afbfa9a79a3fc74384e59..ae63a964b858049f63a47e446e96bb54295a6c0c 100644 (file)
@@ -51,7 +51,7 @@ void default_machine_kexec(struct kimage *image)
                                                relocate_new_kernel_size);
 
        flush_icache_range(reboot_code_buffer,
-                               reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE);
+                               reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE);
        printk(KERN_INFO "Bye!\n");
 
        /* now call it */
index 6321ae36f7292d03cce3eab12db6a43369464df7..7a6dfbca76821bd5e49cbbb04fcda1d045441907 100644 (file)
@@ -899,7 +899,7 @@ relocate_new_kernel:
 
        /* set a new stack at the bottom of our page... */
        /* (not really needed now) */
-       addi    r1, r4, KEXEC_CONTROL_CODE_SIZE - 8 /* for LR Save+Back Chain */
+       addi    r1, r4, KEXEC_CONTROL_PAGE_SIZE - 8 /* for LR Save+Back Chain */
        stw     r0, 0(r1)
 
        /* Do the copies */
index af07003573c476d5347967f4667328d49ab68022..7ff292475269f10fb1e1e4ad85270587c4756d15 100644 (file)
@@ -99,18 +99,3 @@ void module_arch_cleanup(struct module *mod)
 {
        module_bug_cleanup(mod);
 }
-
-struct bug_entry *module_find_bug(unsigned long bugaddr)
-{
-       struct mod_arch_specific *mod;
-       unsigned int i;
-       struct bug_entry *bug;
-
-       list_for_each_entry(mod, &module_bug_list, bug_list) {
-               bug = mod->bug_table;
-               for (i = 0; i < mod->num_bugs; ++i, ++bug)
-                       if (bugaddr == bug->bug_addr)
-                               return bug;
-       }
-       return NULL;
-}
index 709f8cb8bfca1475e2157420bc3092d8d2893186..d98634c76060e735290c03f0fabff5d635437e8c 100644 (file)
 #include <asm/ppc-pci.h>
 #include <asm/syscalls.h>
 
-struct old_linux_dirent32 {
-       u32             d_ino;
-       u32             d_offset;
-       unsigned short  d_namlen;
-       char            d_name[1];
-};
-
-struct readdir_callback32 {
-       struct old_linux_dirent32 __user * dirent;
-       int count;
-};
-
-static int fillonedir(void * __buf, const char * name, int namlen,
-                                 off_t offset, u64 ino, unsigned int d_type)
-{
-       struct readdir_callback32 * buf = (struct readdir_callback32 *) __buf;
-       struct old_linux_dirent32 __user * dirent;
-       ino_t d_ino;
-
-       if (buf->count)
-               return -EINVAL;
-       d_ino = ino;
-       if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
-               return -EOVERFLOW;
-       buf->count++;
-       dirent = buf->dirent;
-       put_user(d_ino, &dirent->d_ino);
-       put_user(offset, &dirent->d_offset);
-       put_user(namlen, &dirent->d_namlen);
-       copy_to_user(dirent->d_name, name, namlen);
-       put_user(0, dirent->d_name + namlen);
-       return 0;
-}
-
-asmlinkage int old32_readdir(unsigned int fd, struct old_linux_dirent32 __user *dirent, unsigned int count)
-{
-       int error = -EBADF;
-       struct file * file;
-       struct readdir_callback32 buf;
-
-       file = fget(fd);
-       if (!file)
-               goto out;
-
-       buf.count = 0;
-       buf.dirent = dirent;
-
-       error = vfs_readdir(file, (filldir_t)fillonedir, &buf);
-       if (error < 0)
-               goto out_putf;
-       error = buf.count;
-
-out_putf:
-       fput(file);
-out:
-       return error;
-}
 
 asmlinkage long ppc32_select(u32 n, compat_ulong_t __user *inp,
                compat_ulong_t __user *outp, compat_ulong_t __user *exp,
index 22a3c33fd7513c5288cef156f931f62a1c4f41df..2750fbab1975b2e7e4c84d48a67589385aeb9e40 100644 (file)
@@ -1113,7 +1113,7 @@ static int vio_bus_probe(struct device *dev)
                                return error;
                }
                error = viodrv->probe(viodev, id);
-               if (error)
+               if (error && firmware_has_feature(FW_FEATURE_CMO))
                        vio_cmo_bus_remove(viodev);
        }
 
index f7edba6cb795d55944009cc376ff171cdddefa09..c9bb7cfd3dca8069434a9071860a6b99cff19022 100644 (file)
@@ -206,11 +206,6 @@ static int spu_run_init(struct spu_context *ctx, u32 *npc)
                        (SPU_RUNCNTL_RUNNABLE | SPU_RUNCNTL_ISOLATE);
                if (runcntl == 0)
                        runcntl = SPU_RUNCNTL_RUNNABLE;
-       }
-
-       if (ctx->flags & SPU_CREATE_NOSCHED) {
-               spuctx_switch_state(ctx, SPU_UTIL_USER);
-               ctx->ops->runcntl_write(ctx, runcntl);
        } else {
                unsigned long privcntl;
 
@@ -219,9 +214,15 @@ static int spu_run_init(struct spu_context *ctx, u32 *npc)
                else
                        privcntl = SPU_PRIVCNTL_MODE_NORMAL;
 
-               ctx->ops->npc_write(ctx, *npc);
                ctx->ops->privcntl_write(ctx, privcntl);
-               ctx->ops->runcntl_write(ctx, runcntl);
+               ctx->ops->npc_write(ctx, *npc);
+       }
+
+       ctx->ops->runcntl_write(ctx, runcntl);
+
+       if (ctx->flags & SPU_CREATE_NOSCHED) {
+               spuctx_switch_state(ctx, SPU_UTIL_USER);
+       } else {
 
                if (ctx->state == SPU_STATE_SAVED) {
                        ret = spu_activate(ctx, 0);
index 2deeeba7eccfc9c555d5d32aca370507f08268be..1c1b627ee8436dc8e2fce9098d274183b8f18011 100644 (file)
@@ -641,8 +641,10 @@ static struct spu *find_victim(struct spu_context *ctx)
 
                        if (tmp && tmp->prio > ctx->prio &&
                            !(tmp->flags & SPU_CREATE_NOSCHED) &&
-                           (!victim || tmp->prio > victim->prio))
+                           (!victim || tmp->prio > victim->prio)) {
                                victim = spu->ctx;
+                               get_spu_context(victim);
+                       }
                }
                mutex_unlock(&cbe_spu_info[node].list_mutex);
 
@@ -658,6 +660,7 @@ static struct spu *find_victim(struct spu_context *ctx)
                         * look at another context or give up after X retries.
                         */
                        if (!mutex_trylock(&victim->state_mutex)) {
+                               put_spu_context(victim);
                                victim = NULL;
                                goto restart;
                        }
@@ -670,6 +673,7 @@ static struct spu *find_victim(struct spu_context *ctx)
                                 * restart the search.
                                 */
                                mutex_unlock(&victim->state_mutex);
+                               put_spu_context(victim);
                                victim = NULL;
                                goto restart;
                        }
@@ -687,6 +691,7 @@ static struct spu *find_victim(struct spu_context *ctx)
                                spu_add_to_rq(victim);
 
                        mutex_unlock(&victim->state_mutex);
+                       put_spu_context(victim);
 
                        return spu;
                }
@@ -985,9 +990,11 @@ static int spusched_thread(void *unused)
                                struct spu_context *ctx = spu->ctx;
 
                                if (ctx) {
+                                       get_spu_context(ctx);
                                        mutex_unlock(mtx);
                                        spusched_tick(ctx);
                                        mutex_lock(mtx);
+                                       put_spu_context(ctx);
                                }
                        }
                        mutex_unlock(mtx);
@@ -1030,7 +1037,7 @@ void spuctx_switch_state(struct spu_context *ctx,
                node = spu->node;
                if (old_state == SPU_UTIL_USER)
                        atomic_dec(&cbe_spu_info[node].busy_spus);
-               if (new_state == SPU_UTIL_USER);
+               if (new_state == SPU_UTIL_USER)
                        atomic_inc(&cbe_spu_info[node].busy_spus);
        }
 }
index a437267c6bf86efb7443a44bfbf9ed693614371a..d967c1893ab5f1a8093f3fea1225ff240124ec12 100644 (file)
@@ -2,6 +2,7 @@
 #define _PSERIES_PLPAR_WRAPPERS_H
 
 #include <asm/hvcall.h>
+#include <asm/page.h>
 
 static inline long poll_pending(void)
 {
@@ -44,12 +45,34 @@ static inline long register_slb_shadow(unsigned long cpu, unsigned long vpa)
 
 static inline long plpar_page_set_loaned(unsigned long vpa)
 {
-       return plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, vpa, 0);
+       unsigned long cmo_page_sz = cmo_get_page_size();
+       long rc = 0;
+       int i;
+
+       for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)
+               rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, vpa + i, 0);
+
+       for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)
+               plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE,
+                                  vpa + i - cmo_page_sz, 0);
+
+       return rc;
 }
 
 static inline long plpar_page_set_active(unsigned long vpa)
 {
-       return plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, vpa, 0);
+       unsigned long cmo_page_sz = cmo_get_page_size();
+       long rc = 0;
+       int i;
+
+       for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)
+               rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, vpa + i, 0);
+
+       for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)
+               plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED,
+                                  vpa + i - cmo_page_sz, 0);
+
+       return rc;
 }
 
 extern void vpa_init(int cpu);
index 063a0d2fba30e2576771a300460220c4e21c4cec..3ce8a139b85d20b16aac2c9ca82746720f74951b 100644 (file)
@@ -68,6 +68,9 @@
 #include "plpar_wrappers.h"
 #include "pseries.h"
 
+int CMO_PrPSP = -1;
+int CMO_SecPSP = -1;
+unsigned long CMO_PageSize = (ASM_CONST(1) << IOMMU_PAGE_SHIFT);
 
 int fwnmi_active;  /* TRUE if an FWNMI handler is present */
 
@@ -325,8 +328,7 @@ void pSeries_cmo_feature_init(void)
 {
        char *ptr, *key, *value, *end;
        int call_status;
-       int PrPSP = -1;
-       int SecPSP = -1;
+       int page_order = IOMMU_PAGE_SHIFT;
 
        pr_debug(" -> fw_cmo_feature_init()\n");
        spin_lock(&rtas_data_buf_lock);
@@ -365,21 +367,31 @@ void pSeries_cmo_feature_init(void)
                                break;
                        }
 
-                       if (0 == strcmp(key, "PrPSP"))
-                               PrPSP = simple_strtol(value, NULL, 10);
+                       if (0 == strcmp(key, "CMOPageSize"))
+                               page_order = simple_strtol(value, NULL, 10);
+                       else if (0 == strcmp(key, "PrPSP"))
+                               CMO_PrPSP = simple_strtol(value, NULL, 10);
                        else if (0 == strcmp(key, "SecPSP"))
-                               SecPSP = simple_strtol(value, NULL, 10);
+                               CMO_SecPSP = simple_strtol(value, NULL, 10);
                        value = key = ptr + 1;
                }
                ptr++;
        }
 
-       if (PrPSP != -1 || SecPSP != -1) {
+       /* Page size is returned as the power of 2 of the page size,
+        * convert to the page size in bytes before returning
+        */
+       CMO_PageSize = 1 << page_order;
+       pr_debug("CMO_PageSize = %lu\n", CMO_PageSize);
+
+       if (CMO_PrPSP != -1 || CMO_SecPSP != -1) {
                pr_info("CMO enabled\n");
-               pr_debug("CMO enabled, PrPSP=%d, SecPSP=%d\n", PrPSP, SecPSP);
+               pr_debug("CMO enabled, PrPSP=%d, SecPSP=%d\n", CMO_PrPSP,
+                        CMO_SecPSP);
                powerpc_firmware_features |= FW_FEATURE_CMO;
        } else
-               pr_debug("CMO not enabled, PrPSP=%d, SecPSP=%d\n", PrPSP, SecPSP);
+               pr_debug("CMO not enabled, PrPSP=%d, SecPSP=%d\n", CMO_PrPSP,
+                        CMO_SecPSP);
        spin_unlock(&rtas_data_buf_lock);
        pr_debug(" <- fw_cmo_feature_init()\n");
 }
index f219c6411e0be1145b10676603a69f25385f9ce2..bb729b84a21e4c3c48b3a290676236c12d6a4616 100644 (file)
@@ -31,7 +31,7 @@
 #define KEXEC_CONTROL_MEMORY_LIMIT (1UL<<31)
 
 /* Allocate one page for the pdp and the second for the code */
-#define KEXEC_CONTROL_CODE_SIZE 4096
+#define KEXEC_CONTROL_PAGE_SIZE 4096
 
 /* The native architecture */
 #define KEXEC_ARCH KEXEC_ARCH_S390
index 025d4fe55a581e4ba57e2c50095647c573598905..fd1612590bf4feb96e7d9e714da12203cf300ac5 100644 (file)
@@ -140,6 +140,10 @@ static struct sh_mobile_lcdc_info lcdc_info = {
                        .vsync_len = 1,
                        .sync = 0, /* hsync and vsync are active low */
                },
+               .lcd_size_cfg = { /* 7.0 inch */
+                       .width = 152,
+                       .height = 91,
+               },
                .board_cfg = {
                        .display_on = ap320_wvga_power_on,
                },
index e499ee384d58d79304850b6fefa390768cccb61c..714dce91cc9bbb30684764c33eef963c09844866 100644 (file)
@@ -224,6 +224,10 @@ static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = {
                        .vsync_len = 2,
                        .sync = 0,
                },
+               .lcd_size_cfg = { /* 7.0 inch */
+                       .width = 152,
+                       .height = 91,
+               },
        }
 #endif
 #ifdef CONFIG_SH_MIGOR_QVGA
@@ -245,6 +249,10 @@ static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = {
                        .vsync_len = 2,
                        .sync = FB_SYNC_HOR_HIGH_ACT,
                },
+               .lcd_size_cfg = { /* 2.4 inch */
+                       .width = 49,
+                       .height = 37,
+               },
                .board_cfg = {
                        .setup_sys = migor_lcd_qvga_setup,
                },
index 925f16af71217d1e31bdea1a08d60df4076197ed..23850da05e3c8a6d53ce30b95dc89df59f7ebea3 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/input.h>
 #include <linux/mtd/physmap.h>
-#include <asm/io.h>
+#include <linux/fb.h>
+#include <linux/io.h>
 #include <asm/sh7763rdp.h>
+#include <asm/sh_eth.h>
+#include <asm/sh7760fb.h>
 
 /* NOR Flash */
 static struct mtd_partition sh7763rdp_nor_flash_partitions[] = {
@@ -60,8 +63,85 @@ static struct platform_device sh7763rdp_nor_flash_device = {
        },
 };
 
+/* SH-Ether */
+static struct resource sh_eth_resources[] = {
+       {
+               .start  = 0xFEE00800,   /* use eth1 */
+               .end    = 0xFEE00F7C - 1,
+               .flags  = IORESOURCE_MEM,
+       }, {
+               .start  = 58,   /* irq number */
+               .end    = 58,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct sh_eth_plat_data sh7763_eth_pdata = {
+       .phy = 1,
+       .edmac_endian = EDMAC_LITTLE_ENDIAN,
+};
+
+static struct platform_device sh7763rdp_eth_device = {
+       .name       = "sh-eth",
+       .resource   = sh_eth_resources,
+       .num_resources  = ARRAY_SIZE(sh_eth_resources),
+       .dev        = {
+               .platform_data = &sh7763_eth_pdata,
+       },
+};
+
+/* SH7763 LCDC */
+static struct resource sh7763rdp_fb_resources[] = {
+       {
+               .start  = 0xFFE80000,
+               .end    = 0xFFE80442 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct fb_videomode sh7763fb_videomode = {
+       .refresh = 60,
+       .name = "VGA Monitor",
+       .xres = 640,
+       .yres = 480,
+       .pixclock = 10000,
+       .left_margin = 80,
+       .right_margin = 24,
+       .upper_margin = 30,
+       .lower_margin = 1,
+       .hsync_len = 96,
+       .vsync_len = 1,
+       .sync = 0,
+       .vmode = FB_VMODE_NONINTERLACED,
+       .flag = FBINFO_FLAG_DEFAULT,
+};
+
+static struct sh7760fb_platdata sh7763fb_def_pdata = {
+       .def_mode = &sh7763fb_videomode,
+       .ldmtr = (LDMTR_TFT_COLOR_16|LDMTR_MCNT),
+       .lddfr = LDDFR_16BPP_RGB565,
+       .ldpmmr = 0x0000,
+       .ldpspr = 0xFFFF,
+       .ldaclnr = 0x0001,
+       .ldickr = 0x1102,
+       .rotate = 0,
+       .novsync = 0,
+       .blank = NULL,
+};
+
+static struct platform_device sh7763rdp_fb_device = {
+       .name           = "sh7760-lcdc",
+       .resource       = sh7763rdp_fb_resources,
+       .num_resources = ARRAY_SIZE(sh7763rdp_fb_resources),
+       .dev = {
+               .platform_data = &sh7763fb_def_pdata,
+       },
+};
+
 static struct platform_device *sh7763rdp_devices[] __initdata = {
        &sh7763rdp_nor_flash_device,
+       &sh7763rdp_eth_device,
+       &sh7763rdp_fb_device,
 };
 
 static int __init sh7763rdp_devices_setup(void)
@@ -69,7 +149,7 @@ static int __init sh7763rdp_devices_setup(void)
        return platform_add_devices(sh7763rdp_devices,
                                    ARRAY_SIZE(sh7763rdp_devices));
 }
-__initcall(sh7763rdp_devices_setup);
+device_initcall(sh7763rdp_devices_setup);
 
 static void __init sh7763rdp_setup(char **cmdline_p)
 {
index abc5b6d418fed086e5c82f96c0c33d91892c2f61..a70d23b21788e99db83270818cd71939909d7be7 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Renesas SH-X3 Prototype Board Support.
  *
- * Copyright (C) 2007 Paul Mundt
+ * Copyright (C) 2007 - 2008 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
@@ -13,6 +13,7 @@
 #include <linux/platform_device.h>
 #include <linux/kernel.h>
 #include <linux/io.h>
+#include <linux/smc91x.h>
 #include <asm/ilsel.h>
 
 static struct resource heartbeat_resources[] = {
@@ -30,6 +31,10 @@ static struct platform_device heartbeat_device = {
        .resource       = heartbeat_resources,
 };
 
+static struct smc91x_platdata smc91x_info = {
+       .flags  = SMC91X_USE_16BIT | SMC91X_NOWAIT,
+};
+
 static struct resource smc91x_resources[] = {
        [0] = {
                .start          = 0x18000300,
@@ -47,6 +52,9 @@ static struct platform_device smc91x_device = {
        .id             = -1,
        .resource       = smc91x_resources,
        .num_resources  = ARRAY_SIZE(smc91x_resources),
+       .dev    = {
+               .platform_data = &smc91x_info,
+       },
 };
 
 static struct resource r8a66597_usb_host_resources[] = {
index 83f3fe5db3e535d0c4fa4329b68599b15c36d7b7..baf830c4a7e40189616755c9602f17fd78cf71c0 100644 (file)
@@ -1,15 +1,17 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.26-rc4
-# Fri Jun  6 12:20:17 2008
+# Linux kernel version: 2.6.27-rc2
+# Fri Aug  8 13:44:20 2008
 #
 CONFIG_SUPERH=y
 CONFIG_SUPERH32=y
+CONFIG_ARCH_DEFCONFIG="arch/sh/configs/shx3_defconfig"
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 CONFIG_GENERIC_BUG=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=y
@@ -19,7 +21,6 @@ CONFIG_LOCKDEP_SUPPORT=y
 # CONFIG_ARCH_HAS_ILOG2_U32 is not set
 # CONFIG_ARCH_HAS_ILOG2_U64 is not set
 CONFIG_ARCH_NO_VIRT_TO_BUS=y
-CONFIG_ARCH_SUPPORTS_AOUT=y
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
@@ -83,10 +84,16 @@ CONFIG_PROFILING=y
 # CONFIG_MARKERS is not set
 CONFIG_OPROFILE=y
 CONFIG_HAVE_OPROFILE=y
+# CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set
+# CONFIG_HAVE_IOREMAP_PROT is not set
 # CONFIG_HAVE_KPROBES is not set
 # CONFIG_HAVE_KRETPROBES is not set
+# CONFIG_HAVE_ARCH_TRACEHOOK is not set
 # CONFIG_HAVE_DMA_ATTRS is not set
+# CONFIG_USE_GENERIC_SMP_HELPERS is not set
+CONFIG_HAVE_CLK=y
 CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
 CONFIG_SLABINFO=y
 CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
@@ -96,12 +103,13 @@ CONFIG_MODULES=y
 # CONFIG_MODULE_UNLOAD is not set
 # CONFIG_MODVERSIONS is not set
 # CONFIG_MODULE_SRCVERSION_ALL is not set
-# CONFIG_KMOD is not set
+CONFIG_KMOD=y
 CONFIG_BLOCK=y
 # CONFIG_LBD is not set
 # CONFIG_BLK_DEV_IO_TRACE is not set
 # CONFIG_LSF is not set
 # CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
 
 #
 # IO Schedulers
@@ -177,6 +185,7 @@ CONFIG_PAGE_SIZE_4KB=y
 # CONFIG_PAGE_SIZE_8KB is not set
 # CONFIG_PAGE_SIZE_16KB is not set
 # CONFIG_PAGE_SIZE_64KB is not set
+CONFIG_ENTRY_OFFSET=0x00001000
 CONFIG_SELECT_MEMORY_MODEL=y
 # CONFIG_FLATMEM_MANUAL is not set
 # CONFIG_DISCONTIGMEM_MANUAL is not set
@@ -258,6 +267,7 @@ CONFIG_HZ=250
 # CONFIG_SCHED_HRTICK is not set
 # CONFIG_KEXEC is not set
 # CONFIG_CRASH_DUMP is not set
+CONFIG_SECCOMP=y
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -282,10 +292,6 @@ CONFIG_CMDLINE="console=ttySC2,115200 root=/dev/sda1 rootdelay=10"
 #
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
-
-#
-# Networking
-#
 CONFIG_NET=y
 
 #
@@ -361,6 +367,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
 #
 # CONFIG_CFG80211 is not set
 CONFIG_WIRELESS_EXT=y
+CONFIG_WIRELESS_EXT_SYSFS=y
 # CONFIG_MAC80211 is not set
 # CONFIG_IEEE80211 is not set
 # CONFIG_RFKILL is not set
@@ -377,6 +384,8 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
 CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
 # CONFIG_SYS_HYPERVISOR is not set
 # CONFIG_CONNECTOR is not set
 CONFIG_MTD=y
@@ -471,6 +480,7 @@ CONFIG_BLK_DEV=y
 # CONFIG_BLK_DEV_RAM is not set
 # CONFIG_CDROM_PKTCDVD is not set
 # CONFIG_ATA_OVER_ETH is not set
+# CONFIG_BLK_DEV_HD is not set
 # CONFIG_MISC_DEVICES is not set
 CONFIG_HAVE_IDE=y
 # CONFIG_IDE is not set
@@ -515,10 +525,10 @@ CONFIG_SCSI_WAIT_SCAN=m
 CONFIG_SCSI_LOWLEVEL=y
 # CONFIG_ISCSI_TCP is not set
 # CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_DH is not set
 # CONFIG_ATA is not set
 # CONFIG_MD is not set
 CONFIG_NETDEVICES=y
-# CONFIG_NETDEVICES_MULTIQUEUE is not set
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_MACVLAN is not set
@@ -546,7 +556,9 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_AX88796 is not set
 # CONFIG_STNIC is not set
+CONFIG_SH_ETH=y
 # CONFIG_SMC91X is not set
+# CONFIG_SMC911X is not set
 # CONFIG_IBM_NEW_EMAC_ZMII is not set
 # CONFIG_IBM_NEW_EMAC_RGMII is not set
 # CONFIG_IBM_NEW_EMAC_TAH is not set
@@ -613,7 +625,11 @@ CONFIG_INPUT=y
 #
 # Character devices
 #
-# CONFIG_VT is not set
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
 CONFIG_DEVKMEM=y
 # CONFIG_SERIAL_NONSTANDARD is not set
 
@@ -644,6 +660,7 @@ CONFIG_HW_RANDOM=y
 # CONFIG_POWER_SUPPLY is not set
 # CONFIG_HWMON is not set
 # CONFIG_THERMAL is not set
+# CONFIG_THERMAL_HWMON is not set
 # CONFIG_WATCHDOG is not set
 
 #
@@ -655,6 +672,7 @@ CONFIG_SSB_POSSIBLE=y
 #
 # Multifunction device drivers
 #
+# CONFIG_MFD_CORE is not set
 # CONFIG_MFD_SM501 is not set
 # CONFIG_HTC_PASIC3 is not set
 
@@ -679,7 +697,34 @@ CONFIG_SSB_POSSIBLE=y
 #
 # CONFIG_VGASTATE is not set
 # CONFIG_VIDEO_OUTPUT_CONTROL is not set
-# CONFIG_FB is not set
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+CONFIG_FB_FOREIGN_ENDIAN=y
+CONFIG_FB_BOTH_ENDIAN=y
+# CONFIG_FB_BIG_ENDIAN is not set
+# CONFIG_FB_LITTLE_ENDIAN is not set
+# CONFIG_FB_SYS_FOPS is not set
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_SH_MOBILE_LCDC is not set
+CONFIG_FB_SH7760=y
+# CONFIG_FB_VIRTUAL is not set
 # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
@@ -688,8 +733,22 @@ CONFIG_SSB_POSSIBLE=y
 # CONFIG_DISPLAY_SUPPORT is not set
 
 #
-# Sound
-#
+# Console display driver support
+#
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+CONFIG_LOGO=y
+CONFIG_LOGO_LINUX_MONO=y
+CONFIG_LOGO_LINUX_VGA16=y
+CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_LOGO_SUPERH_MONO=y
+CONFIG_LOGO_SUPERH_VGA16=y
+CONFIG_LOGO_SUPERH_CLUT224=y
 # CONFIG_SOUND is not set
 # CONFIG_HID_SUPPORT is not set
 CONFIG_USB_SUPPORT=y
@@ -788,11 +847,27 @@ CONFIG_USB_MON=y
 # CONFIG_USB_IOWARRIOR is not set
 # CONFIG_USB_ISIGHTFW is not set
 # CONFIG_USB_GADGET is not set
-# CONFIG_MMC is not set
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_UNSAFE_RESUME is not set
+
+#
+# MMC/SD Card Drivers
+#
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_BLOCK_BOUNCE=y
+# CONFIG_SDIO_UART is not set
+# CONFIG_MMC_TEST is not set
+
+#
+# MMC/SD Host Controller Drivers
+#
+# CONFIG_MMC_SDHCI is not set
 # CONFIG_MEMSTICK is not set
 # CONFIG_NEW_LEDS is not set
 # CONFIG_ACCESSIBILITY is not set
 # CONFIG_RTC_CLASS is not set
+# CONFIG_DMADEVICES is not set
 # CONFIG_UIO is not set
 
 #
@@ -865,6 +940,7 @@ CONFIG_TMPFS_POSIX_ACL=y
 # CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
 # CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
 # CONFIG_HPFS_FS is not set
 # CONFIG_QNX4FS_FS is not set
 # CONFIG_ROMFS_FS is not set
@@ -874,12 +950,11 @@ CONFIG_NETWORK_FILESYSTEMS=y
 CONFIG_NFS_FS=y
 # CONFIG_NFS_V3 is not set
 # CONFIG_NFS_V4 is not set
-# CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
+# CONFIG_NFSD is not set
 CONFIG_LOCKD=y
 CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_BIND34 is not set
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
 # CONFIG_SMB_FS is not set
@@ -949,6 +1024,7 @@ CONFIG_FRAME_WARN=1024
 # CONFIG_HEADERS_CHECK is not set
 # CONFIG_DEBUG_KERNEL is not set
 # CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_MEMORY_INIT is not set
 # CONFIG_SAMPLES is not set
 # CONFIG_SH_STANDARD_BIOS is not set
 # CONFIG_EARLY_SCIF_CONSOLE is not set
@@ -1003,6 +1079,10 @@ CONFIG_CRYPTO=y
 # CONFIG_CRYPTO_MD4 is not set
 # CONFIG_CRYPTO_MD5 is not set
 # CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
 # CONFIG_CRYPTO_SHA1 is not set
 # CONFIG_CRYPTO_SHA256 is not set
 # CONFIG_CRYPTO_SHA512 is not set
@@ -1042,6 +1122,7 @@ CONFIG_BITREVERSE=y
 # CONFIG_GENERIC_FIND_FIRST_BIT is not set
 # CONFIG_CRC_CCITT is not set
 # CONFIG_CRC16 is not set
+CONFIG_CRC_T10DIF=y
 # CONFIG_CRC_ITU_T is not set
 CONFIG_CRC32=y
 # CONFIG_CRC7 is not set
index 0cc800299e06176ddda13085fa5369a48e19fdf1..d3b2b4f109e36ec68a61c7244ef7d4d48e9c335f 100644 (file)
 #define        flat_get_relocate_addr(rel)             (rel)
 #define        flat_set_persistent(relval, p)          ({ (void)p; 0; })
 
+#define FLAT_PLAT_INIT(_r) \
+  do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \
+       _r->regs[4]=0; _r->regs[5]=0; _r->regs[6]=0; _r->regs[7]=0; \
+       _r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \
+       _r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; \
+       _r->sr = SR_FD; } while (0)
+
 #endif /* __ASM_SH_FLAT_H */
index 00f4260ef09b5cbeb0547d7b4daca53ccf407af1..765a5e1660fc787de8e80a471307b162c4e83307 100644 (file)
@@ -21,7 +21,7 @@
 /* Maximum address we can use for the control code buffer */
 #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
 
-#define KEXEC_CONTROL_CODE_SIZE        4096
+#define KEXEC_CONTROL_PAGE_SIZE        4096
 
 /* The native architecture */
 #define KEXEC_ARCH KEXEC_ARCH_SH
index 10016e0f4a4e7c0986d5cef42441d566f2d5c432..c12b632c540bc27a18f6d350ff9e680a23a79b9b 100644 (file)
@@ -42,9 +42,6 @@
 
 #define PORT_MSELCRB 0xa4050182
 
-#define MSTPCR1 0xa4150034
-#define MSTPCR2 0xa4150038
-
 #define PORT_PSELA 0xa405014e
 #define PORT_PSELB 0xa4050150
 #define PORT_PSELC 0xa4050152
index 27677727df4dda34aabb60f54dcfd02a677198ab..130102f663f593eaceff1b884a4db798edad6731 100644 (file)
@@ -47,12 +47,18 @@ struct sh_mobile_lcdc_board_cfg {
        void (*display_off)(void *board_data);
 };
 
+struct sh_mobile_lcdc_lcd_size_cfg { /* width and height of panel in mm */
+       unsigned long width;
+       unsigned long height;
+};
+
 struct sh_mobile_lcdc_chan_cfg {
        int chan;
        int bpp;
        int interface_type; /* selects RGBn or SYSn I/F, see above */
        int clock_divider;
        struct fb_videomode lcd_cfg;
+       struct sh_mobile_lcdc_lcd_size_cfg lcd_size_cfg;
        struct sh_mobile_lcdc_board_cfg board_cfg;
        struct sh_mobile_lcdc_sys_bus_cfg sys_bus_cfg; /* only for SYSn I/F */
 };
index abc90988080750041fdbf73befcb057fd19cd95f..1ac27aae6700d377f5f3ea3b46ad8b8ddcd7b021 100644 (file)
@@ -29,6 +29,16 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long addr, unsigned l
 void flush_dcache_page(struct page *pg);
 void flush_icache_range(unsigned long start, unsigned long end);
 void flush_icache_page(struct vm_area_struct *vma, struct page *page);
+
+#define flush_dcache_mmap_lock(mapping)                do { } while (0)
+#define flush_dcache_mmap_unlock(mapping)      do { } while (0)
+
+/* SH3 has unified cache so no special action needed here */
+#define flush_cache_sigtramp(vaddr)            do { } while (0)
+#define flush_icache_user_range(vma,pg,adr,len)        do { } while (0)
+
+#define p3_cache_init()                                do { } while (0)
+
 #else
 #include <cpu-common/cpu/cacheflush.h>
 #endif
index cd6baffdc89624684f2fe0e88f8d4e173d292e02..a7412cede534f6cd5e3ef16d060cf1324f8bcd4b 100644 (file)
@@ -45,7 +45,7 @@ static struct platform_device vpu_device = {
 };
 
 static struct uio_info veu0_platform_data = {
-       .name = "VEU",
+       .name = "VEU2H",
        .version = "0",
        .irq = 54,
 };
@@ -73,7 +73,7 @@ static struct platform_device veu0_device = {
 };
 
 static struct uio_info veu1_platform_data = {
-       .name = "VEU",
+       .name = "VEU2H",
        .version = "0",
        .irq = 27,
 };
index 8f916536719c81261b443225d85e618baff4bd50..6e1b1c2716584a8bc79ab206098465029a700eea 100644 (file)
@@ -107,10 +107,12 @@ DECLARE_EXPORT(__movmemSI12_i4);
  * GCC >= 4.2 emits these for division, as do GCC 4.1.x versions of the ST
  * compiler which include backported patches.
  */
-DECLARE_EXPORT(__sdivsi3_i4i);
 DECLARE_EXPORT(__udiv_qrnnd_16);
+#if !defined(CONFIG_CPU_SH2)
+DECLARE_EXPORT(__sdivsi3_i4i);
 DECLARE_EXPORT(__udivsi3_i4i);
 #endif
+#endif
 #else /* GCC 3.x */
 DECLARE_EXPORT(__movstr_i4_even);
 DECLARE_EXPORT(__movstr_i4_odd);
index 9c131cac91a4e45a54a7233d430c72a5490f1c7e..8a03926ea84f21076c96b2775b49e4d27c7b0caf 100644 (file)
@@ -181,10 +181,12 @@ config ENTRY_OFFSET
 choice
        prompt "HugeTLB page size"
        depends on HUGETLB_PAGE && (CPU_SH4 || CPU_SH5) && MMU
+       default HUGETLB_PAGE_SIZE_1MB if PAGE_SIZE_64KB
        default HUGETLB_PAGE_SIZE_64K
 
 config HUGETLB_PAGE_SIZE_64K
        bool "64kB"
+       depends on !PAGE_SIZE_64KB
 
 config HUGETLB_PAGE_SIZE_256K
        bool "256kB"
index b2ce014401b5516ed8ae51c4ca98cf5d0c4a026e..895bb3f335c77f39481191e54739e8871674f7a1 100644 (file)
@@ -95,6 +95,29 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
 }
 EXPORT_SYMBOL(dma_cache_sync);
 
+static int __init memchunk_setup(char *str)
+{
+       return 1; /* accept anything that begins with "memchunk." */
+}
+__setup("memchunk.", memchunk_setup);
+
+static void memchunk_cmdline_override(char *name, unsigned long *sizep)
+{
+       char *p = boot_command_line;
+       int k = strlen(name);
+
+       while ((p = strstr(p, "memchunk."))) {
+               p += 9; /* strlen("memchunk.") */
+               if (!strncmp(name, p, k) && p[k] == '=') {
+                       p += k + 1;
+                       *sizep = memparse(p, NULL);
+                       pr_info("%s: forcing memory chunk size to 0x%08lx\n",
+                               name, *sizep);
+                       break;
+               }
+       }
+}
+
 int platform_resource_setup_memory(struct platform_device *pdev,
                                   char *name, unsigned long memsize)
 {
@@ -109,6 +132,10 @@ int platform_resource_setup_memory(struct platform_device *pdev,
                return -EINVAL;
        }
 
+       memchunk_cmdline_override(name, &memsize);
+       if (!memsize)
+               return 0;
+
        buf = dma_alloc_coherent(NULL, memsize, &dma_handle, GFP_KERNEL);
        if (!buf) {
                pr_warning("%s: unable to allocate memory\n", name);
index 217de3ea29e842cff4c0eff6be2b82c5a13f25fe..b4aeb0f696dc4330e837d7e5b085ba0d2fbf4a7f 100644 (file)
@@ -796,6 +796,9 @@ static unsigned long nid_range(unsigned long start, unsigned long end,
                start += PAGE_SIZE;
        }
 
+       if (start > end)
+               start = end;
+
        return start;
 }
 #else
@@ -1723,8 +1726,7 @@ void __init paging_init(void)
 
        find_ramdisk(phys_base);
 
-       if (cmdline_memory_size)
-               lmb_enforce_memory_limit(phys_base + cmdline_memory_size);
+       lmb_enforce_memory_limit(cmdline_memory_size);
 
        lmb_analyze();
        lmb_dump_all();
@@ -1961,6 +1963,15 @@ void __init mem_init(void)
 void free_initmem(void)
 {
        unsigned long addr, initend;
+       int do_free = 1;
+
+       /* If the physical memory maps were trimmed by kernel command
+        * line options, don't even try freeing this initmem stuff up.
+        * The kernel image could have been in the trimmed out region
+        * and if so the freeing below will free invalid page structs.
+        */
+       if (cmdline_memory_size)
+               do_free = 0;
 
        /*
         * The init section is aligned to 8k in vmlinux.lds. Page align for >8k pagesizes.
@@ -1975,13 +1986,16 @@ void free_initmem(void)
                        ((unsigned long) __va(kern_base)) -
                        ((unsigned long) KERNBASE));
                memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE);
-               p = virt_to_page(page);
 
-               ClearPageReserved(p);
-               init_page_count(p);
-               __free_page(p);
-               num_physpages++;
-               totalram_pages++;
+               if (do_free) {
+                       p = virt_to_page(page);
+
+                       ClearPageReserved(p);
+                       init_page_count(p);
+                       __free_page(p);
+                       num_physpages++;
+                       totalram_pages++;
+               }
        }
 }
 
index ac2fb0641a041e4a28055867140f458613673dc2..68d91c8233f42162039af96c8ed1fdd3e1d6a88e 100644 (file)
@@ -951,9 +951,9 @@ config NUMA
          local memory controller of the CPU and add some more
          NUMA awareness to the kernel.
 
-         For i386 this is currently highly experimental and should be only
+         For 32-bit this is currently highly experimental and should be only
          used for kernel development. It might also cause boot failures.
-         For x86_64 this is recommended on all multiprocessor Opteron systems.
+         For 64-bit this is recommended on all multiprocessor Opteron systems.
          If the system is EM64T, you should say N unless your system is
          EM64T NUMA.
 
@@ -1263,7 +1263,7 @@ config KEXEC
          strongly in flux, so no good recommendation can be made.
 
 config CRASH_DUMP
-       bool "kernel crash dumps (EXPERIMENTAL)"
+       bool "kernel crash dumps"
        depends on X86_64 || (X86_32 && HIGHMEM)
        help
          Generate crash dump after being started by kexec.
index a34b9982c7cbcf928bd96e3b17955a789f226f57..cc0ef13fba7a60c4c20943589efecc7108661112 100644 (file)
 #include <linux/edd.h>
 #include <asm/boot.h>
 #include <asm/setup.h>
+#include "bitops.h"
+#include <asm/cpufeature.h>
 
 /* Useful macros */
 #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
 
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
+
 extern struct setup_header hdr;
 extern struct boot_params boot_params;
 
@@ -242,6 +246,12 @@ int cmdline_find_option(const char *option, char *buffer, int bufsize);
 int cmdline_find_option_bool(const char *option);
 
 /* cpu.c, cpucheck.c */
+struct cpu_features {
+       int level;              /* Family, or 64 for x86-64 */
+       int model;
+       u32 flags[NCAPINTS];
+};
+extern struct cpu_features cpu;
 int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr);
 int validate_cpu(void);
 
index 92d6fd73dc7dff60681d6ab7dee1362fba783d70..75298fe2edca6ac30c76354a573c87fb4eab135c 100644 (file)
@@ -16,9 +16,6 @@
  */
 
 #include "boot.h"
-#include "bitops.h"
-#include <asm/cpufeature.h>
-
 #include "cpustr.h"
 
 static char *cpu_name(int level)
index 7804389ee0059eb8f4be589cccd24a2623f9567f..4b9ae7c567480658ff1e83333a2f8137c887579b 100644 (file)
 
 #ifdef _SETUP
 # include "boot.h"
-# include "bitops.h"
 #endif
 #include <linux/types.h>
-#include <asm/cpufeature.h>
 #include <asm/processor-flags.h>
 #include <asm/required-features.h>
 #include <asm/msr-index.h>
 
-struct cpu_features {
-       int level;              /* Family, or 64 for x86-64 */
-       int model;
-       u32 flags[NCAPINTS];
-};
-
-static struct cpu_features cpu;
+struct cpu_features cpu;
 static u32 cpu_vendor[3];
 static u32 err_flags[NCAPINTS];
 
index 2296164b54d2abc3ad8edc343af2b76c830d6693..197421db1af130d7ac3295e3cc1708b1e3b3e30f 100644 (file)
@@ -73,6 +73,11 @@ static void keyboard_set_repeat(void)
  */
 static void query_ist(void)
 {
+       /* Some older BIOSes apparently crash on this call, so filter
+          it from machines too old to have SpeedStep at all. */
+       if (cpu.level < 6)
+               return;
+
        asm("int $0x15"
            : "=a" (boot_params.ist_info.signature),
              "=b" (boot_params.ist_info.command),
index 53165c97336b21406f49307cb4932c87468d32d9..8c3c25f35578a00c140440131a69ae539038f950 100644 (file)
@@ -13,7 +13,6 @@
  */
 
 #include "boot.h"
-#include <linux/kernel.h>
 
 #define SMAP   0x534d4150      /* ASCII "SMAP" */
 
index fa88a1d7129094fcc85b1b2425234a80e2418581..bfd10fd211cd30f4e0867c8bbfd8458461aec3c8 100644 (file)
@@ -97,6 +97,8 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
 #warning ACPI uses CMPXCHG, i486 and later hardware
 #endif
 
+static int acpi_mcfg_64bit_base_addr __initdata = FALSE;
+
 /* --------------------------------------------------------------------------
                               Boot-time Configuration
    -------------------------------------------------------------------------- */
@@ -158,6 +160,14 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size)
 struct acpi_mcfg_allocation *pci_mmcfg_config;
 int pci_mmcfg_config_num;
 
+static int __init acpi_mcfg_oem_check(struct acpi_table_mcfg *mcfg)
+{
+       if (!strcmp(mcfg->header.oem_id, "SGI"))
+               acpi_mcfg_64bit_base_addr = TRUE;
+
+       return 0;
+}
+
 int __init acpi_parse_mcfg(struct acpi_table_header *header)
 {
        struct acpi_table_mcfg *mcfg;
@@ -190,8 +200,12 @@ int __init acpi_parse_mcfg(struct acpi_table_header *header)
        }
 
        memcpy(pci_mmcfg_config, &mcfg[1], config_size);
+
+       acpi_mcfg_oem_check(mcfg);
+
        for (i = 0; i < pci_mmcfg_config_num; ++i) {
-               if (pci_mmcfg_config[i].address > 0xFFFFFFFF) {
+               if ((pci_mmcfg_config[i].address > 0xFFFFFFFF) &&
+                   !acpi_mcfg_64bit_base_addr) {
                        printk(KERN_ERR PREFIX
                               "MMCONFIG not in low 4GB of memory\n");
                        kfree(pci_mmcfg_config);
index fa2161d5003b78ad6e7b021523efd7b761894602..426e5d91b63a55d9b49d3387e2c40bb56306f104 100644 (file)
@@ -20,7 +20,7 @@ unsigned long acpi_realmode_flags;
 /* address in low memory of the wakeup routine. */
 static unsigned long acpi_realmode;
 
-#ifdef CONFIG_64BIT
+#if defined(CONFIG_SMP) && defined(CONFIG_64BIT)
 static char temp_stack[10240];
 #endif
 
@@ -86,7 +86,7 @@ int acpi_save_state_mem(void)
 #endif /* !CONFIG_64BIT */
 
        header->pmode_cr0 = read_cr0();
-       header->pmode_cr4 = read_cr4();
+       header->pmode_cr4 = read_cr4_safe();
        header->realmode_flags = acpi_realmode_flags;
        header->real_magic = 0x12345678;
 
index 22d7d050905dd1f6b6192707b2697e38a2fd38bd..de39e1f2ede5f1c820f4abe9fa4f9ec07948419b 100644 (file)
@@ -101,16 +101,13 @@ static int iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd)
  */
 static int iommu_completion_wait(struct amd_iommu *iommu)
 {
-       int ret;
+       int ret, ready = 0;
+       unsigned status = 0;
        struct iommu_cmd cmd;
-       volatile u64 ready = 0;
-       unsigned long ready_phys = virt_to_phys(&ready);
        unsigned long i = 0;
 
        memset(&cmd, 0, sizeof(cmd));
-       cmd.data[0] = LOW_U32(ready_phys) | CMD_COMPL_WAIT_STORE_MASK;
-       cmd.data[1] = upper_32_bits(ready_phys);
-       cmd.data[2] = 1; /* value written to 'ready' */
+       cmd.data[0] = CMD_COMPL_WAIT_INT_MASK;
        CMD_SET_TYPE(&cmd, CMD_COMPL_WAIT);
 
        iommu->need_sync = 0;
@@ -122,9 +119,15 @@ static int iommu_completion_wait(struct amd_iommu *iommu)
 
        while (!ready && (i < EXIT_LOOP_COUNT)) {
                ++i;
-               cpu_relax();
+               /* wait for the bit to become one */
+               status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
+               ready = status & MMIO_STATUS_COM_WAIT_INT_MASK;
        }
 
+       /* set bit back to zero */
+       status &= ~MMIO_STATUS_COM_WAIT_INT_MASK;
+       writel(status, iommu->mmio_base + MMIO_STATUS_OFFSET);
+
        if (unlikely((i == EXIT_LOOP_COUNT) && printk_ratelimit()))
                printk(KERN_WARNING "AMD IOMMU: Completion wait loop failed\n");
 
@@ -161,7 +164,7 @@ static int iommu_queue_inv_iommu_pages(struct amd_iommu *iommu,
        address &= PAGE_MASK;
        CMD_SET_TYPE(&cmd, CMD_INV_IOMMU_PAGES);
        cmd.data[1] |= domid;
-       cmd.data[2] = LOW_U32(address);
+       cmd.data[2] = lower_32_bits(address);
        cmd.data[3] = upper_32_bits(address);
        if (s) /* size bit - we flush more than one 4kb page */
                cmd.data[2] |= CMD_INV_IOMMU_PAGES_SIZE_MASK;
index d9a9da597e796cbcda869180879a7804888e70ea..a69cc0f5204286a9ead45b580e2f506c00a88f2a 100644 (file)
@@ -800,6 +800,21 @@ static int __init init_memory_definitions(struct acpi_table_header *table)
        return 0;
 }
 
+/*
+ * Init the device table to not allow DMA access for devices and
+ * suppress all page faults
+ */
+static void init_device_table(void)
+{
+       u16 devid;
+
+       for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) {
+               set_dev_entry_bit(devid, DEV_ENTRY_VALID);
+               set_dev_entry_bit(devid, DEV_ENTRY_TRANSLATION);
+               set_dev_entry_bit(devid, DEV_ENTRY_NO_PAGE_FAULT);
+       }
+}
+
 /*
  * This function finally enables all IOMMUs found in the system after
  * they have been initialized
@@ -931,6 +946,9 @@ int __init amd_iommu_init(void)
        if (amd_iommu_pd_alloc_bitmap == NULL)
                goto free;
 
+       /* init the device table */
+       init_device_table();
+
        /*
         * let all alias entries point to itself
         */
@@ -954,15 +972,15 @@ int __init amd_iommu_init(void)
        if (acpi_table_parse("IVRS", init_memory_definitions) != 0)
                goto free;
 
-       ret = amd_iommu_init_dma_ops();
+       ret = sysdev_class_register(&amd_iommu_sysdev_class);
        if (ret)
                goto free;
 
-       ret = sysdev_class_register(&amd_iommu_sysdev_class);
+       ret = sysdev_register(&device_amd_iommu);
        if (ret)
                goto free;
 
-       ret = sysdev_register(&device_amd_iommu);
+       ret = amd_iommu_init_dma_ops();
        if (ret)
                goto free;
 
index 039a8d4aaf62db88eeb36040ad15ff64be9ed852..f88bd0d982b08540889e991c42a019344002d3d3 100644 (file)
@@ -1454,8 +1454,6 @@ void disconnect_bsp_APIC(int virt_wire_setup)
        }
 }
 
-unsigned int __cpuinitdata maxcpus = NR_CPUS;
-
 void __cpuinit generic_processor_info(int apicid, int version)
 {
        int cpu;
@@ -1482,12 +1480,6 @@ void __cpuinit generic_processor_info(int apicid, int version)
                return;
        }
 
-       if (num_processors >= maxcpus) {
-               printk(KERN_WARNING "WARNING: maxcpus limit of %i reached."
-                       " Processor ignored.\n", maxcpus);
-               return;
-       }
-
        num_processors++;
        cpus_complement(tmp_map, cpu_present_map);
        cpu = first_cpu(tmp_map);
index 7f1f030da7ee4c048990eecf9dc00229472028ca..446c062e831cf46ce8ca276f38ee95a216049a93 100644 (file)
@@ -90,7 +90,6 @@ static unsigned long apic_phys;
 
 unsigned long mp_lapic_addr;
 
-unsigned int __cpuinitdata maxcpus = NR_CPUS;
 /*
  * Get the LAPIC version
  */
@@ -1062,12 +1061,6 @@ void __cpuinit generic_processor_info(int apicid, int version)
                return;
        }
 
-       if (num_processors >= maxcpus) {
-               printk(KERN_WARNING "WARNING: maxcpus limit of %i reached."
-                      " Processor ignored.\n", maxcpus);
-               return;
-       }
-
        num_processors++;
        cpus_complement(tmp_map, cpu_present_map);
        cpu = first_cpu(tmp_map);
index 4e7271999a74e58ccf15203d005a646d9135686a..84bb395038d879823d5beb4e4bf2e181b8bd6b91 100644 (file)
@@ -737,63 +737,44 @@ static int find_psb_table(struct powernow_k8_data *data)
 #ifdef CONFIG_X86_POWERNOW_K8_ACPI
 static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index)
 {
-       if (!data->acpi_data->state_count || (cpu_family == CPU_HW_PSTATE))
+       if (!data->acpi_data.state_count || (cpu_family == CPU_HW_PSTATE))
                return;
 
-       data->irt = (data->acpi_data->states[index].control >> IRT_SHIFT) & IRT_MASK;
-       data->rvo = (data->acpi_data->states[index].control >> RVO_SHIFT) & RVO_MASK;
-       data->exttype = (data->acpi_data->states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK;
-       data->plllock = (data->acpi_data->states[index].control >> PLL_L_SHIFT) & PLL_L_MASK;
-       data->vidmvs = 1 << ((data->acpi_data->states[index].control >> MVS_SHIFT) & MVS_MASK);
-       data->vstable = (data->acpi_data->states[index].control >> VST_SHIFT) & VST_MASK;
-}
-
-
-static struct acpi_processor_performance *acpi_perf_data;
-static int preregister_valid;
-
-static int powernow_k8_cpu_preinit_acpi(void)
-{
-       acpi_perf_data = alloc_percpu(struct acpi_processor_performance);
-       if (!acpi_perf_data)
-               return -ENODEV;
-
-       if (acpi_processor_preregister_performance(acpi_perf_data))
-               return -ENODEV;
-       else
-               preregister_valid = 1;
-       return 0;
+       data->irt = (data->acpi_data.states[index].control >> IRT_SHIFT) & IRT_MASK;
+       data->rvo = (data->acpi_data.states[index].control >> RVO_SHIFT) & RVO_MASK;
+       data->exttype = (data->acpi_data.states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK;
+       data->plllock = (data->acpi_data.states[index].control >> PLL_L_SHIFT) & PLL_L_MASK;
+       data->vidmvs = 1 << ((data->acpi_data.states[index].control >> MVS_SHIFT) & MVS_MASK);
+       data->vstable = (data->acpi_data.states[index].control >> VST_SHIFT) & VST_MASK;
 }
 
 static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
 {
        struct cpufreq_frequency_table *powernow_table;
        int ret_val;
-       int cpu = 0;
 
-       data->acpi_data = percpu_ptr(acpi_perf_data, cpu);
-       if (acpi_processor_register_performance(data->acpi_data, data->cpu)) {
+       if (acpi_processor_register_performance(&data->acpi_data, data->cpu)) {
                dprintk("register performance failed: bad ACPI data\n");
                return -EIO;
        }
 
        /* verify the data contained in the ACPI structures */
-       if (data->acpi_data->state_count <= 1) {
+       if (data->acpi_data.state_count <= 1) {
                dprintk("No ACPI P-States\n");
                goto err_out;
        }
 
-       if ((data->acpi_data->control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) ||
-               (data->acpi_data->status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) {
+       if ((data->acpi_data.control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) ||
+               (data->acpi_data.status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) {
                dprintk("Invalid control/status registers (%x - %x)\n",
-                       data->acpi_data->control_register.space_id,
-                       data->acpi_data->status_register.space_id);
+                       data->acpi_data.control_register.space_id,
+                       data->acpi_data.status_register.space_id);
                goto err_out;
        }
 
        /* fill in data->powernow_table */
        powernow_table = kmalloc((sizeof(struct cpufreq_frequency_table)
-               * (data->acpi_data->state_count + 1)), GFP_KERNEL);
+               * (data->acpi_data.state_count + 1)), GFP_KERNEL);
        if (!powernow_table) {
                dprintk("powernow_table memory alloc failure\n");
                goto err_out;
@@ -806,12 +787,12 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
        if (ret_val)
                goto err_out_mem;
 
-       powernow_table[data->acpi_data->state_count].frequency = CPUFREQ_TABLE_END;
-       powernow_table[data->acpi_data->state_count].index = 0;
+       powernow_table[data->acpi_data.state_count].frequency = CPUFREQ_TABLE_END;
+       powernow_table[data->acpi_data.state_count].index = 0;
        data->powernow_table = powernow_table;
 
        /* fill in data */
-       data->numps = data->acpi_data->state_count;
+       data->numps = data->acpi_data.state_count;
        if (first_cpu(per_cpu(cpu_core_map, data->cpu)) == data->cpu)
                print_basics(data);
        powernow_k8_acpi_pst_values(data, 0);
@@ -819,31 +800,16 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
        /* notify BIOS that we exist */
        acpi_processor_notify_smm(THIS_MODULE);
 
-       /* determine affinity, from ACPI if available */
-       if (preregister_valid) {
-               if ((data->acpi_data->shared_type == CPUFREQ_SHARED_TYPE_ALL) ||
-                       (data->acpi_data->shared_type == CPUFREQ_SHARED_TYPE_ANY))
-                       data->starting_core_affinity = data->acpi_data->shared_cpu_map;
-               else
-                       data->starting_core_affinity = cpumask_of_cpu(data->cpu);
-       } else {
-       /* best guess from family if not */
-               if (cpu_family == CPU_HW_PSTATE)
-                       data->starting_core_affinity = cpumask_of_cpu(data->cpu);
-               else
-                       data->starting_core_affinity = per_cpu(cpu_core_map, data->cpu);
-       }
-
        return 0;
 
 err_out_mem:
        kfree(powernow_table);
 
 err_out:
-       acpi_processor_unregister_performance(data->acpi_data, data->cpu);
+       acpi_processor_unregister_performance(&data->acpi_data, data->cpu);
 
        /* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */
-       data->acpi_data->state_count = 0;
+       data->acpi_data.state_count = 0;
 
        return -ENODEV;
 }
@@ -855,10 +821,10 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf
        rdmsr(MSR_PSTATE_CUR_LIMIT, hi, lo);
        data->max_hw_pstate = (hi & HW_PSTATE_MAX_MASK) >> HW_PSTATE_MAX_SHIFT;
 
-       for (i = 0; i < data->acpi_data->state_count; i++) {
+       for (i = 0; i < data->acpi_data.state_count; i++) {
                u32 index;
 
-               index = data->acpi_data->states[i].control & HW_PSTATE_MASK;
+               index = data->acpi_data.states[i].control & HW_PSTATE_MASK;
                if (index > data->max_hw_pstate) {
                        printk(KERN_ERR PFX "invalid pstate %d - bad value %d.\n", i, index);
                        printk(KERN_ERR PFX "Please report to BIOS manufacturer\n");
@@ -874,7 +840,7 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf
 
                powernow_table[i].index = index;
 
-               powernow_table[i].frequency = data->acpi_data->states[i].core_frequency * 1000;
+               powernow_table[i].frequency = data->acpi_data.states[i].core_frequency * 1000;
        }
        return 0;
 }
@@ -883,16 +849,16 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf
 {
        int i;
        int cntlofreq = 0;
-       for (i = 0; i < data->acpi_data->state_count; i++) {
+       for (i = 0; i < data->acpi_data.state_count; i++) {
                u32 fid;
                u32 vid;
 
                if (data->exttype) {
-                       fid = data->acpi_data->states[i].status & EXT_FID_MASK;
-                       vid = (data->acpi_data->states[i].status >> VID_SHIFT) & EXT_VID_MASK;
+                       fid = data->acpi_data.states[i].status & EXT_FID_MASK;
+                       vid = (data->acpi_data.states[i].status >> VID_SHIFT) & EXT_VID_MASK;
                } else {
-                       fid = data->acpi_data->states[i].control & FID_MASK;
-                       vid = (data->acpi_data->states[i].control >> VID_SHIFT) & VID_MASK;
+                       fid = data->acpi_data.states[i].control & FID_MASK;
+                       vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK;
                }
 
                dprintk("   %d : fid 0x%x, vid 0x%x\n", i, fid, vid);
@@ -933,10 +899,10 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf
                                cntlofreq = i;
                }
 
-               if (powernow_table[i].frequency != (data->acpi_data->states[i].core_frequency * 1000)) {
+               if (powernow_table[i].frequency != (data->acpi_data.states[i].core_frequency * 1000)) {
                        printk(KERN_INFO PFX "invalid freq entries %u kHz vs. %u kHz\n",
                                powernow_table[i].frequency,
-                               (unsigned int) (data->acpi_data->states[i].core_frequency * 1000));
+                               (unsigned int) (data->acpi_data.states[i].core_frequency * 1000));
                        powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
                        continue;
                }
@@ -946,12 +912,11 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf
 
 static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data)
 {
-       if (data->acpi_data->state_count)
-               acpi_processor_unregister_performance(data->acpi_data, data->cpu);
+       if (data->acpi_data.state_count)
+               acpi_processor_unregister_performance(&data->acpi_data, data->cpu);
 }
 
 #else
-static int powernow_k8_cpu_preinit_acpi(void) { return -ENODEV; }
 static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; }
 static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; }
 static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; }
@@ -1136,7 +1101,7 @@ static int powernowk8_verify(struct cpufreq_policy *pol)
 static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
 {
        struct powernow_k8_data *data;
-       cpumask_t oldmask = CPU_MASK_ALL;
+       cpumask_t oldmask;
        int rc;
 
        if (!cpu_online(pol->cpu))
@@ -1209,7 +1174,10 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
        /* run on any CPU again */
        set_cpus_allowed_ptr(current, &oldmask);
 
-       pol->cpus = data->starting_core_affinity;
+       if (cpu_family == CPU_HW_PSTATE)
+               pol->cpus = cpumask_of_cpu(pol->cpu);
+       else
+               pol->cpus = per_cpu(cpu_core_map, pol->cpu);
        data->available_cores = &(pol->cpus);
 
        /* Take a crude guess here.
@@ -1332,7 +1300,6 @@ static int __cpuinit powernowk8_init(void)
        }
 
        if (supported_cpus == num_online_cpus()) {
-               powernow_k8_cpu_preinit_acpi();
                printk(KERN_INFO PFX "Found %d %s "
                        "processors (%d cpu cores) (" VERSION ")\n",
                        num_online_nodes(),
@@ -1349,10 +1316,6 @@ static void __exit powernowk8_exit(void)
        dprintk("exit\n");
 
        cpufreq_unregister_driver(&cpufreq_amd64_driver);
-
-#ifdef CONFIG_X86_POWERNOW_K8_ACPI
-       free_percpu(acpi_perf_data);
-#endif
 }
 
 MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com> and Mark Langsdorf <mark.langsdorf@amd.com>");
index a62612cd4be89c2e775edf5d9c71da41cf0a4b64..ab48cfed4d96ce5629e29f3a21ffd9c3e25d8a21 100644 (file)
@@ -33,13 +33,12 @@ struct powernow_k8_data {
 #ifdef CONFIG_X86_POWERNOW_K8_ACPI
        /* the acpi table needs to be kept. it's only available if ACPI was
         * used to determine valid frequency/vid/fid states */
-       struct acpi_processor_performance *acpi_data;
+       struct acpi_processor_performance acpi_data;
 #endif
        /* we need to keep track of associated cores, but let cpufreq
         * handle hotplug events - so just point at cpufreq pol->cpus
         * structure */
        cpumask_t *available_cores;
-       cpumask_t starting_core_affinity;
 };
 
 
index de7439f82b9230d7a65fa8a12af027bc7a578660..05cc22dbd4ffdebff8738662c74fd954be8fd432 100644 (file)
@@ -478,7 +478,13 @@ static int setup_p4_watchdog(unsigned nmi_hz)
                perfctr_msr = MSR_P4_IQ_PERFCTR1;
                evntsel_msr = MSR_P4_CRU_ESCR0;
                cccr_msr = MSR_P4_IQ_CCCR1;
-               cccr_val = P4_CCCR_OVF_PMI1 | P4_CCCR_ESCR_SELECT(4);
+
+               /* Pentium 4 D processors don't support P4_CCCR_OVF_PMI1 */
+               if (boot_cpu_data.x86_model == 4 && boot_cpu_data.x86_mask == 4)
+                       cccr_val = P4_CCCR_OVF_PMI0;
+               else
+                       cccr_val = P4_CCCR_OVF_PMI1;
+               cccr_val |= P4_CCCR_ESCR_SELECT(4);
        }
 
        evntsel = P4_ESCR_EVENT_SELECT(0x3F)
index 4b63c8e1f13b1b078a42dc113403c1952c52f3cc..5cab48ee61a4a6e61e522117d97bbfdabaa95a6d 100644 (file)
@@ -53,7 +53,7 @@ void efi_call_phys_prelog(void)
         * directory. If I have PAE, I just need to duplicate one entry in
         * page directory.
         */
-       cr4 = read_cr4();
+       cr4 = read_cr4_safe();
 
        if (cr4 & X86_CR4_PAE) {
                efi_bak_pg_dir_pointer[0].pgd =
@@ -91,7 +91,7 @@ void efi_call_phys_epilog(void)
        gdt_descr.size = GDT_SIZE - 1;
        load_gdt(&gdt_descr);
 
-       cr4 = read_cr4();
+       cr4 = read_cr4_safe();
 
        if (cr4 & X86_CR4_PAE) {
                swapper_pg_dir[pgd_index(0)].pgd =
index 2cfcbded888a0b91eece817e0eb3f49e865154fd..2d7e307c7779c98ea412b67faa1b1dbddc7303f6 100644 (file)
@@ -222,7 +222,7 @@ static __init void map_low_mmrs(void)
 
 enum map_type {map_wb, map_uc};
 
-static void map_high(char *id, unsigned long base, int shift, enum map_type map_type)
+static __init void map_high(char *id, unsigned long base, int shift, enum map_type map_type)
 {
        unsigned long bytes, paddr;
 
index 1b318e903bf63f14bd4f514ad8fd5916289bb979..9bfc4d72fb2e26b757ffad4bffd8b0de7a45de39 100644 (file)
@@ -88,6 +88,7 @@ void __init x86_64_start_kernel(char * real_mode_data)
        BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL));
        BUILD_BUG_ON(!(((MODULES_END - 1) & PGDIR_MASK) ==
                                (__START_KERNEL & PGDIR_MASK)));
+       BUILD_BUG_ON(__fix_to_virt(__end_of_fixed_addresses) <= MODULES_END);
 
        /* clear bss before set_intr_gate with early_idt_handler */
        clear_bss();
index ad2b15a1334d919419b9040b52c2062dd5d3666d..59fd3b6b13036e1e279e54d0e1e3d3f5ebb55166 100644 (file)
@@ -359,6 +359,7 @@ static int hpet_clocksource_register(void)
 int __init hpet_enable(void)
 {
        unsigned long id;
+       int i;
 
        if (!is_hpet_capable())
                return 0;
@@ -369,6 +370,29 @@ int __init hpet_enable(void)
         * Read the period and check for a sane value:
         */
        hpet_period = hpet_readl(HPET_PERIOD);
+
+       /*
+        * AMD SB700 based systems with spread spectrum enabled use a
+        * SMM based HPET emulation to provide proper frequency
+        * setting. The SMM code is initialized with the first HPET
+        * register access and takes some time to complete. During
+        * this time the config register reads 0xffffffff. We check
+        * for max. 1000 loops whether the config register reads a non
+        * 0xffffffff value to make sure that HPET is up and running
+        * before we go further. A counting loop is safe, as the HPET
+        * access takes thousands of CPU cycles. On non SB700 based
+        * machines this check is only done once and has no side
+        * effects.
+        */
+       for (i = 0; hpet_readl(HPET_CFG) == 0xFFFFFFFF; i++) {
+               if (i == 1000) {
+                       printk(KERN_WARNING
+                              "HPET config register value = 0xFFFFFFFF. "
+                              "Disabling HPET\n");
+                       goto out_nohpet;
+               }
+       }
+
        if (hpet_period < HPET_MIN_PERIOD || hpet_period > HPET_MAX_PERIOD)
                goto out_nohpet;
 
index 9fe478d984068fea53488d4405db4066863df39c..0732adba05ca95bfaf851d3d2193df5074478482 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/init.h>
 #include <linux/numa.h>
 #include <linux/ftrace.h>
+#include <linux/suspend.h>
 
 #include <asm/pgtable.h>
 #include <asm/pgalloc.h>
@@ -78,7 +79,7 @@ static void load_segments(void)
 /*
  * A architecture hook called to validate the
  * proposed image and prepare the control pages
- * as needed.  The pages for KEXEC_CONTROL_CODE_SIZE
+ * as needed.  The pages for KEXEC_CONTROL_PAGE_SIZE
  * have been allocated, but the segments have yet
  * been copied into the kernel.
  *
@@ -113,6 +114,7 @@ void machine_kexec(struct kimage *image)
 {
        unsigned long page_list[PAGES_NR];
        void *control_page;
+       int save_ftrace_enabled;
        asmlinkage unsigned long
                (*relocate_kernel_ptr)(unsigned long indirection_page,
                                       unsigned long control_page,
@@ -120,7 +122,12 @@ void machine_kexec(struct kimage *image)
                                       unsigned int has_pae,
                                       unsigned int preserve_context);
 
-       tracer_disable();
+#ifdef CONFIG_KEXEC_JUMP
+       if (kexec_image->preserve_context)
+               save_processor_state();
+#endif
+
+       save_ftrace_enabled = __ftrace_enabled_save();
 
        /* Interrupts aren't acceptable while we reboot */
        local_irq_disable();
@@ -138,7 +145,7 @@ void machine_kexec(struct kimage *image)
        }
 
        control_page = page_address(image->control_code_page);
-       memcpy(control_page, relocate_kernel, PAGE_SIZE/2);
+       memcpy(control_page, relocate_kernel, KEXEC_CONTROL_CODE_MAX_SIZE);
 
        relocate_kernel_ptr = control_page;
        page_list[PA_CONTROL_PAGE] = __pa(control_page);
@@ -178,6 +185,13 @@ void machine_kexec(struct kimage *image)
                                           (unsigned long)page_list,
                                           image->start, cpu_has_pae,
                                           image->preserve_context);
+
+#ifdef CONFIG_KEXEC_JUMP
+       if (kexec_image->preserve_context)
+               restore_processor_state();
+#endif
+
+       __ftrace_enabled_restore(save_ftrace_enabled);
 }
 
 void arch_crash_save_vmcoreinfo(void)
index 07c0f828f4881ab3f62890f0ddb373326ae8cd77..3b599518c322a143c9623759061a44ca92647ecf 100644 (file)
@@ -33,6 +33,8 @@
 #include <linux/module.h>
 #include <asm/geode.h>
 
+#define MFGPT_DEFAULT_IRQ      7
+
 static struct mfgpt_timer_t {
        unsigned int avail:1;
 } mfgpt_timers[MFGPT_MAX_TIMERS];
@@ -157,29 +159,48 @@ int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable)
 }
 EXPORT_SYMBOL_GPL(geode_mfgpt_toggle_event);
 
-int geode_mfgpt_set_irq(int timer, int cmp, int irq, int enable)
+int geode_mfgpt_set_irq(int timer, int cmp, int *irq, int enable)
 {
-       u32 val, dummy;
-       int offset;
+       u32 zsel, lpc, dummy;
+       int shift;
 
        if (timer < 0 || timer >= MFGPT_MAX_TIMERS)
                return -EIO;
 
-       if (geode_mfgpt_toggle_event(timer, cmp, MFGPT_EVENT_IRQ, enable))
+       /*
+        * Unfortunately, MFGPTs come in pairs sharing their IRQ lines. If VSA
+        * is using the same CMP of the timer's Siamese twin, the IRQ is set to
+        * 2, and we mustn't use nor change it.
+        * XXX: Likewise, 2 Linux drivers might clash if the 2nd overwrites the
+        * IRQ of the 1st. This can only happen if forcing an IRQ, calling this
+        * with *irq==0 is safe. Currently there _are_ no 2 drivers.
+        */
+       rdmsr(MSR_PIC_ZSEL_LOW, zsel, dummy);
+       shift = ((cmp == MFGPT_CMP1 ? 0 : 4) + timer % 4) * 4;
+       if (((zsel >> shift) & 0xF) == 2)
                return -EIO;
 
-       rdmsr(MSR_PIC_ZSEL_LOW, val, dummy);
+       /* Choose IRQ: if none supplied, keep IRQ already set or use default */
+       if (!*irq)
+               *irq = (zsel >> shift) & 0xF;
+       if (!*irq)
+               *irq = MFGPT_DEFAULT_IRQ;
 
-       offset = (timer % 4) * 4;
-
-       val &= ~((0xF << offset) | (0xF << (offset + 16)));
+       /* Can't use IRQ if it's 0 (=disabled), 2, or routed to LPC */
+       if (*irq < 1 || *irq == 2 || *irq > 15)
+               return -EIO;
+       rdmsr(MSR_PIC_IRQM_LPC, lpc, dummy);
+       if (lpc & (1 << *irq))
+               return -EIO;
 
+       /* All chosen and checked - go for it */
+       if (geode_mfgpt_toggle_event(timer, cmp, MFGPT_EVENT_IRQ, enable))
+               return -EIO;
        if (enable) {
-               val |= (irq & 0x0F) << (offset);
-               val |= (irq & 0x0F) << (offset + 16);
+               zsel = (zsel & ~(0xF << shift)) | (*irq << shift);
+               wrmsr(MSR_PIC_ZSEL_LOW, zsel, dummy);
        }
 
-       wrmsr(MSR_PIC_ZSEL_LOW, val, dummy);
        return 0;
 }
 
@@ -242,7 +263,7 @@ EXPORT_SYMBOL_GPL(geode_mfgpt_alloc_timer);
 static unsigned int mfgpt_tick_mode = CLOCK_EVT_MODE_SHUTDOWN;
 static u16 mfgpt_event_clock;
 
-static int irq = 7;
+static int irq;
 static int __init mfgpt_setup(char *str)
 {
        get_option(&str, &irq);
@@ -346,7 +367,7 @@ int __init mfgpt_timer_setup(void)
        mfgpt_event_clock = timer;
 
        /* Set up the IRQ on the MFGPT side */
-       if (geode_mfgpt_setup_irq(mfgpt_event_clock, MFGPT_CMP2, irq)) {
+       if (geode_mfgpt_setup_irq(mfgpt_event_clock, MFGPT_CMP2, &irq)) {
                printk(KERN_ERR "mfgpt-timer:  Could not set up IRQ %d\n", irq);
                return -EIO;
        }
@@ -374,13 +395,14 @@ int __init mfgpt_timer_setup(void)
                        &mfgpt_clockevent);
 
        printk(KERN_INFO
-              "mfgpt-timer:  registering the MFGPT timer as a clock event.\n");
+              "mfgpt-timer:  Registering MFGPT timer %d as a clock event, using IRQ %d\n",
+              timer, irq);
        clockevents_register_device(&mfgpt_clockevent);
 
        return 0;
 
 err:
-       geode_mfgpt_release_irq(mfgpt_event_clock, MFGPT_CMP2, irq);
+       geode_mfgpt_release_irq(mfgpt_event_clock, MFGPT_CMP2, &irq);
        printk(KERN_ERR
               "mfgpt-timer:  Unable to set up the MFGPT clock source\n");
        return -EIO;
index fdfdc550b366043045a34a4c476c61d6ff67b5d7..efc2f361fe85f0c1280cfce1aeafefa572a5c83d 100644 (file)
@@ -238,7 +238,7 @@ static struct dmi_system_id __devinitdata mmconf_dmi_table[] = {
        {}
 };
 
-void __init check_enable_amd_mmconf_dmi(void)
+void __cpuinit check_enable_amd_mmconf_dmi(void)
 {
        dmi_check_system(mmconf_dmi_table);
 }
index 678090508a6240996aee5eedbdd5774cc86ab629..b3fb430725cb0f5c2cd5ee5da68a249cdb9854d0 100644 (file)
@@ -49,7 +49,7 @@ static int __init mpf_checksum(unsigned char *mp, int len)
        return sum & 0xFF;
 }
 
-static void __cpuinit MP_processor_info(struct mpc_config_processor *m)
+static void __init MP_processor_info(struct mpc_config_processor *m)
 {
        int apicid;
        char *bootup_cpu = "";
@@ -484,7 +484,7 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type)
 }
 
 
-static void construct_ioapic_table(int mpc_default_type)
+static void __init construct_ioapic_table(int mpc_default_type)
 {
        struct mpc_config_ioapic ioapic;
        struct mpc_config_bus bus;
@@ -529,7 +529,7 @@ static void construct_ioapic_table(int mpc_default_type)
        construct_default_ioirq_mptable(mpc_default_type);
 }
 #else
-static inline void construct_ioapic_table(int mpc_default_type) { }
+static inline void __init construct_ioapic_table(int mpc_default_type) { }
 #endif
 
 static inline void __init construct_default_ISA_mptable(int mpc_default_type)
index 9fd8095524474aa7ef0a999c2746c92c8a166565..e43938086885c307b5389774dfb114e5ba12b9f1 100644 (file)
@@ -131,7 +131,7 @@ static int msr_open(struct inode *inode, struct file *file)
                ret = -EIO;     /* MSR not supported */
 out:
        unlock_kernel();
-       return 0;
+       return ret;
 }
 
 /*
index ac6d51222e7d3562abb1e7b5e8bd4a16a1c1c1f4..abb78a2cc4ad5d1a8e43fcf1430dd6245ac57f42 100644 (file)
@@ -114,6 +114,23 @@ static __init void nmi_cpu_busy(void *data)
 }
 #endif
 
+static void report_broken_nmi(int cpu, int *prev_nmi_count)
+{
+       printk(KERN_CONT "\n");
+
+       printk(KERN_WARNING
+               "WARNING: CPU#%d: NMI appears to be stuck (%d->%d)!\n",
+                       cpu, prev_nmi_count[cpu], get_nmi_count(cpu));
+
+       printk(KERN_WARNING
+               "Please report this to bugzilla.kernel.org,\n");
+       printk(KERN_WARNING
+               "and attach the output of the 'dmesg' command.\n");
+
+       per_cpu(wd_enabled, cpu) = 0;
+       atomic_dec(&nmi_active);
+}
+
 int __init check_nmi_watchdog(void)
 {
        unsigned int *prev_nmi_count;
@@ -141,15 +158,8 @@ int __init check_nmi_watchdog(void)
        for_each_online_cpu(cpu) {
                if (!per_cpu(wd_enabled, cpu))
                        continue;
-               if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5) {
-                       printk(KERN_WARNING "WARNING: CPU#%d: NMI "
-                               "appears to be stuck (%d->%d)!\n",
-                               cpu,
-                               prev_nmi_count[cpu],
-                               get_nmi_count(cpu));
-                       per_cpu(wd_enabled, cpu) = 0;
-                       atomic_dec(&nmi_active);
-               }
+               if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5)
+                       report_broken_nmi(cpu, prev_nmi_count);
        }
        endflag = 1;
        if (!atomic_read(&nmi_active)) {
index 02d19328525db264c3deac9793254274d4f0891d..218d783ed7a8969bae11bd86750a8121e8030fdd 100644 (file)
@@ -1350,7 +1350,7 @@ static void calgary_init_bitmap_from_tce_table(struct iommu_table *tbl)
  * Function for kdump case. Get the tce tables from first kernel
  * by reading the contents of the base adress register of calgary iommu
  */
-static void get_tce_space_from_tar(void)
+static void __init get_tce_space_from_tar(void)
 {
        int bus;
        void __iomem *target;
index 53bc653ed5ca52bab902dde3d9efbc0e1630eb6c..3b7a1ddcc0bce7eca8c989906fa377d4f0322f50 100644 (file)
@@ -95,7 +95,6 @@ static inline void play_dead(void)
 {
        /* This must be done before dead CPU ack */
        cpu_exit_clear();
-       wbinvd();
        mb();
        /* Ack it */
        __get_cpu_var(cpu_state) = CPU_DEAD;
@@ -104,8 +103,8 @@ static inline void play_dead(void)
         * With physical CPU hotplug, we should halt the cpu
         */
        local_irq_disable();
-       while (1)
-               halt();
+       /* mask all interrupts, flush any and all caches, and halt */
+       wbinvd_halt();
 }
 #else
 static inline void play_dead(void)
index 3fb62a7d9a16250092a9827a66af062be4824513..71553b664e2af8601361a9af3413599b752a3e5c 100644 (file)
@@ -93,14 +93,13 @@ DECLARE_PER_CPU(int, cpu_state);
 static inline void play_dead(void)
 {
        idle_task_exit();
-       wbinvd();
        mb();
        /* Ack it */
        __get_cpu_var(cpu_state) = CPU_DEAD;
 
        local_irq_disable();
-       while (1)
-               halt();
+       /* mask all interrupts, flush any and all caches, and halt */
+       wbinvd_halt();
 }
 #else
 static inline void play_dead(void)
index 703310a990239d686516fbcccfc5ede3d05c0cda..6f50664b2ba50564dfbf10c017f52bcc247a9af8 100644 (file)
 #define PAGE_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
 #define PAE_PGD_ATTR (_PAGE_PRESENT)
 
-/* control_page + PAGE_SIZE/2 ~ control_page + PAGE_SIZE * 3/4 are
- * used to save some data for jumping back
+/* control_page + KEXEC_CONTROL_CODE_MAX_SIZE
+ * ~ control_page + PAGE_SIZE are used as data storage and stack for
+ * jumping back
  */
-#define DATA(offset)           (PAGE_SIZE/2+(offset))
+#define DATA(offset)           (KEXEC_CONTROL_CODE_MAX_SIZE+(offset))
 
 /* Minimal CPU state */
 #define ESP                    DATA(0x0)
@@ -376,3 +377,6 @@ swap_pages:
        popl    %ebx
        popl    %ebp
        ret
+
+       .globl kexec_control_code_size
+.set kexec_control_code_size, . - relocate_kernel
index 68b48e3fbcbd92b7115ac90cb59cd9c1d3bc4054..a4656adab53b356d36d787b9c2067af703ff0b36 100644 (file)
@@ -445,7 +445,7 @@ static void __init reserve_early_setup_data(void)
  * @size: Size of the crashkernel memory to reserve.
  * Returns the base address on success, and -1ULL on failure.
  */
-unsigned long long find_and_reserve_crashkernel(unsigned long long size)
+unsigned long long __init find_and_reserve_crashkernel(unsigned long long size)
 {
        const unsigned long long alignment = 16<<20;    /* 16M */
        unsigned long long start = 0LL;
index b45ef8ddd6510901ab3d089e1ca21f36a90167d7..ca316b5b742ced782dc3ab4b4c8631b5a9d43a6c 100644 (file)
@@ -104,7 +104,16 @@ static inline int restore_i387(struct _fpstate __user *buf)
                clts();
                task_thread_info(current)->status |= TS_USEDFPU;
        }
-       return restore_fpu_checking((__force struct i387_fxsave_struct *)buf);
+       err = restore_fpu_checking((__force struct i387_fxsave_struct *)buf);
+       if (unlikely(err)) {
+               /*
+                * Encountered an error while doing the restore from the
+                * user buffer, clear the fpu state.
+                */
+               clear_fpu(tsk);
+               clear_used_math();
+       }
+       return err;
 }
 
 /*
index 91055d7fc1b0444d3e1446181216a06db2ce6978..e139e617f422a932238393b7c5d180f289cd268e 100644 (file)
@@ -756,6 +756,14 @@ static void __cpuinit do_fork_idle(struct work_struct *work)
 }
 
 #ifdef CONFIG_X86_64
+
+/* __ref because it's safe to call free_bootmem when after_bootmem == 0. */
+static void __ref free_bootmem_pda(struct x8664_pda *oldpda)
+{
+       if (!after_bootmem)
+               free_bootmem((unsigned long)oldpda, sizeof(*oldpda));
+}
+
 /*
  * Allocate node local memory for the AP pda.
  *
@@ -784,8 +792,7 @@ int __cpuinit get_local_pda(int cpu)
 
        if (oldpda) {
                memcpy(newpda, oldpda, size);
-               if (!after_bootmem)
-                       free_bootmem((unsigned long)oldpda, size);
+               free_bootmem_pda(oldpda);
        }
 
        newpda->in_bootmem = 0;
@@ -994,17 +1001,7 @@ int __cpuinit native_cpu_up(unsigned int cpu)
        flush_tlb_all();
        low_mappings = 1;
 
-#ifdef CONFIG_X86_PC
-       if (def_to_bigsmp && apicid > 8) {
-               printk(KERN_WARNING
-                       "More than 8 CPUs detected - skipping them.\n"
-                       "Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP.\n");
-               err = -1;
-       } else
-               err = do_boot_cpu(apicid, cpu);
-#else
        err = do_boot_cpu(apicid, cpu);
-#endif
 
        zap_low_mappings();
        low_mappings = 0;
@@ -1058,6 +1055,34 @@ static __init void disable_smp(void)
 static int __init smp_sanity_check(unsigned max_cpus)
 {
        preempt_disable();
+
+#if defined(CONFIG_X86_PC) && defined(CONFIG_X86_32)
+       if (def_to_bigsmp && nr_cpu_ids > 8) {
+               unsigned int cpu;
+               unsigned nr;
+
+               printk(KERN_WARNING
+                      "More than 8 CPUs detected - skipping them.\n"
+                      "Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP.\n");
+
+               nr = 0;
+               for_each_present_cpu(cpu) {
+                       if (nr >= 8)
+                               cpu_clear(cpu, cpu_present_map);
+                       nr++;
+               }
+
+               nr = 0;
+               for_each_possible_cpu(cpu) {
+                       if (nr >= 8)
+                               cpu_clear(cpu, cpu_possible_map);
+                       nr++;
+               }
+
+               nr_cpu_ids = 8;
+       }
+#endif
+
        if (!physid_isset(hard_smp_processor_id(), phys_cpu_present_map)) {
                printk(KERN_WARNING "weird, boot CPU (#%d) not listed"
                                    "by the BIOS.\n", hard_smp_processor_id());
@@ -1386,17 +1411,3 @@ void __cpu_die(unsigned int cpu)
        BUG();
 }
 #endif
-
-/*
- * If the BIOS enumerates physical processors before logical,
- * maxcpus=N at enumeration-time can be used to disable HT.
- */
-static int __init parse_maxcpus(char *arg)
-{
-       extern unsigned int maxcpus;
-
-       if (arg)
-               maxcpus = simple_strtoul(arg, NULL, 0);
-       return 0;
-}
-early_param("maxcpus", parse_maxcpus);
index 99941b37eca0e81e2b44701934e507a7cc74f187..397e309839ddffdf3114dd3f7436ceb549eb3415 100644 (file)
@@ -8,18 +8,21 @@
 DEFINE_PER_CPU(unsigned long, this_cpu_off);
 EXPORT_PER_CPU_SYMBOL(this_cpu_off);
 
-/* Initialize the CPU's GDT.  This is either the boot CPU doing itself
-   (still using the master per-cpu area), or a CPU doing it for a
-   secondary which will soon come up. */
+/*
+ * Initialize the CPU's GDT.  This is either the boot CPU doing itself
+ * (still using the master per-cpu area), or a CPU doing it for a
+ * secondary which will soon come up.
+ */
 __cpuinit void init_gdt(int cpu)
 {
-       struct desc_struct *gdt = get_cpu_gdt_table(cpu);
+       struct desc_struct gdt;
 
-       pack_descriptor(&gdt[GDT_ENTRY_PERCPU],
-                       __per_cpu_offset[cpu], 0xFFFFF,
+       pack_descriptor(&gdt, __per_cpu_offset[cpu], 0xFFFFF,
                        0x2 | DESCTYPE_S, 0x8);
+       gdt.s = 1;
 
-       gdt[GDT_ENTRY_PERCPU].s = 1;
+       write_gdt_entry(get_cpu_gdt_table(cpu),
+                       GDT_ENTRY_PERCPU, &gdt, DESCTYPE_S);
 
        per_cpu(this_cpu_off, cpu) = __per_cpu_offset[cpu];
        per_cpu(cpu_number, cpu) = cpu;
index 3f18d73f420c414d809a1046dd5676b992e8676e..513caaca7115eecf5d7a58de7cf12fbe9e60e6e4 100644 (file)
@@ -1131,7 +1131,14 @@ asmlinkage void math_state_restore(void)
        }
 
        clts();                         /* Allow maths ops (or we recurse) */
-       restore_fpu_checking(&me->thread.xstate->fxsave);
+       /*
+        * Paranoid restore. send a SIGSEGV if we fail to restore the state.
+        */
+       if (unlikely(restore_fpu_checking(&me->thread.xstate->fxsave))) {
+               stts();
+               force_sig(SIGSEGV, me);
+               return;
+       }
        task_thread_info(me)->status |= TS_USEDFPU;
        me->fpu_counter++;
 }
index 7603c0553909efa29718b6857cda56ba2469cd4f..46af71676738e4ec49640fdcaacd20a85c034bc8 100644 (file)
@@ -104,7 +104,7 @@ __setup("notsc", notsc_setup);
 /*
  * Read TSC and the reference counters. Take care of SMI disturbance
  */
-static u64 __init tsc_read_refs(u64 *pm, u64 *hpet)
+static u64 tsc_read_refs(u64 *pm, u64 *hpet)
 {
        u64 t1, t2;
        int i;
index 41e01b145c4800c514e07f456a126a0a0b5104e7..594ef47f0a639fc66d8967805acc142fec1a8ca9 100644 (file)
@@ -184,8 +184,6 @@ static int __init visws_get_smp_config(unsigned int early)
        return 1;
 }
 
-extern unsigned int __cpuinitdata maxcpus;
-
 /*
  * The Visual Workstation is Intel MP compliant in the hardware
  * sense, but it doesn't have a BIOS(-configuration table).
@@ -244,8 +242,8 @@ static int __init visws_find_smp_config(unsigned int reserve)
                ncpus = CO_CPU_MAX;
        }
 
-       if (ncpus > maxcpus)
-               ncpus = maxcpus;
+       if (ncpus > setup_max_cpus)
+               ncpus = setup_max_cpus;
 
 #ifdef CONFIG_X86_LOCAL_APIC
        smp_found_config = 1;
index cdb2363697d2c52655139543862af80b820a8f91..af5bdad84604abfa36a2ef7a030caaf473069e34 100644 (file)
@@ -209,3 +209,11 @@ SECTIONS
 
   DWARF_DEBUG
 }
+
+#ifdef CONFIG_KEXEC
+/* Link time checks */
+#include <asm/kexec.h>
+
+ASSERT(kexec_control_code_size <= KEXEC_CONTROL_CODE_MAX_SIZE,
+       "kexec control code size is too big")
+#endif
index 129618ca0ea274a980ba414b30e604e67c3217fd..a87ea0e4b3dca3e7149aa03321af508cc1216b0d 100644 (file)
@@ -60,7 +60,7 @@ static unsigned long dma_reserve __initdata;
 
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 
-int direct_gbpages __meminitdata
+int direct_gbpages
 #ifdef CONFIG_DIRECT_GBPAGES
                                = 1
 #endif
@@ -88,7 +88,11 @@ early_param("gbpages", parse_direct_gbpages_on);
 
 int after_bootmem;
 
-static __init void *spp_getpage(void)
+/*
+ * NOTE: This function is marked __ref because it calls __init function
+ * (alloc_bootmem_pages). It's safe to do it ONLY when after_bootmem == 0.
+ */
+static __ref void *spp_getpage(void)
 {
        void *ptr;
 
@@ -314,6 +318,7 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end,
 {
        unsigned long pages = 0;
        unsigned long last_map_addr = end;
+       unsigned long start = address;
 
        int i = pmd_index(address);
 
@@ -334,6 +339,9 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end,
                        if (!pmd_large(*pmd))
                                last_map_addr = phys_pte_update(pmd, address,
                                                                 end);
+                       /* Count entries we're using from level2_ident_pgt */
+                       if (start == 0)
+                               pages++;
                        continue;
                }
 
index 016f335bbeea34035ed329450d48697cca85de30..6ba6f889c79da6f7c0370df17ef529cf5dd16a93 100644 (file)
@@ -170,7 +170,7 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr,
        phys_addr &= PAGE_MASK;
        size = PAGE_ALIGN(last_addr+1) - phys_addr;
 
-       retval = reserve_memtype(phys_addr, phys_addr + size,
+       retval = reserve_memtype(phys_addr, (u64)phys_addr + size,
                                                prot_val, &new_prot_val);
        if (retval) {
                pr_debug("Warning: reserve_memtype returned %d\n", retval);
index 0dcd42eb94e66fd8650422cb25e348cc18da3cf5..d4aa503caaa29696c055218bdfbd9cd7faf903fb 100644 (file)
@@ -221,8 +221,7 @@ static int pageattr_test(void)
        failed += print_split(&sc);
 
        if (failed) {
-               printk(KERN_ERR "NOT PASSED. Please report.\n");
-               WARN_ON(1);
+               WARN(1, KERN_ERR "NOT PASSED. Please report.\n");
                return -EINVAL;
        } else {
                if (print)
index 65c6e46bf059ae10bfa86b83c087c29ecb2f0070..f5f5154ea11e4b788d98a9a12e4d23ddd28e4525 100644 (file)
@@ -55,13 +55,19 @@ static void split_page_count(int level)
 
 int arch_report_meminfo(char *page)
 {
-       int n = sprintf(page, "DirectMap4k:  %8lu\n"
-                       "DirectMap2M:  %8lu\n",
-                       direct_pages_count[PG_LEVEL_4K],
-                       direct_pages_count[PG_LEVEL_2M]);
+       int n = sprintf(page, "DirectMap4k:  %8lu kB\n",
+                       direct_pages_count[PG_LEVEL_4K] << 2);
+#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
+       n += sprintf(page + n, "DirectMap2M:  %8lu kB\n",
+                       direct_pages_count[PG_LEVEL_2M] << 11);
+#else
+       n += sprintf(page + n, "DirectMap4M:  %8lu kB\n",
+                       direct_pages_count[PG_LEVEL_2M] << 12);
+#endif
 #ifdef CONFIG_X86_64
-       n += sprintf(page + n, "DirectMap1G:  %8lu\n",
-                    direct_pages_count[PG_LEVEL_1G]);
+       if (direct_gbpages)
+               n += sprintf(page + n, "DirectMap1G:  %8lu kB\n",
+                       direct_pages_count[PG_LEVEL_1G] << 20);
 #endif
        return n;
 }
@@ -592,10 +598,9 @@ repeat:
        if (!pte_val(old_pte)) {
                if (!primary)
                        return 0;
-               printk(KERN_WARNING "CPA: called for zero pte. "
+               WARN(1, KERN_WARNING "CPA: called for zero pte. "
                       "vaddr = %lx cpa->vaddr = %lx\n", address,
                       cpa->vaddr);
-               WARN_ON(1);
                return -EINVAL;
        }
 
index 1eb2973a301ce4552e931fb1968a27ae46771fd0..16ae70fc57e77928e56347adea7b48ac08b4e6e1 100644 (file)
@@ -178,7 +178,7 @@ void acpi_numa_arch_fixup(void)
  * start of the node, and that the current "end" address is after
  * the previous one.
  */
-static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_chunk)
+static __init int node_read_chunk(int nid, struct node_memory_chunk_s *memory_chunk)
 {
        /*
         * Only add present memory as told by the e820.
@@ -189,10 +189,10 @@ static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_c
        if (memory_chunk->start_pfn >= max_pfn) {
                printk(KERN_INFO "Ignoring SRAT pfns: %08lx - %08lx\n",
                        memory_chunk->start_pfn, memory_chunk->end_pfn);
-               return;
+               return -1;
        }
        if (memory_chunk->nid != nid)
-               return;
+               return -1;
 
        if (!node_has_online_mem(nid))
                node_start_pfn[nid] = memory_chunk->start_pfn;
@@ -202,6 +202,8 @@ static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_c
 
        if (node_end_pfn[nid] < memory_chunk->end_pfn)
                node_end_pfn[nid] = memory_chunk->end_pfn;
+
+       return 0;
 }
 
 int __init get_memcfg_from_srat(void)
@@ -259,7 +261,9 @@ int __init get_memcfg_from_srat(void)
                printk(KERN_DEBUG
                        "chunk %d nid %d start_pfn %08lx end_pfn %08lx\n",
                       j, chunk->nid, chunk->start_pfn, chunk->end_pfn);
-               node_read_chunk(chunk->nid, chunk);
+               if (node_read_chunk(chunk->nid, chunk))
+                       continue;
+
                e820_register_active_regions(chunk->nid, chunk->start_pfn,
                                             min(chunk->end_pfn, max_pfn));
        }
index fec0123b33a9dde965e42caf9ae1e3ab23cb118c..8e077185e185cbc72e58be92fcbd29f05437ed23 100644 (file)
@@ -590,6 +590,8 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route
        case PCI_DEVICE_ID_INTEL_ICH10_1:
        case PCI_DEVICE_ID_INTEL_ICH10_2:
        case PCI_DEVICE_ID_INTEL_ICH10_3:
+       case PCI_DEVICE_ID_INTEL_PCH_0:
+       case PCI_DEVICE_ID_INTEL_PCH_1:
                r->name = "PIIX/ICH";
                r->get = pirq_piix_get;
                r->set = pirq_piix_set;
index ec9ce35e44d6afe51b2c63bafbe9d5e3053d68c4..b722dd481b3975b2b9b171203a42f6406b9cafed 100644 (file)
@@ -14,7 +14,7 @@ static void __devinit pcibios_fixup_peer_bridges(void)
        int n, devfn;
        long node;
 
-       if (pcibios_last_bus <= 0 || pcibios_last_bus >= 0xff)
+       if (pcibios_last_bus <= 0 || pcibios_last_bus > 0xff)
                return;
        DBG("PCI: Peer bridge fixup\n");
 
index 23faaa890ffcd8aac87502d827d3c8d3c7ab7399..d9635764ce3de8eff7163ef5e44ddc59a2000e18 100644 (file)
@@ -293,7 +293,7 @@ static acpi_status __init find_mboard_resource(acpi_handle handle, u32 lvl,
        return AE_OK;
 }
 
-static int __init is_acpi_reserved(unsigned long start, unsigned long end)
+static int __init is_acpi_reserved(u64 start, u64 end, unsigned not_used)
 {
        struct resource mcfg_res;
 
@@ -310,6 +310,41 @@ static int __init is_acpi_reserved(unsigned long start, unsigned long end)
        return mcfg_res.flags;
 }
 
+typedef int (*check_reserved_t)(u64 start, u64 end, unsigned type);
+
+static int __init is_mmconf_reserved(check_reserved_t is_reserved,
+               u64 addr, u64 size, int i,
+               typeof(pci_mmcfg_config[0]) *cfg, int with_e820)
+{
+       u64 old_size = size;
+       int valid = 0;
+
+       while (!is_reserved(addr, addr + size - 1, E820_RESERVED)) {
+               size >>= 1;
+               if (size < (16UL<<20))
+                       break;
+       }
+
+       if (size >= (16UL<<20) || size == old_size) {
+               printk(KERN_NOTICE
+                      "PCI: MCFG area at %Lx reserved in %s\n",
+                       addr, with_e820?"E820":"ACPI motherboard resources");
+               valid = 1;
+
+               if (old_size != size) {
+                       /* update end_bus_number */
+                       cfg->end_bus_number = cfg->start_bus_number + ((size>>20) - 1);
+                       printk(KERN_NOTICE "PCI: updated MCFG configuration %d: base %lx "
+                              "segment %hu buses %u - %u\n",
+                              i, (unsigned long)cfg->address, cfg->pci_segment,
+                              (unsigned int)cfg->start_bus_number,
+                              (unsigned int)cfg->end_bus_number);
+               }
+       }
+
+       return valid;
+}
+
 static void __init pci_mmcfg_reject_broken(int early)
 {
        typeof(pci_mmcfg_config[0]) *cfg;
@@ -324,21 +359,22 @@ static void __init pci_mmcfg_reject_broken(int early)
 
        for (i = 0; i < pci_mmcfg_config_num; i++) {
                int valid = 0;
-               u32 size = (cfg->end_bus_number + 1) << 20;
+               u64 addr, size;
+
                cfg = &pci_mmcfg_config[i];
+               addr = cfg->start_bus_number;
+               addr <<= 20;
+               addr += cfg->address;
+               size = cfg->end_bus_number + 1 - cfg->start_bus_number;
+               size <<= 20;
                printk(KERN_NOTICE "PCI: MCFG configuration %d: base %lx "
                       "segment %hu buses %u - %u\n",
                       i, (unsigned long)cfg->address, cfg->pci_segment,
                       (unsigned int)cfg->start_bus_number,
                       (unsigned int)cfg->end_bus_number);
 
-               if (!early &&
-                   is_acpi_reserved(cfg->address, cfg->address + size - 1)) {
-                       printk(KERN_NOTICE "PCI: MCFG area at %Lx reserved "
-                              "in ACPI motherboard resources\n",
-                              cfg->address);
-                       valid = 1;
-               }
+               if (!early)
+                       valid = is_mmconf_reserved(is_acpi_reserved, addr, size, i, cfg, 0);
 
                if (valid)
                        continue;
@@ -347,16 +383,11 @@ static void __init pci_mmcfg_reject_broken(int early)
                        printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %Lx is not"
                               " reserved in ACPI motherboard resources\n",
                               cfg->address);
+
                /* Don't try to do this check unless configuration
                   type 1 is available. how about type 2 ?*/
-               if (raw_pci_ops && e820_all_mapped(cfg->address,
-                                                 cfg->address + size - 1,
-                                                 E820_RESERVED)) {
-                       printk(KERN_NOTICE
-                              "PCI: MCFG area at %Lx reserved in E820\n",
-                              cfg->address);
-                       valid = 1;
-               }
+               if (raw_pci_ops)
+                       valid = is_mmconf_reserved(e820_all_mapped, addr, size, i, cfg, 1);
 
                if (!valid)
                        goto reject;
@@ -365,7 +396,7 @@ static void __init pci_mmcfg_reject_broken(int early)
        return;
 
 reject:
-       printk(KERN_ERR "PCI: Not using MMCONFIG.\n");
+       printk(KERN_INFO "PCI: Not using MMCONFIG.\n");
        pci_mmcfg_arch_free();
        kfree(pci_mmcfg_config);
        pci_mmcfg_config = NULL;
index 7dc5d5cf50a2c85c2cad15c84f5e455abd42a34e..d3e083dea7202c8b5c82e1d7378d947f9f2d42a3 100644 (file)
@@ -45,7 +45,7 @@ static void __save_processor_state(struct saved_context *ctxt)
        ctxt->cr0 = read_cr0();
        ctxt->cr2 = read_cr2();
        ctxt->cr3 = read_cr3();
-       ctxt->cr4 = read_cr4();
+       ctxt->cr4 = read_cr4_safe();
 }
 
 /* Needed by apm.c */
@@ -98,7 +98,9 @@ static void __restore_processor_state(struct saved_context *ctxt)
        /*
         * control registers
         */
-       write_cr4(ctxt->cr4);
+       /* cr4 was introduced in the Pentium CPU */
+       if (ctxt->cr4)
+               write_cr4(ctxt->cr4);
        write_cr3(ctxt->cr3);
        write_cr2(ctxt->cr2);
        write_cr0(ctxt->cr0);
index b95aa6cfe3cb207befad0a4337678317ec1f9606..4fc7e872c85e4e103039f582eea5050cfc7f2f4a 100644 (file)
@@ -28,9 +28,9 @@ ENTRY(swsusp_arch_suspend)
        ret
 
 ENTRY(restore_image)
-       movl    resume_pg_dir, %ecx
-       subl    $__PAGE_OFFSET, %ecx
-       movl    %ecx, %cr3
+       movl    resume_pg_dir, %eax
+       subl    $__PAGE_OFFSET, %eax
+       movl    %eax, %cr3
 
        movl    restore_pblist, %edx
        .p2align 4,,7
@@ -52,17 +52,21 @@ copy_loop:
 
 done:
        /* go back to the original page tables */
-       movl    $swapper_pg_dir, %ecx
-       subl    $__PAGE_OFFSET, %ecx
-       movl    %ecx, %cr3
+       movl    $swapper_pg_dir, %eax
+       subl    $__PAGE_OFFSET, %eax
+       movl    %eax, %cr3
        /* Flush TLB, including "global" things (vmalloc) */
-       movl    mmu_cr4_features, %eax
-       movl    %eax, %edx
+       movl    mmu_cr4_features, %ecx
+       jecxz   1f      # cr4 Pentium and higher, skip if zero
+       movl    %ecx, %edx
        andl    $~(1<<7), %edx;  # PGE
        movl    %edx, %cr4;  # turn off PGE
-       movl    %cr3, %ecx;  # flush TLB
-       movl    %ecx, %cr3
-       movl    %eax, %cr4;  # turn PGE back on
+1:
+       movl    %cr3, %eax;  # flush TLB
+       movl    %eax, %cr3
+       jecxz   1f      # cr4 Pentium and higher, skip if zero
+       movl    %ecx, %cr4;  # turn PGE back on
+1:
 
        movl saved_context_esp, %esp
        movl saved_context_ebp, %ebp
index bb7c51f712bd6cde630e4e8e5a771ca9d9e5fc55..7d2edf143f1660f387a486829ce40b548bc96eaf 100644 (file)
@@ -563,9 +563,6 @@ EXPORT_SYMBOL_GPL(unregister_hotplug_dock_device);
  */
 static int handle_eject_request(struct dock_station *ds, u32 event)
 {
-       if (!dock_present(ds))
-               return -ENODEV;
-
        if (dock_in_progress(ds))
                return -EBUSY;
 
@@ -573,8 +570,16 @@ static int handle_eject_request(struct dock_station *ds, u32 event)
         * here we need to generate the undock
         * event prior to actually doing the undock
         * so that the device struct still exists.
+        * Also, even send the dock event if the
+        * device is not present anymore
         */
        dock_event(ds, event, UNDOCK_EVENT);
+
+       if (!dock_present(ds)) {
+               complete_undock(ds);
+               return -ENODEV;
+       }
+
        hotplug_dock_devices(ds, ACPI_NOTIFY_EJECT_REQUEST);
        undock(ds);
        eject_dock(ds);
index 5622aee996b2046a788f6db842925d0dd74aad7b..13593f9f21970ec79af46f62b0233689065e848d 100644 (file)
@@ -110,6 +110,31 @@ static struct acpi_ec {
        u8 handlers_installed;
 } *boot_ec, *first_ec;
 
+/* 
+ * Some Asus system have exchanged ECDT data/command IO addresses.
+ */
+static int print_ecdt_error(const struct dmi_system_id *id)
+{
+       printk(KERN_NOTICE PREFIX "%s detected - "
+               "ECDT has exchanged control/data I/O address\n",
+               id->ident);
+       return 0;
+}
+
+static struct dmi_system_id __cpuinitdata ec_dmi_table[] = {
+       {
+       print_ecdt_error, "Asus L4R", {
+       DMI_MATCH(DMI_BIOS_VERSION, "1008.006"),
+       DMI_MATCH(DMI_PRODUCT_NAME, "L4R"),
+       DMI_MATCH(DMI_BOARD_NAME, "L4R") }, NULL},
+       {
+       print_ecdt_error, "Asus M6R", {
+       DMI_MATCH(DMI_BIOS_VERSION, "0207"),
+       DMI_MATCH(DMI_PRODUCT_NAME, "M6R"),
+       DMI_MATCH(DMI_BOARD_NAME, "M6R") }, NULL},
+       {},
+};
+
 /* --------------------------------------------------------------------------
                              Transaction Management
    -------------------------------------------------------------------------- */
@@ -196,6 +221,8 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll)
                                return 0;
                        msleep(1);
                }
+               if (acpi_ec_check_status(ec,event))
+                       return 0;
        }
        pr_err(PREFIX "acpi_ec_wait timeout, status = 0x%2.2x, event = %s\n",
                acpi_ec_read_status(ec),
@@ -911,6 +938,15 @@ int __init acpi_ec_ecdt_probe(void)
                pr_info(PREFIX "EC description table is found, configuring boot EC\n");
                boot_ec->command_addr = ecdt_ptr->control.address;
                boot_ec->data_addr = ecdt_ptr->data.address;
+               if (dmi_check_system(ec_dmi_table)) {
+                       /*
+                        * If the board falls into ec_dmi_table, it means
+                        * that ECDT table gives the incorrect command/status
+                        * & data I/O address. Just fix it.
+                        */
+                       boot_ec->data_addr = ecdt_ptr->control.address;
+                       boot_ec->command_addr = ecdt_ptr->data.address;
+               }
                boot_ec->gpe = ecdt_ptr->gpe;
                boot_ec->handle = ACPI_ROOT_OBJECT;
                acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id, &boot_ec->handle);
index 2a32c843cb4a384a3557d80293cc4abef5a000ee..8892b9824fae7d8acad9c214356df84c528dc9b1 100644 (file)
@@ -479,5 +479,8 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
 
        acpi_tb_set_table_loaded_flag(table_index, FALSE);
 
+       /* Table unloaded, remove a reference to the ddb_handle object */
+
+       acpi_ut_remove_reference(ddb_handle);
        return_ACPI_STATUS(AE_OK);
 }
index 549db42f16cf5b8d4354db7c9ba386f466ff1c36..bd5773878009eeb8b9ce38863465c92da6a0d660 100644 (file)
@@ -56,13 +56,14 @@ ACPI_MODULE_NAME("nsnames")
  *              Size            - Size of the pathname
  *              *name_buffer    - Where to return the pathname
  *
- * RETURN:      Places the pathname into the name_buffer, in external format
+ * RETURN:      Status
+ *              Places the pathname into the name_buffer, in external format
  *              (name segments separated by path separators)
  *
  * DESCRIPTION: Generate a full pathaname
  *
  ******************************************************************************/
-void
+acpi_status
 acpi_ns_build_external_path(struct acpi_namespace_node *node,
                            acpi_size size, char *name_buffer)
 {
@@ -77,7 +78,7 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node,
        if (index < ACPI_NAME_SIZE) {
                name_buffer[0] = AML_ROOT_PREFIX;
                name_buffer[1] = 0;
-               return;
+               return (AE_OK);
        }
 
        /* Store terminator byte, then build name backwards */
@@ -105,11 +106,13 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node,
 
        if (index != 0) {
                ACPI_ERROR((AE_INFO,
-                           "Could not construct pathname; index=%X, size=%X, Path=%s",
+                           "Could not construct external pathname; index=%X, size=%X, Path=%s",
                            (u32) index, (u32) size, &name_buffer[size]));
+
+               return (AE_BAD_PARAMETER);
        }
 
-       return;
+       return (AE_OK);
 }
 
 #ifdef ACPI_DEBUG_OUTPUT
@@ -129,6 +132,7 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node,
 
 char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
 {
+       acpi_status status;
        char *name_buffer;
        acpi_size size;
 
@@ -138,8 +142,7 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
 
        size = acpi_ns_get_pathname_length(node);
        if (!size) {
-               ACPI_ERROR((AE_INFO, "Invalid node failure"));
-               return_PTR(NULL);
+               return (NULL);
        }
 
        /* Allocate a buffer to be returned to caller */
@@ -152,7 +155,11 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
 
        /* Build the path in the allocated buffer */
 
-       acpi_ns_build_external_path(node, size, name_buffer);
+       status = acpi_ns_build_external_path(node, size, name_buffer);
+       if (ACPI_FAILURE(status)) {
+               return (NULL);
+       }
+
        return_PTR(name_buffer);
 }
 #endif
@@ -186,7 +193,7 @@ acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node)
        while (next_node && (next_node != acpi_gbl_root_node)) {
                if (ACPI_GET_DESCRIPTOR_TYPE(next_node) != ACPI_DESC_TYPE_NAMED) {
                        ACPI_ERROR((AE_INFO,
-                                   "Invalid NS Node (%p) while traversing path",
+                                   "Invalid Namespace Node (%p) while traversing namespace",
                                    next_node));
                        return 0;
                }
@@ -234,8 +241,7 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle,
 
        required_size = acpi_ns_get_pathname_length(node);
        if (!required_size) {
-               ACPI_ERROR((AE_INFO, "Invalid node failure"));
-               return_ACPI_STATUS(AE_ERROR);
+               return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
        /* Validate/Allocate/Clear caller buffer */
@@ -247,7 +253,11 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle,
 
        /* Build the path in the caller buffer */
 
-       acpi_ns_build_external_path(node, required_size, buffer->pointer);
+       status =
+           acpi_ns_build_external_path(node, required_size, buffer->pointer);
+       if (ACPI_FAILURE(status)) {
+               return_ACPI_STATUS(status);
+       }
 
        ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s [%X]\n",
                          (char *)buffer->pointer, (u32) required_size));
index 89f3b2abfdc7b9f15f65513cdb1d852712735c8f..cf47805a7448ccc9ddfbec7009cc975be371c760 100644 (file)
@@ -849,7 +849,7 @@ static int __init acpi_irq_penalty_update(char *str, int used)
                if (irq < 0)
                        continue;
 
-               if (irq >= ACPI_MAX_IRQS)
+               if (irq >= ARRAY_SIZE(acpi_irq_penalty))
                        continue;
 
                if (used)
@@ -872,10 +872,12 @@ static int __init acpi_irq_penalty_update(char *str, int used)
  */
 void acpi_penalize_isa_irq(int irq, int active)
 {
-       if (active)
-               acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
-       else
-               acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
+       if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
+               if (active)
+                       acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
+               else
+                       acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
+       }
 }
 
 /*
index e36422a7122c7e974ce9728fce8b97b21e8fe49a..d3f0a62efcc1afaf61418a0bee4a7d0ac1b8d161 100644 (file)
@@ -123,7 +123,7 @@ struct acpi_processor_errata errata __read_mostly;
 static int set_no_mwait(const struct dmi_system_id *id)
 {
        printk(KERN_NOTICE PREFIX "%s detected - "
-               "disable mwait for CPU C-stetes\n", id->ident);
+               "disabling mwait for CPU C-states\n", id->ident);
        idle_nomwait = 1;
        return 0;
 }
index 283c08f5f4d4390bfd12a7bfd820787a1344dbde..cf5b1b7b684f1de0473796d26ed8e2edc2213eef 100644 (file)
@@ -41,7 +41,6 @@
 #include <linux/pm_qos_params.h>
 #include <linux/clockchips.h>
 #include <linux/cpuidle.h>
-#include <linux/cpuidle.h>
 
 /*
  * Include the apic definitions for x86 to have the APIC timer related defines
index 0133af49cf06851ebb60d756404f48938b299c6f..80e32093e977c6a3c5427e0746c1732a2282e017 100644 (file)
@@ -70,7 +70,7 @@ static DEFINE_MUTEX(performance_mutex);
  *  0 -> cpufreq low level drivers initialized -> consider _PPC values
  *  1 -> ignore _PPC totally -> forced by user through boot param
  */
-static unsigned int ignore_ppc = -1;
+static int ignore_ppc = -1;
 module_param(ignore_ppc, uint, 0644);
 MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \
                 "limited by BIOS, this should help");
index f61ebc679e6645514525a1f5d632c87acbdfd751..d9063ea414e33d2cda60a796dd97eb41379cb1d0 100644 (file)
@@ -587,6 +587,9 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
                        } else {
                                temp_size_needed +=
                                    acpi_ns_get_pathname_length((*sub_object_list)->reference.node);
+                               if (!temp_size_needed) {
+                                       return_ACPI_STATUS(AE_BAD_PARAMETER);
+                               }
                        }
                } else {
                        /*
index e7bf34a7b1d29aa6819ddbfe62403012ca48551e..7dcb67e0b215d1d56de71cff60edf3f4e56b2b9b 100644 (file)
@@ -242,10 +242,12 @@ acpi_ut_initialize_buffer(struct acpi_buffer * buffer,
 {
        acpi_status status = AE_OK;
 
-       if (!required_length) {
-               WARN_ON(1);
-               return AE_ERROR;
+       /* Parameter validation */
+
+       if (!buffer || !required_length) {
+               return (AE_BAD_PARAMETER);
        }
+
        switch (buffer->length) {
        case ACPI_NO_BUFFER:
 
index c5c791a575c9203f63c0a44ad07ad93487282643..42609d3a8aa9db23f3852743f767ee1641b631af 100644 (file)
@@ -135,6 +135,10 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
                obj_pointer = object->package.elements;
                break;
 
+               /*
+                * These objects have a possible list of notify handlers.
+                * Device object also may have a GPE block.
+                */
        case ACPI_TYPE_DEVICE:
 
                if (object->device.gpe_block) {
@@ -142,9 +146,14 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
                                                       gpe_block);
                }
 
-               /* Walk the handler list for this device */
+               /*lint -fallthrough */
+
+       case ACPI_TYPE_PROCESSOR:
+       case ACPI_TYPE_THERMAL:
+
+               /* Walk the notify handler list for this object */
 
-               handler_desc = object->device.handler;
+               handler_desc = object->common_notify.handler;
                while (handler_desc) {
                        next_desc = handler_desc->address_space.next;
                        acpi_ut_remove_reference(handler_desc);
index e25484495e652b026bda9c2dade35c0a07648ba1..916eff399eb3e6c8c9fdd7a00d8a37006621a0d0 100644 (file)
@@ -425,6 +425,7 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
                               acpi_size * obj_length)
 {
        acpi_size length;
+       acpi_size size;
        acpi_status status = AE_OK;
 
        ACPI_FUNCTION_TRACE_PTR(ut_get_simple_object_size, internal_object);
@@ -484,10 +485,14 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
                         * Get the actual length of the full pathname to this object.
                         * The reference will be converted to the pathname to the object
                         */
-                       length +=
-                           ACPI_ROUND_UP_TO_NATIVE_WORD
-                           (acpi_ns_get_pathname_length
-                            (internal_object->reference.node));
+                       size =
+                           acpi_ns_get_pathname_length(internal_object->
+                                                       reference.node);
+                       if (!size) {
+                               return_ACPI_STATUS(AE_BAD_PARAMETER);
+                       }
+
+                       length += ACPI_ROUND_UP_TO_NATIVE_WORD(size);
                        break;
 
                default:
index c33b1c6e93b11b4b975c859de79abbf63b797593..cfe2c833474d07e0a7dc6ddc35b6656c9bc4523a 100644 (file)
@@ -347,7 +347,7 @@ struct acpi_buffer *out)
        strcpy(method, "WQ");
        strncat(method, block->object_id, 2);
 
-       status = acpi_evaluate_object(handle, method, NULL, out);
+       status = acpi_evaluate_object(handle, method, &input, out);
 
        /*
         * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if
index 24b97b0bef994411bda31e377c041da6471ed9a2..d070d492e385b26893e34d514cbda0fa6cb5e34f 100644 (file)
@@ -571,8 +571,8 @@ out_free:
                list_del(&brd->brd_list);
                brd_free(brd);
        }
+       unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
 
-       unregister_blkdev(RAMDISK_MAJOR, "brd");
        return -ENOMEM;
 }
 
index ad98dda6037dd5193baa266bf2471c52ca1b6f79..1778e4a2c672be69ce18e6a8c64e2356ceca5b92 100644 (file)
@@ -707,15 +707,15 @@ static int __init nbd_init(void)
 
        BUILD_BUG_ON(sizeof(struct nbd_request) != 28);
 
-       nbd_dev = kcalloc(nbds_max, sizeof(*nbd_dev), GFP_KERNEL);
-       if (!nbd_dev)
-               return -ENOMEM;
-
        if (max_part < 0) {
                printk(KERN_CRIT "nbd: max_part must be >= 0\n");
                return -EINVAL;
        }
 
+       nbd_dev = kcalloc(nbds_max, sizeof(*nbd_dev), GFP_KERNEL);
+       if (!nbd_dev)
+               return -ENOMEM;
+
        part_shift = 0;
        if (max_part > 0)
                part_shift = fls(max_part);
@@ -779,6 +779,7 @@ out:
                blk_cleanup_queue(nbd_dev[i].disk->queue);
                put_disk(nbd_dev[i].disk);
        }
+       kfree(nbd_dev);
        return err;
 }
 
@@ -795,6 +796,7 @@ static void __exit nbd_cleanup(void)
                }
        }
        unregister_blkdev(NBD_MAJOR, "nbd");
+       kfree(nbd_dev);
        printk(KERN_INFO "nbd: unregistered device at major %d\n", NBD_MAJOR);
 }
 
index a235ca787465f5bb0d310fd4211635492f43dc26..7cb4029a5375a774ed9c0cc888284d37330b1b17 100644 (file)
@@ -3,8 +3,8 @@ menu "Bluetooth device drivers"
        depends on BT
 
 config BT_HCIUSB
-       tristate "HCI USB driver"
-       depends on USB
+       tristate "HCI USB driver (old version)"
+       depends on USB && BT_HCIBTUSB=n
        help
          Bluetooth HCI USB driver.
          This driver is required if you want to use Bluetooth devices with
@@ -23,15 +23,13 @@ config BT_HCIUSB_SCO
          Say Y here to compile support for SCO over HCI USB.
 
 config BT_HCIBTUSB
-       tristate "HCI USB driver (alternate version)"
-       depends on USB && EXPERIMENTAL && BT_HCIUSB=n
+       tristate "HCI USB driver"
+       depends on USB
        help
          Bluetooth HCI USB driver.
          This driver is required if you want to use Bluetooth devices with
          USB interface.
 
-          This driver is still experimental and has no SCO support.
-
          Say Y here to compile support for Bluetooth USB devices into the
          kernel or say M to compile it as module (btusb).
 
index 593b7c5950380bff58d8dac8d19ba95cf129220d..27058477cc8b7722bdc901ec7edb21e1d503be27 100644 (file)
@@ -60,7 +60,7 @@
 /* ======================== Module parameters ======================== */
 
 
-MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>, Jose Orlando Pereira <jop@di.uminho.pt>");
+MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
 MODULE_DESCRIPTION("Bluetooth driver for the 3Com Bluetooth PCMCIA card");
 MODULE_LICENSE("GPL");
 MODULE_FIRMWARE("BT3CPCC.bin");
index 95ae9ba5661e41d8f922ebc2d49836cfe8698f5e..6a010681ecf3d33f114bb78607e0d6f19d46b319 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Generic Bluetooth USB driver
  *
- *  Copyright (C) 2005-2007  Marcel Holtmann <marcel@holtmann.org>
+ *  Copyright (C) 2005-2008  Marcel Holtmann <marcel@holtmann.org>
  *
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -41,7 +41,7 @@
 #define BT_DBG(D...)
 #endif
 
-#define VERSION "0.2"
+#define VERSION "0.3"
 
 static int ignore_dga;
 static int ignore_csr;
@@ -160,12 +160,16 @@ static struct usb_device_id blacklist_table[] = {
        { }     /* Terminating entry */
 };
 
+#define BTUSB_MAX_ISOC_FRAMES  10
+
 #define BTUSB_INTR_RUNNING     0
 #define BTUSB_BULK_RUNNING     1
+#define BTUSB_ISOC_RUNNING     2
 
 struct btusb_data {
        struct hci_dev       *hdev;
        struct usb_device    *udev;
+       struct usb_interface *isoc;
 
        spinlock_t lock;
 
@@ -176,10 +180,15 @@ struct btusb_data {
        struct usb_anchor tx_anchor;
        struct usb_anchor intr_anchor;
        struct usb_anchor bulk_anchor;
+       struct usb_anchor isoc_anchor;
 
        struct usb_endpoint_descriptor *intr_ep;
        struct usb_endpoint_descriptor *bulk_tx_ep;
        struct usb_endpoint_descriptor *bulk_rx_ep;
+       struct usb_endpoint_descriptor *isoc_tx_ep;
+       struct usb_endpoint_descriptor *isoc_rx_ep;
+
+       int isoc_altsetting;
 };
 
 static void btusb_intr_complete(struct urb *urb)
@@ -195,6 +204,8 @@ static void btusb_intr_complete(struct urb *urb)
                return;
 
        if (urb->status == 0) {
+               hdev->stat.byte_rx += urb->actual_length;
+
                if (hci_recv_fragment(hdev, HCI_EVENT_PKT,
                                                urb->transfer_buffer,
                                                urb->actual_length) < 0) {
@@ -216,7 +227,7 @@ static void btusb_intr_complete(struct urb *urb)
        }
 }
 
-static inline int btusb_submit_intr_urb(struct hci_dev *hdev)
+static int btusb_submit_intr_urb(struct hci_dev *hdev)
 {
        struct btusb_data *data = hdev->driver_data;
        struct urb *urb;
@@ -226,6 +237,9 @@ static inline int btusb_submit_intr_urb(struct hci_dev *hdev)
 
        BT_DBG("%s", hdev->name);
 
+       if (!data->intr_ep)
+               return -ENODEV;
+
        urb = usb_alloc_urb(0, GFP_ATOMIC);
        if (!urb)
                return -ENOMEM;
@@ -274,6 +288,8 @@ static void btusb_bulk_complete(struct urb *urb)
                return;
 
        if (urb->status == 0) {
+               hdev->stat.byte_rx += urb->actual_length;
+
                if (hci_recv_fragment(hdev, HCI_ACLDATA_PKT,
                                                urb->transfer_buffer,
                                                urb->actual_length) < 0) {
@@ -295,7 +311,7 @@ static void btusb_bulk_complete(struct urb *urb)
        }
 }
 
-static inline int btusb_submit_bulk_urb(struct hci_dev *hdev)
+static int btusb_submit_bulk_urb(struct hci_dev *hdev)
 {
        struct btusb_data *data = hdev->driver_data;
        struct urb *urb;
@@ -305,6 +321,9 @@ static inline int btusb_submit_bulk_urb(struct hci_dev *hdev)
 
        BT_DBG("%s", hdev->name);
 
+       if (!data->bulk_rx_ep)
+               return -ENODEV;
+
        urb = usb_alloc_urb(0, GFP_KERNEL);
        if (!urb)
                return -ENOMEM;
@@ -339,6 +358,127 @@ static inline int btusb_submit_bulk_urb(struct hci_dev *hdev)
        return err;
 }
 
+static void btusb_isoc_complete(struct urb *urb)
+{
+       struct hci_dev *hdev = urb->context;
+       struct btusb_data *data = hdev->driver_data;
+       int i, err;
+
+       BT_DBG("%s urb %p status %d count %d", hdev->name,
+                                       urb, urb->status, urb->actual_length);
+
+       if (!test_bit(HCI_RUNNING, &hdev->flags))
+               return;
+
+       if (urb->status == 0) {
+               for (i = 0; i < urb->number_of_packets; i++) {
+                       unsigned int offset = urb->iso_frame_desc[i].offset;
+                       unsigned int length = urb->iso_frame_desc[i].actual_length;
+
+                       if (urb->iso_frame_desc[i].status)
+                               continue;
+
+                       hdev->stat.byte_rx += length;
+
+                       if (hci_recv_fragment(hdev, HCI_SCODATA_PKT,
+                                               urb->transfer_buffer + offset,
+                                                               length) < 0) {
+                               BT_ERR("%s corrupted SCO packet", hdev->name);
+                               hdev->stat.err_rx++;
+                       }
+               }
+       }
+
+       if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags))
+               return;
+
+       usb_anchor_urb(urb, &data->isoc_anchor);
+
+       err = usb_submit_urb(urb, GFP_ATOMIC);
+       if (err < 0) {
+               BT_ERR("%s urb %p failed to resubmit (%d)",
+                                               hdev->name, urb, -err);
+               usb_unanchor_urb(urb);
+       }
+}
+
+static void inline __fill_isoc_descriptor(struct urb *urb, int len, int mtu)
+{
+       int i, offset = 0;
+
+       BT_DBG("len %d mtu %d", len, mtu);
+
+       for (i = 0; i < BTUSB_MAX_ISOC_FRAMES && len >= mtu;
+                                       i++, offset += mtu, len -= mtu) {
+               urb->iso_frame_desc[i].offset = offset;
+               urb->iso_frame_desc[i].length = mtu;
+       }
+
+       if (len && i < BTUSB_MAX_ISOC_FRAMES) {
+               urb->iso_frame_desc[i].offset = offset;
+               urb->iso_frame_desc[i].length = len;
+               i++;
+       }
+
+       urb->number_of_packets = i;
+}
+
+static int btusb_submit_isoc_urb(struct hci_dev *hdev)
+{
+       struct btusb_data *data = hdev->driver_data;
+       struct urb *urb;
+       unsigned char *buf;
+       unsigned int pipe;
+       int err, size;
+
+       BT_DBG("%s", hdev->name);
+
+       if (!data->isoc_rx_ep)
+               return -ENODEV;
+
+       urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL);
+       if (!urb)
+               return -ENOMEM;
+
+       size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) *
+                                               BTUSB_MAX_ISOC_FRAMES;
+
+       buf = kmalloc(size, GFP_KERNEL);
+       if (!buf) {
+               usb_free_urb(urb);
+               return -ENOMEM;
+       }
+
+       pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress);
+
+       urb->dev      = data->udev;
+       urb->pipe     = pipe;
+       urb->context  = hdev;
+       urb->complete = btusb_isoc_complete;
+       urb->interval = data->isoc_rx_ep->bInterval;
+
+       urb->transfer_flags  = URB_FREE_BUFFER | URB_ISO_ASAP;
+       urb->transfer_buffer = buf;
+       urb->transfer_buffer_length = size;
+
+       __fill_isoc_descriptor(urb, size,
+                       le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize));
+
+       usb_anchor_urb(urb, &data->isoc_anchor);
+
+       err = usb_submit_urb(urb, GFP_KERNEL);
+       if (err < 0) {
+               BT_ERR("%s urb %p submission failed (%d)",
+                                               hdev->name, urb, -err);
+               usb_unanchor_urb(urb);
+               kfree(buf);
+       }
+
+       usb_free_urb(urb);
+
+       return err;
+}
+
 static void btusb_tx_complete(struct urb *urb)
 {
        struct sk_buff *skb = urb->context;
@@ -392,6 +532,9 @@ static int btusb_close(struct hci_dev *hdev)
        if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
                return 0;
 
+       clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
+       usb_kill_anchored_urbs(&data->intr_anchor);
+
        clear_bit(BTUSB_BULK_RUNNING, &data->flags);
        usb_kill_anchored_urbs(&data->bulk_anchor);
 
@@ -453,6 +596,9 @@ static int btusb_send_frame(struct sk_buff *skb)
                break;
 
        case HCI_ACLDATA_PKT:
+               if (!data->bulk_tx_ep || hdev->conn_hash.acl_num < 1)
+                       return -ENODEV;
+
                urb = usb_alloc_urb(0, GFP_ATOMIC);
                if (!urb)
                        return -ENOMEM;
@@ -467,9 +613,31 @@ static int btusb_send_frame(struct sk_buff *skb)
                break;
 
        case HCI_SCODATA_PKT:
+               if (!data->isoc_tx_ep || hdev->conn_hash.sco_num < 1)
+                       return -ENODEV;
+
+               urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_ATOMIC);
+               if (!urb)
+                       return -ENOMEM;
+
+               pipe = usb_sndisocpipe(data->udev,
+                                       data->isoc_tx_ep->bEndpointAddress);
+
+               urb->dev      = data->udev;
+               urb->pipe     = pipe;
+               urb->context  = skb;
+               urb->complete = btusb_tx_complete;
+               urb->interval = data->isoc_tx_ep->bInterval;
+
+               urb->transfer_flags  = URB_ISO_ASAP;
+               urb->transfer_buffer = skb->data;
+               urb->transfer_buffer_length = skb->len;
+
+               __fill_isoc_descriptor(urb, skb->len,
+                               le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize));
+
                hdev->stat.sco_tx++;
-               kfree_skb(skb);
-               return 0;
+               break;
 
        default:
                return -EILSEQ;
@@ -508,22 +676,86 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
                schedule_work(&data->work);
 }
 
+static int inline __set_isoc_interface(struct hci_dev *hdev, int altsetting)
+{
+       struct btusb_data *data = hdev->driver_data;
+       struct usb_interface *intf = data->isoc;
+       struct usb_endpoint_descriptor *ep_desc;
+       int i, err;
+
+       if (!data->isoc)
+               return -ENODEV;
+
+       err = usb_set_interface(data->udev, 1, altsetting);
+       if (err < 0) {
+               BT_ERR("%s setting interface failed (%d)", hdev->name, -err);
+               return err;
+       }
+
+       data->isoc_altsetting = altsetting;
+
+       data->isoc_tx_ep = NULL;
+       data->isoc_rx_ep = NULL;
+
+       for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
+               ep_desc = &intf->cur_altsetting->endpoint[i].desc;
+
+               if (!data->isoc_tx_ep && usb_endpoint_is_isoc_out(ep_desc)) {
+                       data->isoc_tx_ep = ep_desc;
+                       continue;
+               }
+
+               if (!data->isoc_rx_ep && usb_endpoint_is_isoc_in(ep_desc)) {
+                       data->isoc_rx_ep = ep_desc;
+                       continue;
+               }
+       }
+
+       if (!data->isoc_tx_ep || !data->isoc_rx_ep) {
+               BT_ERR("%s invalid SCO descriptors", hdev->name);
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
 static void btusb_work(struct work_struct *work)
 {
        struct btusb_data *data = container_of(work, struct btusb_data, work);
        struct hci_dev *hdev = data->hdev;
 
-       if (hdev->conn_hash.acl_num == 0) {
+       if (hdev->conn_hash.acl_num > 0) {
+               if (!test_and_set_bit(BTUSB_BULK_RUNNING, &data->flags)) {
+                       if (btusb_submit_bulk_urb(hdev) < 0)
+                               clear_bit(BTUSB_BULK_RUNNING, &data->flags);
+                       else
+                               btusb_submit_bulk_urb(hdev);
+               }
+       } else {
                clear_bit(BTUSB_BULK_RUNNING, &data->flags);
                usb_kill_anchored_urbs(&data->bulk_anchor);
-               return;
        }
 
-       if (!test_and_set_bit(BTUSB_BULK_RUNNING, &data->flags)) {
-               if (btusb_submit_bulk_urb(hdev) < 0)
-                       clear_bit(BTUSB_BULK_RUNNING, &data->flags);
-               else
-                       btusb_submit_bulk_urb(hdev);
+       if (hdev->conn_hash.sco_num > 0) {
+               if (data->isoc_altsetting != 2) {
+                       clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
+                       usb_kill_anchored_urbs(&data->isoc_anchor);
+
+                       if (__set_isoc_interface(hdev, 2) < 0)
+                               return;
+               }
+
+               if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) {
+                       if (btusb_submit_isoc_urb(hdev) < 0)
+                               clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
+                       else
+                               btusb_submit_isoc_urb(hdev);
+               }
+       } else {
+               clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
+               usb_kill_anchored_urbs(&data->isoc_anchor);
+
+               __set_isoc_interface(hdev, 0);
        }
 }
 
@@ -597,6 +829,7 @@ static int btusb_probe(struct usb_interface *intf,
        init_usb_anchor(&data->tx_anchor);
        init_usb_anchor(&data->intr_anchor);
        init_usb_anchor(&data->bulk_anchor);
+       init_usb_anchor(&data->isoc_anchor);
 
        hdev = hci_alloc_dev();
        if (!hdev) {
@@ -620,6 +853,9 @@ static int btusb_probe(struct usb_interface *intf,
 
        hdev->owner = THIS_MODULE;
 
+       /* interface numbers are hardcoded in the spec */
+       data->isoc = usb_ifnum_to_if(data->udev, 1);
+
        if (reset || id->driver_info & BTUSB_RESET)
                set_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks);
 
@@ -628,11 +864,16 @@ static int btusb_probe(struct usb_interface *intf,
                        set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks);
        }
 
+       if (id->driver_info & BTUSB_BROKEN_ISOC)
+               data->isoc = NULL;
+
        if (id->driver_info & BTUSB_SNIFFER) {
-               struct usb_device *udev = interface_to_usbdev(intf);
+               struct usb_device *udev = data->udev;
 
                if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997)
                        set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
+
+               data->isoc = NULL;
        }
 
        if (id->driver_info & BTUSB_BCM92035) {
@@ -646,6 +887,16 @@ static int btusb_probe(struct usb_interface *intf,
                }
        }
 
+       if (data->isoc) {
+               err = usb_driver_claim_interface(&btusb_driver,
+                                                       data->isoc, NULL);
+               if (err < 0) {
+                       hci_free_dev(hdev);
+                       kfree(data);
+                       return err;
+               }
+       }
+
        err = hci_register_dev(hdev);
        if (err < 0) {
                hci_free_dev(hdev);
@@ -670,6 +921,9 @@ static void btusb_disconnect(struct usb_interface *intf)
 
        hdev = data->hdev;
 
+       if (data->isoc)
+               usb_driver_release_interface(&btusb_driver, data->isoc);
+
        usb_set_intfdata(intf, NULL);
 
        hci_unregister_dev(hdev);
index 69df187d74ced8d2d262309c203e071669089f3d..8dfcf77cb71783c892437f5cb20eff417c1ee94e 100644 (file)
@@ -577,7 +577,7 @@ module_exit(hci_uart_exit);
 module_param(reset, bool, 0644);
 MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
 
-MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>");
+MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
 MODULE_DESCRIPTION("Bluetooth HCI UART driver ver " VERSION);
 MODULE_VERSION(VERSION);
 MODULE_LICENSE("GPL");
index e397572bf574cc95da87d14cb126a48b4ba9bef4..3c453924f8386c9b92050ae978967d188ec3b4da 100644 (file)
@@ -1130,7 +1130,7 @@ module_param(isoc, int, 0644);
 MODULE_PARM_DESC(isoc, "Set isochronous transfers for SCO over HCI support");
 #endif
 
-MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>");
+MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
 MODULE_DESCRIPTION("Bluetooth HCI USB driver ver " VERSION);
 MODULE_VERSION(VERSION);
 MODULE_LICENSE("GPL");
index d97700aa54a9b63edf66507e7592fdc9e6ca3937..7320a71b63685403c9972766c4eb716ba9b05791 100644 (file)
@@ -377,7 +377,7 @@ module_exit(vhci_exit);
 module_param(minor, int, 0444);
 MODULE_PARM_DESC(minor, "Miscellaneous minor device number");
 
-MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>");
+MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
 MODULE_DESCRIPTION("Bluetooth virtual HCI driver ver " VERSION);
 MODULE_VERSION(VERSION);
 MODULE_LICENSE("GPL");
index d9d1b65d206c7e13fbcc41133474fec2be27951a..74031de517e6f342e070f7c8d5e057f7e10c78aa 100644 (file)
@@ -408,7 +408,6 @@ int register_cdrom(struct cdrom_device_info *cdi)
        ENSURE(get_last_session, CDC_MULTI_SESSION);
        ENSURE(get_mcn, CDC_MCN);
        ENSURE(reset, CDC_RESET);
-       ENSURE(audio_ioctl, CDC_PLAY_AUDIO);
        ENSURE(generic_packet, CDC_GENERIC_PACKET);
        cdi->mc_flags = 0;
        cdo->n_minors = 0;
@@ -2506,8 +2505,6 @@ static int cdrom_ioctl_get_subchnl(struct cdrom_device_info *cdi,
 
        /* cdinfo(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/
 
-       if (!CDROM_CAN(CDC_PLAY_AUDIO))
-               return -ENOSYS;
        if (copy_from_user(&q, argp, sizeof(q)))
                return -EFAULT;
 
@@ -2538,8 +2535,6 @@ static int cdrom_ioctl_read_tochdr(struct cdrom_device_info *cdi,
 
        /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */
 
-       if (!CDROM_CAN(CDC_PLAY_AUDIO))
-               return -ENOSYS;
        if (copy_from_user(&header, argp, sizeof(header)))
                return -EFAULT;
 
@@ -2562,8 +2557,6 @@ static int cdrom_ioctl_read_tocentry(struct cdrom_device_info *cdi,
 
        /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */
 
-       if (!CDROM_CAN(CDC_PLAY_AUDIO))
-               return -ENOSYS;
        if (copy_from_user(&entry, argp, sizeof(entry)))
                return -EFAULT;
 
index 1e0455bd6df96bfa7669784e71f2e7fcaa7e091b..1231d95aa695b2e070964fa0014fea76af756838 100644 (file)
@@ -471,6 +471,12 @@ cleanup_sense_final:
        return err;
 }
 
+static int gdrom_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
+                            void *arg)
+{
+       return -EINVAL;
+}
+
 static struct cdrom_device_ops gdrom_ops = {
        .open                   = gdrom_open,
        .release                = gdrom_release,
@@ -478,6 +484,7 @@ static struct cdrom_device_ops gdrom_ops = {
        .media_changed          = gdrom_mediachanged,
        .get_last_session       = gdrom_get_last_session,
        .reset                  = gdrom_hardreset,
+       .audio_ioctl            = gdrom_audio_ioctl,
        .capability             = CDC_MULTI_SESSION | CDC_MEDIA_CHANGED |
                                  CDC_RESET | CDC_DRIVE_STATUS | CDC_CD_R,
        .n_minors               = 1,
index 9d0dfe6e0d63ac7829473ec32afbd58fbc478d72..031e0e1a1a3bb4f89f94762b8d6c84e395ee0c06 100644 (file)
@@ -550,12 +550,19 @@ return_complete:
        }
 }
 
+static int viocd_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
+                            void *arg)
+{
+       return -EINVAL;
+}
+
 static struct cdrom_device_ops viocd_dops = {
        .open = viocd_open,
        .release = viocd_release,
        .media_changed = viocd_media_changed,
        .lock_door = viocd_lock_door,
        .generic_packet = viocd_packet,
+       .audio_ioctl = viocd_audio_ioctl,
        .capability = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED | CDC_SELECT_DISC | CDC_MULTI_SESSION | CDC_MCN | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET | CDC_DRIVE_STATUS | CDC_GENERIC_PACKET | CDC_CD_R | CDC_CD_RW | CDC_DVD | CDC_DVD_R | CDC_DVD_RAM | CDC_RAM
 };
 
index f52931e1c16eb08d0d353a92836a6fdfe0060268..8e8afb6141f99edc8f3a38bbcad1e1b9e802961f 100644 (file)
@@ -2695,15 +2695,13 @@ static __devinit void default_find_bmc(void)
        for (i = 0; ; i++) {
                if (!ipmi_defaults[i].port)
                        break;
-
-               info = kzalloc(sizeof(*info), GFP_KERNEL);
-               if (!info)
-                       return;
-
 #ifdef CONFIG_PPC_MERGE
                if (check_legacy_ioport(ipmi_defaults[i].port))
                        continue;
 #endif
+               info = kzalloc(sizeof(*info), GFP_KERNEL);
+               if (!info)
+                       return;
 
                info->addr_source = NULL;
 
index b1414507997c663db2c56afbeaaa338846ede37c..3a23e7694d55f2c61374139117c23dc20c52052b 100644 (file)
@@ -29,7 +29,6 @@
 #include <linux/tty_driver.h>
 #include <linux/tty_flip.h>
 #include <linux/uaccess.h>
-#include <linux/version.h>
 
 #include "tty.h"
 #include "network.h"
index 509c89ac5bd3292d5ac2a3f9da77902cc2a28280..08911ed6649470d24e840d781e7bc2366bcd2dd6 100644 (file)
@@ -47,7 +47,6 @@
 
 
 #include <linux/module.h>
-#include <linux/version.h>
 #include <linux/errno.h>
 #include <linux/signal.h>
 #include <linux/sched.h>
index 0e6866fe0f96d5fb19b0098a85d4a5ba52351d33..a27160ba21d7d8cb8eb9636da015075b1bc5b587 100644 (file)
@@ -2496,45 +2496,25 @@ static int tiocgwinsz(struct tty_struct *tty, struct winsize __user *arg)
 }
 
 /**
- *     tiocswinsz              -       implement window size set ioctl
- *     @tty; tty
- *     @arg: user buffer for result
+ *     tty_do_resize           -       resize event
+ *     @tty: tty being resized
+ *     @real_tty: real tty (if using a pty/tty pair)
+ *     @rows: rows (character)
+ *     @cols: cols (character)
  *
- *     Copies the user idea of the window size to the kernel. Traditionally
- *     this is just advisory information but for the Linux console it
- *     actually has driver level meaning and triggers a VC resize.
- *
- *     Locking:
- *             Called function use the console_sem is used to ensure we do
- *     not try and resize the console twice at once.
- *             The tty->termios_mutex is used to ensure we don't double
- *     resize and get confused. Lock order - tty->termios_mutex before
- *     console sem
+ *     Update the termios variables and send the neccessary signals to
+ *     peform a terminal resize correctly
  */
 
-static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty,
-       struct winsize __user *arg)
+int tty_do_resize(struct tty_struct *tty, struct tty_struct *real_tty,
+                                       struct winsize *ws)
 {
-       struct winsize tmp_ws;
        struct pid *pgrp, *rpgrp;
        unsigned long flags;
 
-       if (copy_from_user(&tmp_ws, arg, sizeof(*arg)))
-               return -EFAULT;
-
        mutex_lock(&tty->termios_mutex);
-       if (!memcmp(&tmp_ws, &tty->winsize, sizeof(*arg)))
+       if (!memcmp(ws, &tty->winsize, sizeof(*ws)))
                goto done;
-
-#ifdef CONFIG_VT
-       if (tty->driver->type == TTY_DRIVER_TYPE_CONSOLE) {
-               if (vc_lock_resize(tty->driver_data, tmp_ws.ws_col,
-                                       tmp_ws.ws_row)) {
-                       mutex_unlock(&tty->termios_mutex);
-                       return -ENXIO;
-               }
-       }
-#endif
        /* Get the PID values and reference them so we can
           avoid holding the tty ctrl lock while sending signals */
        spin_lock_irqsave(&tty->ctrl_lock, flags);
@@ -2550,13 +2530,41 @@ static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty,
        put_pid(pgrp);
        put_pid(rpgrp);
 
-       tty->winsize = tmp_ws;
-       real_tty->winsize = tmp_ws;
+       tty->winsize = *ws;
+       real_tty->winsize = *ws;
 done:
        mutex_unlock(&tty->termios_mutex);
        return 0;
 }
 
+/**
+ *     tiocswinsz              -       implement window size set ioctl
+ *     @tty; tty
+ *     @arg: user buffer for result
+ *
+ *     Copies the user idea of the window size to the kernel. Traditionally
+ *     this is just advisory information but for the Linux console it
+ *     actually has driver level meaning and triggers a VC resize.
+ *
+ *     Locking:
+ *             Driver dependant. The default do_resize method takes the
+ *     tty termios mutex and ctrl_lock. The console takes its own lock
+ *     then calls into the default method.
+ */
+
+static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty,
+       struct winsize __user *arg)
+{
+       struct winsize tmp_ws;
+       if (copy_from_user(&tmp_ws, arg, sizeof(*arg)))
+               return -EFAULT;
+
+       if (tty->ops->resize)
+               return tty->ops->resize(tty, real_tty, &tmp_ws);
+       else
+               return tty_do_resize(tty, real_tty, &tmp_ws);
+}
+
 /**
  *     tioccons        -       allow admin to move logical console
  *     @file: the file to become console
index 1bc00c9d860d70f917f2d945162aad3755b31749..60359c360912c7d4dddee8e76a6a4ffb2c576e7e 100644 (file)
@@ -803,7 +803,25 @@ static inline int resize_screen(struct vc_data *vc, int width, int height,
  */
 #define VC_RESIZE_MAXCOL (32767)
 #define VC_RESIZE_MAXROW (32767)
-int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines)
+
+/**
+ *     vc_do_resize    -       resizing method for the tty
+ *     @tty: tty being resized
+ *     @real_tty: real tty (different to tty if a pty/tty pair)
+ *     @vc: virtual console private data
+ *     @cols: columns
+ *     @lines: lines
+ *
+ *     Resize a virtual console, clipping according to the actual constraints.
+ *     If the caller passes a tty structure then update the termios winsize
+ *     information and perform any neccessary signal handling.
+ *
+ *     Caller must hold the console semaphore. Takes the termios mutex and
+ *     ctrl_lock of the tty IFF a tty is passed.
+ */
+
+static int vc_do_resize(struct tty_struct *tty, struct tty_struct *real_tty,
+               struct vc_data *vc, unsigned int cols, unsigned int lines)
 {
        unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0;
        unsigned int old_cols, old_rows, old_row_size, old_screen_size;
@@ -907,24 +925,15 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines)
        gotoxy(vc, vc->vc_x, vc->vc_y);
        save_cur(vc);
 
-       if (vc->vc_tty) {
-               struct winsize ws, *cws = &vc->vc_tty->winsize;
-               struct pid *pgrp = NULL;
-
+       if (tty) {
+               /* Rewrite the requested winsize data with the actual
+                  resulting sizes */
+               struct winsize ws;
                memset(&ws, 0, sizeof(ws));
                ws.ws_row = vc->vc_rows;
                ws.ws_col = vc->vc_cols;
                ws.ws_ypixel = vc->vc_scan_lines;
-
-               spin_lock_irq(&vc->vc_tty->ctrl_lock);
-               if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col))
-                       pgrp = get_pid(vc->vc_tty->pgrp);
-               spin_unlock_irq(&vc->vc_tty->ctrl_lock);
-               if (pgrp) {
-                       kill_pgrp(vc->vc_tty->pgrp, SIGWINCH, 1);
-                       put_pid(pgrp);
-               }
-               *cws = ws;
+               tty_do_resize(tty, real_tty, &ws);
        }
 
        if (CON_IS_VISIBLE(vc))
@@ -932,14 +941,47 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines)
        return err;
 }
 
-int vc_lock_resize(struct vc_data *vc, unsigned int cols, unsigned int lines)
+/**
+ *     vc_resize               -       resize a VT
+ *     @vc: virtual console
+ *     @cols: columns
+ *     @rows: rows
+ *
+ *     Resize a virtual console as seen from the console end of things. We
+ *     use the common vc_do_resize methods to update the structures. The
+ *     caller must hold the console sem to protect console internals and
+ *     vc->vc_tty
+ */
+
+int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int rows)
+{
+       return vc_do_resize(vc->vc_tty, vc->vc_tty, vc, cols, rows);
+}
+
+/**
+ *     vt_resize               -       resize a VT
+ *     @tty: tty to resize
+ *     @real_tty: tty if a pty/tty pair
+ *     @ws: winsize attributes
+ *
+ *     Resize a virtual terminal. This is called by the tty layer as we
+ *     register our own handler for resizing. The mutual helper does all
+ *     the actual work.
+ *
+ *     Takes the console sem and the called methods then take the tty
+ *     termios_mutex and the tty ctrl_lock in that order.
+ */
+
+int vt_resize(struct tty_struct *tty, struct tty_struct *real_tty,
+       struct winsize *ws)
 {
-       int rc;
+       struct vc_data *vc = tty->driver_data;
+       int ret;
 
        acquire_console_sem();
-       rc = vc_resize(vc, cols, lines);
+       ret = vc_do_resize(tty, real_tty, vc, ws->ws_col, ws->ws_row);
        release_console_sem();
-       return rc;
+       return ret;
 }
 
 void vc_deallocate(unsigned int currcons)
@@ -2907,6 +2949,7 @@ static const struct tty_operations con_ops = {
        .start = con_start,
        .throttle = con_throttle,
        .unthrottle = con_unthrottle,
+       .resize = vt_resize,
 };
 
 int __init vty_init(void)
@@ -4061,7 +4104,6 @@ EXPORT_SYMBOL(default_blu);
 EXPORT_SYMBOL(update_region);
 EXPORT_SYMBOL(redraw_screen);
 EXPORT_SYMBOL(vc_resize);
-EXPORT_SYMBOL(vc_lock_resize);
 EXPORT_SYMBOL(fg_console);
 EXPORT_SYMBOL(console_blank_hook);
 EXPORT_SYMBOL(console_blanked);
index 3211afd9d57e4080eb610c7bde54098a0c7bf117..c904e9ad4a71a396d5fa3c06747065b99335d392 100644 (file)
@@ -947,14 +947,16 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
                    get_user(cc, &vtsizes->v_cols))
                        ret = -EFAULT;
                else {
+                       acquire_console_sem();
                        for (i = 0; i < MAX_NR_CONSOLES; i++) {
                                vc = vc_cons[i].d;
 
                                if (vc) {
                                        vc->vc_resize_user = 1;
-                                       vc_lock_resize(vc_cons[i].d, cc, ll);
+                                       vc_resize(vc_cons[i].d, cc, ll);
                                }
                        }
+                       release_console_sem();
                }
                break;
        }
index 8bfee5fb7223cd21e5dff7c0f4f62371f66fe963..278c9857bcf548c14de1c8b7fed133530c6e82f4 100644 (file)
@@ -74,7 +74,6 @@
  * currently programmed in the FPGA.
  */
 
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
index ba7b9a6b17a13678896bd1390b1d4823504b641a..a4bec3f919aa7cb98ddaf8f6f7121dc4d2f4781a 100644 (file)
@@ -67,10 +67,17 @@ static int ladder_select_state(struct cpuidle_device *dev)
        struct ladder_device *ldev = &__get_cpu_var(ladder_devices);
        struct ladder_device_state *last_state;
        int last_residency, last_idx = ldev->last_state_idx;
+       int latency_req = pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY);
 
        if (unlikely(!ldev))
                return 0;
 
+       /* Special case when user has set very strict latency requirement */
+       if (unlikely(latency_req == 0)) {
+               ladder_do_selection(ldev, last_idx, 0);
+               return 0;
+       }
+
        last_state = &ldev->states[last_idx];
 
        if (dev->states[last_idx].flags & CPUIDLE_FLAG_TIME_VALID)
@@ -81,8 +88,7 @@ static int ladder_select_state(struct cpuidle_device *dev)
        /* consider promotion */
        if (last_idx < dev->state_count - 1 &&
            last_residency > last_state->threshold.promotion_time &&
-           dev->states[last_idx + 1].exit_latency <=
-                       pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY)) {
+           dev->states[last_idx + 1].exit_latency <= latency_req) {
                last_state->stats.promotion_count++;
                last_state->stats.demotion_count = 0;
                if (last_state->stats.promotion_count >= last_state->threshold.promotion_count) {
@@ -92,7 +98,19 @@ static int ladder_select_state(struct cpuidle_device *dev)
        }
 
        /* consider demotion */
-       if (last_idx > 0 &&
+       if (last_idx > CPUIDLE_DRIVER_STATE_START &&
+           dev->states[last_idx].exit_latency > latency_req) {
+               int i;
+
+               for (i = last_idx - 1; i > CPUIDLE_DRIVER_STATE_START; i--) {
+                       if (dev->states[i].exit_latency <= latency_req)
+                               break;
+               }
+               ladder_do_selection(ldev, last_idx, i);
+               return i;
+       }
+
+       if (last_idx > CPUIDLE_DRIVER_STATE_START &&
            last_residency < last_state->threshold.demotion_time) {
                last_state->stats.demotion_count++;
                last_state->stats.promotion_count = 0;
@@ -117,7 +135,7 @@ static int ladder_enable_device(struct cpuidle_device *dev)
        struct ladder_device_state *lstate;
        struct cpuidle_state *state;
 
-       ldev->last_state_idx = 0;
+       ldev->last_state_idx = CPUIDLE_DRIVER_STATE_START;
 
        for (i = 0; i < dev->state_count; i++) {
                state = &dev->states[i];
index 78d77c5dc35c3ec00b261fa39a7e3aa89271a957..8d7cf3f31450728ab60a3f349f2e9f88b00cfb95 100644 (file)
@@ -34,21 +34,28 @@ static DEFINE_PER_CPU(struct menu_device, menu_devices);
 static int menu_select(struct cpuidle_device *dev)
 {
        struct menu_device *data = &__get_cpu_var(menu_devices);
+       int latency_req = pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY);
        int i;
 
+       /* Special case when user has set very strict latency requirement */
+       if (unlikely(latency_req == 0)) {
+               data->last_state_idx = 0;
+               return 0;
+       }
+
        /* determine the expected residency time */
        data->expected_us =
                (u32) ktime_to_ns(tick_nohz_get_sleep_length()) / 1000;
 
        /* find the deepest idle state that satisfies our constraints */
-       for (i = 1; i < dev->state_count; i++) {
+       for (i = CPUIDLE_DRIVER_STATE_START + 1; i < dev->state_count; i++) {
                struct cpuidle_state *s = &dev->states[i];
 
                if (s->target_residency > data->expected_us)
                        break;
                if (s->target_residency > data->predicted_us)
                        break;
-               if (s->exit_latency > pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY))
+               if (s->exit_latency > latency_req)
                        break;
        }
 
@@ -67,9 +74,9 @@ static void menu_reflect(struct cpuidle_device *dev)
 {
        struct menu_device *data = &__get_cpu_var(menu_devices);
        int last_idx = data->last_state_idx;
-       unsigned int measured_us =
-               cpuidle_get_last_residency(dev) + data->elapsed_us;
+       unsigned int last_idle_us = cpuidle_get_last_residency(dev);
        struct cpuidle_state *target = &dev->states[last_idx];
+       unsigned int measured_us;
 
        /*
         * Ugh, this idle state doesn't support residency measurements, so we
@@ -77,20 +84,27 @@ static void menu_reflect(struct cpuidle_device *dev)
         * for one full standard timer tick.  However, be aware that this
         * could potentially result in a suboptimal state transition.
         */
-       if (!(target->flags & CPUIDLE_FLAG_TIME_VALID))
-               measured_us = USEC_PER_SEC / HZ;
+       if (unlikely(!(target->flags & CPUIDLE_FLAG_TIME_VALID)))
+               last_idle_us = USEC_PER_SEC / HZ;
+
+       /*
+        * measured_us and elapsed_us are the cumulative idle time, since the
+        * last time we were woken out of idle by an interrupt.
+        */
+       if (data->elapsed_us <= data->elapsed_us + last_idle_us)
+               measured_us = data->elapsed_us + last_idle_us;
+       else
+               measured_us = -1;
+
+       /* Predict time until next break event */
+       data->predicted_us = max(measured_us, data->last_measured_us);
 
-       /* Predict time remaining until next break event */
-       if (measured_us + BREAK_FUZZ < data->expected_us - target->exit_latency) {
-               data->predicted_us = max(measured_us, data->last_measured_us);
+       if (last_idle_us + BREAK_FUZZ <
+           data->expected_us - target->exit_latency) {
                data->last_measured_us = measured_us;
                data->elapsed_us = 0;
        } else {
-               if (data->elapsed_us < data->elapsed_us + measured_us)
-                       data->elapsed_us = measured_us;
-               else
-                       data->elapsed_us = -1;
-               data->predicted_us = max(measured_us, data->last_measured_us);
+               data->elapsed_us = measured_us;
        }
 }
 
index a4e4494663bf9ce4d6f06b0002add3b7cc28c794..0328da020a1084e6c7f0fcfd0e729a00e079702d 100644 (file)
@@ -25,7 +25,7 @@
 #include <linux/interrupt.h>
 #include <linux/platform_device.h>
 #include <linux/memory.h>
-#include <asm/plat-orion/mv_xor.h>
+#include <plat/mv_xor.h>
 #include "mv_xor.h"
 
 static void mv_xor_issue_pending(struct dma_chan *chan);
index fa6d6abefd4d14d9bdb8c372118a1ddbcea7b2fb..4509024382081cc17325ab72da5d7587675b1ef8 100644 (file)
@@ -12,8 +12,8 @@ config FIREWIRE
          This is the "Juju" FireWire stack, a new alternative implementation
          designed for robustness and simplicity.  You can build either this
          stack, or the old stack (the ieee1394 driver, ohci1394 etc.) or both.
-         Please read http://wiki.linux1394.org/JujuMigration before you
-         enable the new stack.
+         Please read http://ieee1394.wiki.kernel.org/index.php/Juju_Migration
+         before you enable the new stack.
 
          To compile this driver as a module, say M here: the module will be
          called firewire-core.
index 61e78a4369b9e811952bf0e36c450b46129b0923..b15f882496394cbf7af43d7b07707e6b4750c54e 100644 (file)
@@ -654,12 +654,12 @@ static const struct hid_blacklist {
        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN },
        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN },
-       { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI, HID_QUIRK_APPLE_HAS_FN },
-       { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
-       { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS, HID_QUIRK_APPLE_HAS_FN },
-       { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI, HID_QUIRK_APPLE_HAS_FN },
-       { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
-       { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS, HID_QUIRK_APPLE_HAS_FN },
+       { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+       { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD | HID_QUIRK_IGNORE_MOUSE},
+       { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE},
+       { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE},
+       { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD | HID_QUIRK_IGNORE_MOUSE },
+       { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS, HID_QUIRK_APPLE_HAS_FN  | HID_QUIRK_IGNORE_MOUSE },
        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 
index bf4ebfb86fa5bde7dc86e04e1da6749c1400cf18..d402e8d813ce2628d0fa7f079267ad1cdfbada14 100644 (file)
@@ -77,6 +77,22 @@ config SENSORS_AD7418
          This driver can also be built as a module. If so, the module
          will be called ad7418.
 
+config SENSORS_ADCXX
+       tristate "National Semiconductor ADCxxxSxxx"
+       depends on SPI_MASTER && EXPERIMENTAL
+       help
+         If you say yes here you get support for the National Semiconductor
+         ADC<bb><c>S<sss> chip family, where
+         * bb  is the resolution in number of bits (8, 10, 12)
+         * c   is the number of channels (1, 2, 4, 8)
+         * sss is the maximum conversion speed (021 for 200 kSPS, 051 for 500
+           kSPS and 101 for 1 MSPS)
+
+         Examples : ADC081S101, ADC124S501, ...
+
+         This driver can also be built as a module.  If so, the module
+         will be called adcxx.
+
 config SENSORS_ADM1021
        tristate "Analog Devices ADM1021 and compatibles"
        depends on I2C
index 7943e5cefb06ae1c0f6d99b45cb46bc697398270..950134ab842666a1c4ccb7d2b224c2b62d8af0dd 100644 (file)
@@ -17,6 +17,7 @@ obj-$(CONFIG_SENSORS_ABITUGURU)       += abituguru.o
 obj-$(CONFIG_SENSORS_ABITUGURU3)+= abituguru3.o
 obj-$(CONFIG_SENSORS_AD7414)   += ad7414.o
 obj-$(CONFIG_SENSORS_AD7418)   += ad7418.o
+obj-$(CONFIG_SENSORS_ADCXX)    += adcxx.o
 obj-$(CONFIG_SENSORS_ADM1021)  += adm1021.o
 obj-$(CONFIG_SENSORS_ADM1025)  += adm1025.o
 obj-$(CONFIG_SENSORS_ADM1026)  += adm1026.o
index f00f497b9ca9b38ed615a17955d42da607601214..d568c65c137089a1f6402237404c80bb1d402dc1 100644 (file)
@@ -1,5 +1,8 @@
 /*
-    abituguru3.c Copyright (c) 2006 Hans de Goede <j.w.r.degoede@hhs.nl>
+    abituguru3.c
+
+    Copyright (c) 2006-2008 Hans de Goede <j.w.r.degoede@hhs.nl>
+    Copyright (c) 2008 Alistair John Strachan <alistair@devzero.co.uk>
 
     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
@@ -116,7 +119,7 @@ struct abituguru3_sensor_info {
 
 struct abituguru3_motherboard_info {
        u16 id;
-       const char *name;
+       const char *dmi_name;
        /* + 1 -> end of sensors indicated by a sensor with name == NULL */
        struct abituguru3_sensor_info sensors[ABIT_UGURU3_MAX_NO_SENSORS + 1];
 };
@@ -161,7 +164,7 @@ struct abituguru3_data {
 
 /* Constants */
 static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
-       { 0x000C, "unknown", {
+       { 0x000C, NULL /* Unknown, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR",                 1, 0, 10, 1, 0 },
                { "DDR VTT",             2, 0, 10, 1, 0 },
@@ -183,7 +186,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "AUX1 Fan",           35, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x000D, "Abit AW8", {
+       { 0x000D, NULL /* Abit AW8, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR",                 1, 0, 10, 1, 0 },
                { "DDR VTT",             2, 0, 10, 1, 0 },
@@ -212,7 +215,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "AUX5 Fan",           39, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x000E, "AL-8", {
+       { 0x000E, NULL /* AL-8, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR",                 1, 0, 10, 1, 0 },
                { "DDR VTT",             2, 0, 10, 1, 0 },
@@ -233,7 +236,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "SYS Fan",            34, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x000F, "unknown", {
+       { 0x000F, NULL /* Unknown, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR",                 1, 0, 10, 1, 0 },
                { "DDR VTT",             2, 0, 10, 1, 0 },
@@ -254,7 +257,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "SYS Fan",            34, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x0010, "Abit NI8 SLI GR", {
+       { 0x0010, NULL /* Abit NI8 SLI GR, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR",                 1, 0, 10, 1, 0 },
                { "DDR VTT",             2, 0, 10, 1, 0 },
@@ -276,7 +279,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "OTES1 Fan",          36, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x0011, "Abit AT8 32X", {
+       { 0x0011, NULL /* Abit AT8 32X, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR",                 1, 0, 20, 1, 0 },
                { "DDR VTT",             2, 0, 10, 1, 0 },
@@ -302,7 +305,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "AUX2 Fan",           36, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x0012, "Abit AN8 32X", {
+       { 0x0012, NULL /* Abit AN8 32X, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR",                 1, 0, 20, 1, 0 },
                { "DDR VTT",             2, 0, 10, 1, 0 },
@@ -324,7 +327,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "AUX1 Fan",           36, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x0013, "Abit AW8D", {
+       { 0x0013, NULL /* Abit AW8D, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR",                 1, 0, 10, 1, 0 },
                { "DDR VTT",             2, 0, 10, 1, 0 },
@@ -353,7 +356,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "AUX5 Fan",           39, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x0014, "Abit AB9 Pro", {
+       { 0x0014, NULL /* Abit AB9 Pro, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR",                 1, 0, 10, 1, 0 },
                { "DDR VTT",             2, 0, 10, 1, 0 },
@@ -374,7 +377,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "SYS Fan",            34, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x0015, "unknown", {
+       { 0x0015, NULL /* Unknown, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR",                 1, 0, 20, 1, 0 },
                { "DDR VTT",             2, 0, 10, 1, 0 },
@@ -398,7 +401,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "AUX3 Fan",           36, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x0016, "AW9D-MAX", {
+       { 0x0016, NULL /* AW9D-MAX, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR2",                1, 0, 20, 1, 0 },
                { "DDR2 VTT",            2, 0, 10, 1, 0 },
@@ -426,7 +429,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "OTES1 Fan",          38, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x0017, "unknown", {
+       { 0x0017, NULL /* Unknown, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR2",                1, 0, 20, 1, 0 },
                { "DDR2 VTT",            2, 0, 10, 1, 0 },
@@ -451,7 +454,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "AUX3 FAN",           37, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x0018, "unknown", {
+       { 0x0018, NULL /* Unknown, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR2",                1, 0, 20, 1, 0 },
                { "DDR2 VTT",            2, 0, 10, 1, 0 },
@@ -478,7 +481,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "AUX3 Fan",           36, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x0019, "unknown", {
+       { 0x0019, NULL /* Unknown, need DMI string */, {
                { "CPU Core",            7, 0, 10, 1, 0 },
                { "DDR2",               13, 0, 20, 1, 0 },
                { "DDR2 VTT",           14, 0, 10, 1, 0 },
@@ -505,7 +508,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "AUX3 FAN",           36, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x001A, "Abit IP35 Pro", {
+       { 0x001A, "IP35 Pro(Intel P35-ICH9R)", {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR2",                1, 0, 20, 1, 0 },
                { "DDR2 VTT",            2, 0, 10, 1, 0 },
@@ -533,7 +536,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "AUX4 Fan",           37, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x001B, "unknown", {
+       { 0x001B, NULL /* Unknown, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR3",                1, 0, 20, 1, 0 },
                { "DDR3 VTT",            2, 0, 10, 1, 0 },
@@ -560,7 +563,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = {
                { "AUX3 Fan",           36, 2, 60, 1, 0 },
                { NULL, 0, 0, 0, 0, 0 } }
        },
-       { 0x001C, "unknown", {
+       { 0x001C, NULL /* Unknown, need DMI string */, {
                { "CPU Core",            0, 0, 10, 1, 0 },
                { "DDR2",                1, 0, 20, 1, 0 },
                { "DDR2 VTT",            2, 0, 10, 1, 0 },
@@ -935,9 +938,18 @@ static int __devinit abituguru3_probe(struct platform_device *pdev)
                goto abituguru3_probe_error;
        }
        data->sensors = abituguru3_motherboards[i].sensors;
+
        printk(KERN_INFO ABIT_UGURU3_NAME ": found Abit uGuru3, motherboard "
-               "ID: %04X (%s)\n", (unsigned int)id,
-               abituguru3_motherboards[i].name);
+               "ID: %04X\n", (unsigned int)id);
+
+#ifdef CONFIG_DMI
+       if (!abituguru3_motherboards[i].dmi_name) {
+               printk(KERN_WARNING ABIT_UGURU3_NAME ": this motherboard was "
+                       "not detected using DMI. Please send the output of "
+                       "\"dmidecode\" to the abituguru3 maintainer"
+                       "(see MAINTAINERS)\n");
+       }
+#endif
 
        /* Fill the sysfs attr array */
        sysfs_attr_i = 0;
@@ -1109,6 +1121,46 @@ static struct platform_driver abituguru3_driver = {
        .resume = abituguru3_resume
 };
 
+#ifdef CONFIG_DMI
+
+static int __init abituguru3_dmi_detect(void)
+{
+       const char *board_vendor, *board_name;
+       int i, err = (force) ? 1 : -ENODEV;
+
+       board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
+       if (!board_vendor || strcmp(board_vendor, "http://www.abit.com.tw/"))
+               return err;
+
+       board_name = dmi_get_system_info(DMI_BOARD_NAME);
+       if (!board_name)
+               return err;
+
+       for (i = 0; abituguru3_motherboards[i].id; i++) {
+               const char *dmi_name = abituguru3_motherboards[i].dmi_name;
+               if (dmi_name && !strcmp(dmi_name, board_name))
+                       break;
+       }
+
+       if (!abituguru3_motherboards[i].id)
+               return 1;
+
+       return 0;
+}
+
+#else /* !CONFIG_DMI */
+
+static inline int abituguru3_dmi_detect(void)
+{
+       return -ENODEV;
+}
+
+#endif /* CONFIG_DMI */
+
+/* FIXME: Manual detection should die eventually; we need to collect stable
+ *        DMI model names first before we can rely entirely on CONFIG_DMI.
+ */
+
 static int __init abituguru3_detect(void)
 {
        /* See if there is an uguru3 there. An idle uGuru3 will hold 0x00 or
@@ -1119,7 +1171,7 @@ static int __init abituguru3_detect(void)
        if (((data_val == 0x00) || (data_val == 0x08)) &&
                        ((cmd_val == 0xAC) || (cmd_val == 0x05) ||
                         (cmd_val == 0x55)))
-               return ABIT_UGURU3_BASE;
+               return 0;
 
        ABIT_UGURU3_DEBUG("no Abit uGuru3 found, data = 0x%02X, cmd = "
                "0x%02X\n", (unsigned int)data_val, (unsigned int)cmd_val);
@@ -1127,7 +1179,7 @@ static int __init abituguru3_detect(void)
        if (force) {
                printk(KERN_INFO ABIT_UGURU3_NAME ": Assuming Abit uGuru3 is "
                                "present because of \"force\" parameter\n");
-               return ABIT_UGURU3_BASE;
+               return 0;
        }
 
        /* No uGuru3 found */
@@ -1138,27 +1190,29 @@ static struct platform_device *abituguru3_pdev;
 
 static int __init abituguru3_init(void)
 {
-       int address, err;
        struct resource res = { .flags = IORESOURCE_IO };
-
-#ifdef CONFIG_DMI
-       const char *board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
-
-       /* safety check, refuse to load on non Abit motherboards */
-       if (!force && (!board_vendor ||
-                       strcmp(board_vendor, "http://www.abit.com.tw/")))
-               return -ENODEV;
-#endif
-
-       address = abituguru3_detect();
-       if (address < 0)
-               return address;
+       int err;
+
+       /* Attempt DMI detection first */
+       err = abituguru3_dmi_detect();
+       if (err < 0)
+               return err;
+
+       /* Fall back to manual detection if there was no exact
+        * board name match, or force was specified.
+        */
+       if (err > 0) {
+               err = abituguru3_detect();
+               if (err)
+                       return err;
+       }
 
        err = platform_driver_register(&abituguru3_driver);
        if (err)
                goto exit;
 
-       abituguru3_pdev = platform_device_alloc(ABIT_UGURU3_NAME, address);
+       abituguru3_pdev = platform_device_alloc(ABIT_UGURU3_NAME,
+                                               ABIT_UGURU3_BASE);
        if (!abituguru3_pdev) {
                printk(KERN_ERR ABIT_UGURU3_NAME
                        ": Device allocation failed\n");
@@ -1166,8 +1220,8 @@ static int __init abituguru3_init(void)
                goto exit_driver_unregister;
        }
 
-       res.start = address;
-       res.end = address + ABIT_UGURU3_REGION_LENGTH - 1;
+       res.start = ABIT_UGURU3_BASE;
+       res.end = ABIT_UGURU3_BASE + ABIT_UGURU3_REGION_LENGTH - 1;
        res.name = ABIT_UGURU3_NAME;
 
        err = platform_device_add_resources(abituguru3_pdev, &res, 1);
diff --git a/drivers/hwmon/adcxx.c b/drivers/hwmon/adcxx.c
new file mode 100644 (file)
index 0000000..242294d
--- /dev/null
@@ -0,0 +1,329 @@
+/*
+ * adcxx.c
+ *
+ * The adcxx4s is an AD converter family from National Semiconductor (NS).
+ *
+ * Copyright (c) 2008 Marc Pignat <marc.pignat@hevs.ch>
+ *
+ * The adcxx4s communicates with a host processor via an SPI/Microwire Bus
+ * interface. This driver supports the whole family of devices with name
+ * ADC<bb><c>S<sss>, where
+ * * bb is the resolution in number of bits (8, 10, 12)
+ * * c is the number of channels (1, 2, 4, 8)
+ * * sss is the maximum conversion speed (021 for 200 kSPS, 051 for 500 kSPS
+ *   and 101 for 1 MSPS)
+ *
+ * Complete datasheets are available at National's website here:
+ * http://www.national.com/ds/DC/ADC<bb><c>S<sss>.pdf
+ *
+ * Handling of 8, 10 and 12 bits converters are the same, the
+ * unavailable bits are 0 :)
+ *
+ * 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/init.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/sysfs.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/mutex.h>
+#include <linux/spi/spi.h>
+
+#define DRVNAME                "adcxx"
+
+struct adcxx {
+       struct device *hwmon_dev;
+       struct mutex lock;
+       u32 channels;
+       u32 reference; /* in millivolts */
+};
+
+/* sysfs hook function */
+static ssize_t adcxx_read(struct device *dev,
+               struct device_attribute *devattr, char *buf)
+{
+       struct spi_device *spi = to_spi_device(dev);
+       struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+       struct adcxx *adc = dev_get_drvdata(&spi->dev);
+       u8 tx_buf[2] = { attr->index << 3 }; /* other bits are don't care */
+       u8 rx_buf[2];
+       int status;
+       int value;
+
+       if (mutex_lock_interruptible(&adc->lock))
+               return -ERESTARTSYS;
+
+       status = spi_write_then_read(spi, tx_buf, sizeof(tx_buf),
+                                       rx_buf, sizeof(rx_buf));
+       if (status < 0) {
+               dev_warn(dev, "spi_write_then_read failed with status %d\n",
+                               status);
+               goto out;
+       }
+
+       value = (rx_buf[0] << 8) + rx_buf[1];
+       dev_dbg(dev, "raw value = 0x%x\n", value);
+
+       value = value * adc->reference >> 12;
+       status = sprintf(buf, "%d\n", value);
+out:
+       mutex_unlock(&adc->lock);
+       return status;
+}
+
+static ssize_t adcxx_show_min(struct device *dev,
+               struct device_attribute *devattr, char *buf)
+{
+       /* The minimum reference is 0 for this chip family */
+       return sprintf(buf, "0\n");
+}
+
+static ssize_t adcxx_show_max(struct device *dev,
+               struct device_attribute *devattr, char *buf)
+{
+       struct spi_device *spi = to_spi_device(dev);
+       struct adcxx *adc = dev_get_drvdata(&spi->dev);
+       u32 reference;
+
+       if (mutex_lock_interruptible(&adc->lock))
+               return -ERESTARTSYS;
+
+       reference = adc->reference;
+
+       mutex_unlock(&adc->lock);
+
+       return sprintf(buf, "%d\n", reference);
+}
+
+static ssize_t adcxx_set_max(struct device *dev,
+       struct device_attribute *devattr, const char *buf, size_t count)
+{
+       struct spi_device *spi = to_spi_device(dev);
+       struct adcxx *adc = dev_get_drvdata(&spi->dev);
+       unsigned long value;
+
+       if (strict_strtoul(buf, 10, &value))
+               return -EINVAL;
+
+       if (mutex_lock_interruptible(&adc->lock))
+               return -ERESTARTSYS;
+
+       adc->reference = value;
+
+       mutex_unlock(&adc->lock);
+
+       return count;
+}
+
+static ssize_t adcxx_show_name(struct device *dev, struct device_attribute
+                             *devattr, char *buf)
+{
+       struct spi_device *spi = to_spi_device(dev);
+       struct adcxx *adc = dev_get_drvdata(&spi->dev);
+
+       return sprintf(buf, "adcxx%ds\n", adc->channels);
+}
+
+static struct sensor_device_attribute ad_input[] = {
+       SENSOR_ATTR(name, S_IRUGO, adcxx_show_name, NULL, 0),
+       SENSOR_ATTR(in_min, S_IRUGO, adcxx_show_min, NULL, 0),
+       SENSOR_ATTR(in_max, S_IWUSR | S_IRUGO, adcxx_show_max,
+                                       adcxx_set_max, 0),
+       SENSOR_ATTR(in0_input, S_IRUGO, adcxx_read, NULL, 0),
+       SENSOR_ATTR(in1_input, S_IRUGO, adcxx_read, NULL, 1),
+       SENSOR_ATTR(in2_input, S_IRUGO, adcxx_read, NULL, 2),
+       SENSOR_ATTR(in3_input, S_IRUGO, adcxx_read, NULL, 3),
+       SENSOR_ATTR(in4_input, S_IRUGO, adcxx_read, NULL, 4),
+       SENSOR_ATTR(in5_input, S_IRUGO, adcxx_read, NULL, 5),
+       SENSOR_ATTR(in6_input, S_IRUGO, adcxx_read, NULL, 6),
+       SENSOR_ATTR(in7_input, S_IRUGO, adcxx_read, NULL, 7),
+};
+
+/*----------------------------------------------------------------------*/
+
+static int __devinit adcxx_probe(struct spi_device *spi, int channels)
+{
+       struct adcxx *adc;
+       int status;
+       int i;
+
+       adc = kzalloc(sizeof *adc, GFP_KERNEL);
+       if (!adc)
+               return -ENOMEM;
+
+       /* set a default value for the reference */
+       adc->reference = 3300;
+       adc->channels = channels;
+       mutex_init(&adc->lock);
+
+       mutex_lock(&adc->lock);
+
+       dev_set_drvdata(&spi->dev, adc);
+
+       for (i = 0; i < 3 + adc->channels; i++) {
+               status = device_create_file(&spi->dev, &ad_input[i].dev_attr);
+               if (status) {
+                       dev_err(&spi->dev, "device_create_file failed.\n");
+                       goto out_err;
+               }
+       }
+
+       adc->hwmon_dev = hwmon_device_register(&spi->dev);
+       if (IS_ERR(adc->hwmon_dev)) {
+               dev_err(&spi->dev, "hwmon_device_register failed.\n");
+               status = PTR_ERR(adc->hwmon_dev);
+               goto out_err;
+       }
+
+       mutex_unlock(&adc->lock);
+       return 0;
+
+out_err:
+       for (i--; i >= 0; i--)
+               device_remove_file(&spi->dev, &ad_input[i].dev_attr);
+
+       dev_set_drvdata(&spi->dev, NULL);
+       mutex_unlock(&adc->lock);
+       kfree(adc);
+       return status;
+}
+
+static int __devinit adcxx1s_probe(struct spi_device *spi)
+{
+       return adcxx_probe(spi, 1);
+}
+
+static int __devinit adcxx2s_probe(struct spi_device *spi)
+{
+       return adcxx_probe(spi, 2);
+}
+
+static int __devinit adcxx4s_probe(struct spi_device *spi)
+{
+       return adcxx_probe(spi, 4);
+}
+
+static int __devinit adcxx8s_probe(struct spi_device *spi)
+{
+       return adcxx_probe(spi, 8);
+}
+
+static int __devexit adcxx_remove(struct spi_device *spi)
+{
+       struct adcxx *adc = dev_get_drvdata(&spi->dev);
+       int i;
+
+       mutex_lock(&adc->lock);
+       hwmon_device_unregister(adc->hwmon_dev);
+       for (i = 0; i < 3 + adc->channels; i++)
+               device_remove_file(&spi->dev, &ad_input[i].dev_attr);
+
+       dev_set_drvdata(&spi->dev, NULL);
+       mutex_unlock(&adc->lock);
+       kfree(adc);
+
+       return 0;
+}
+
+static struct spi_driver adcxx1s_driver = {
+       .driver = {
+               .name   = "adcxx1s",
+               .owner  = THIS_MODULE,
+       },
+       .probe  = adcxx1s_probe,
+       .remove = __devexit_p(adcxx_remove),
+};
+
+static struct spi_driver adcxx2s_driver = {
+       .driver = {
+               .name   = "adcxx2s",
+               .owner  = THIS_MODULE,
+       },
+       .probe  = adcxx2s_probe,
+       .remove = __devexit_p(adcxx_remove),
+};
+
+static struct spi_driver adcxx4s_driver = {
+       .driver = {
+               .name   = "adcxx4s",
+               .owner  = THIS_MODULE,
+       },
+       .probe  = adcxx4s_probe,
+       .remove = __devexit_p(adcxx_remove),
+};
+
+static struct spi_driver adcxx8s_driver = {
+       .driver = {
+               .name   = "adcxx8s",
+               .owner  = THIS_MODULE,
+       },
+       .probe  = adcxx8s_probe,
+       .remove = __devexit_p(adcxx_remove),
+};
+
+static int __init init_adcxx(void)
+{
+       int status;
+       status = spi_register_driver(&adcxx1s_driver);
+       if (status)
+               goto reg_1_failed;
+
+       status = spi_register_driver(&adcxx2s_driver);
+       if (status)
+               goto reg_2_failed;
+
+       status = spi_register_driver(&adcxx4s_driver);
+       if (status)
+               goto reg_4_failed;
+
+       status = spi_register_driver(&adcxx8s_driver);
+       if (status)
+               goto reg_8_failed;
+
+       return status;
+
+reg_8_failed:
+       spi_unregister_driver(&adcxx4s_driver);
+reg_4_failed:
+       spi_unregister_driver(&adcxx2s_driver);
+reg_2_failed:
+       spi_unregister_driver(&adcxx1s_driver);
+reg_1_failed:
+       return status;
+}
+
+static void __exit exit_adcxx(void)
+{
+       spi_unregister_driver(&adcxx1s_driver);
+       spi_unregister_driver(&adcxx2s_driver);
+       spi_unregister_driver(&adcxx4s_driver);
+       spi_unregister_driver(&adcxx8s_driver);
+}
+
+module_init(init_adcxx);
+module_exit(exit_adcxx);
+
+MODULE_AUTHOR("Marc Pignat");
+MODULE_DESCRIPTION("National Semiconductor adcxx8sxxx Linux driver");
+MODULE_LICENSE("GPL");
+
+MODULE_ALIAS("adcxx1s");
+MODULE_ALIAS("adcxx2s");
+MODULE_ALIAS("adcxx4s");
+MODULE_ALIAS("adcxx8s");
index aacc0c4b809cf408bc7f41e233d215c993815c7c..b06b8e090a278e9164c8603d7fa1d311be17317e 100644 (file)
@@ -98,6 +98,12 @@ static const char* temperature_sensors_sets[][36] = {
          "TH1P", "TH2P", "TH3P", "TMAP", "TMAS", "TMBS", "TM0P", "TM0S",
          "TM1P", "TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P",
          "TM9S", "TN0H", "TS0C", NULL },
+/* Set 5: iMac */
+       { "TC0D", "TA0P", "TG0P", "TG0D", "TG0H", "TH0P", "Tm0P", "TO0P",
+         "Tp0C", NULL },
+/* Set 6: Macbook3 set */
+       { "TB0T", "TC0D", "TC0P", "TM0P", "TN0P", "TTF0", "TW0P", "Th0H",
+         "Th0S", "Th1H", NULL },
 };
 
 /* List of keys used to read/write fan speeds */
@@ -1223,6 +1229,10 @@ static __initdata struct dmi_match_data applesmc_dmi_data[] = {
        { .accelerometer = 0, .light = 0, .temperature_set = 3 },
 /* MacPro: temperature set 4 */
        { .accelerometer = 0, .light = 0, .temperature_set = 4 },
+/* iMac: temperature set 5 */
+       { .accelerometer = 0, .light = 0, .temperature_set = 5 },
+/* MacBook3: accelerometer and temperature set 6 */
+       { .accelerometer = 1, .light = 0, .temperature_set = 6 },
 };
 
 /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
@@ -1232,10 +1242,14 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = {
          DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
          DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") },
                (void*)&applesmc_dmi_data[0]},
-       { applesmc_dmi_match, "Apple MacBook", {
+       { applesmc_dmi_match, "Apple MacBook (v2)", {
          DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
          DMI_MATCH(DMI_PRODUCT_NAME,"MacBook2") },
                (void*)&applesmc_dmi_data[1]},
+       { applesmc_dmi_match, "Apple MacBook (v3)", {
+         DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
+         DMI_MATCH(DMI_PRODUCT_NAME,"MacBook3") },
+               (void*)&applesmc_dmi_data[6]},
        { applesmc_dmi_match, "Apple MacBook", {
          DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
          DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") },
@@ -1248,6 +1262,10 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = {
          DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
          DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") },
                (void*)&applesmc_dmi_data[4]},
+       { applesmc_dmi_match, "Apple iMac", {
+         DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
+         DMI_MATCH(DMI_PRODUCT_NAME,"iMac") },
+               (void*)&applesmc_dmi_data[5]},
        { .ident = NULL }
 };
 
index 70239acecc8e34fc5f7fbea703c8166fa8a3b430..93c17223b527018271b0febf9b96b4af4d030670 100644 (file)
@@ -413,10 +413,11 @@ static int __init coretemp_init(void)
        for_each_online_cpu(i) {
                struct cpuinfo_x86 *c = &cpu_data(i);
 
-               /* check if family 6, models 0xe, 0xf, 0x16, 0x17 */
+               /* check if family 6, models 0xe, 0xf, 0x16, 0x17, 0x1A */
                if ((c->cpuid_level < 0) || (c->x86 != 0x6) ||
                    !((c->x86_model == 0xe) || (c->x86_model == 0xf) ||
-                       (c->x86_model == 0x16) || (c->x86_model == 0x17))) {
+                       (c->x86_model == 0x16) || (c->x86_model == 0x17) ||
+                       (c->x86_model == 0x1A))) {
 
                        /* supported CPU not found, but report the unknown
                           family 6 CPU */
index 7b0a32c4dcfbacee11f6bce2b560afe620ff2790..c54eff92be4a6c4e6f45c1bf0d394fbc1c1f4655 100644 (file)
  * For VRD 10.0 and up, "VRD x.y Design Guide",
  * available at http://developer.intel.com/.
  *
- * AMD NPT 0Fh (Athlon64 & Opteron), AMD Publication 32559,
+ * AMD Athlon 64 and AMD Opteron Processors, AMD Publication 26094,
+ * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/26094.PDF
+ * Table 74. VID Code Voltages
+ * This corresponds to an arbitrary VRM code of 24 in the functions below.
+ * These CPU models (K8 revision <= E) have 5 VID pins. See also:
+ * Revision Guide for AMD Athlon 64 and AMD Opteron Processors, AMD Publication 25759,
+ * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25759.pdf
+ *
+ * AMD NPT Family 0Fh Processors, AMD Publication 32559,
  * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/32559.pdf
  * Table 71. VID Code Voltages
- * AMD Opteron processors don't follow the Intel specifications.
- * I'm going to "make up" 2.4 as the spec number for the Opterons.
- * No good reason just a mnemonic for the 24x Opteron processor
- * series.
+ * This corresponds to an arbitrary VRM code of 25 in the functions below.
+ * These CPU models (K8 revision >= F) have 6 VID pins. See also:
+ * Revision Guide for AMD NPT Family 0Fh Processors, AMD Publication 33610,
+ * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/33610.pdf
  *
  * The 17 specification is in fact Intel Mobile Voltage Positioning -
  * (IMVP-II). You can find more information in the datasheet of Max1718
@@ -95,7 +103,12 @@ int vid_from_reg(int val, u8 vrm)
                        return 0;
                return((1600000 - (val - 2) * 6250 + 500) / 1000);
 
-       case 24:                /* AMD NPT 0Fh (Athlon64 & Opteron) */
+       case 24:                /* Athlon64 & Opteron */
+               val &= 0x1f;
+               if (val == 0x1f)
+                       return 0;
+                               /* fall through */
+       case 25:                /* AMD NPT 0Fh */
                val &= 0x3f;
                return (val < 32) ? 1550 - 25 * val
                        : 775 - (25 * (val - 31)) / 2;
@@ -157,11 +170,16 @@ struct vrm_model {
 
 #ifdef CONFIG_X86
 
-/* the stepping parameter is highest acceptable stepping for current line */
+/*
+ * The stepping parameter is highest acceptable stepping for current line.
+ * The model match must be exact for 4-bit values. For model values 0x10
+ * and above (extended model), all models below the parameter will match.
+ */
 
 static struct vrm_model vrm_models[] = {
        {X86_VENDOR_AMD, 0x6, ANY, ANY, 90},            /* Athlon Duron etc */
-       {X86_VENDOR_AMD, 0xF, ANY, ANY, 24},            /* Athlon 64, Opteron and above VRM 24 */
+       {X86_VENDOR_AMD, 0xF, 0x3F, ANY, 24},           /* Athlon 64, Opteron */
+       {X86_VENDOR_AMD, 0xF, ANY, ANY, 25},            /* NPT family 0Fh */
        {X86_VENDOR_INTEL, 0x6, 0x9, ANY, 13},          /* Pentium M (130 nm) */
        {X86_VENDOR_INTEL, 0x6, 0xB, ANY, 85},          /* Tualatin */
        {X86_VENDOR_INTEL, 0x6, 0xD, ANY, 13},          /* Pentium M (90 nm) */
@@ -189,6 +207,8 @@ static u8 find_vrm(u8 eff_family, u8 eff_model, u8 eff_stepping, u8 vendor)
                if (vrm_models[i].vendor==vendor)
                        if ((vrm_models[i].eff_family==eff_family)
                         && ((vrm_models[i].eff_model==eff_model) ||
+                            (vrm_models[i].eff_model >= 0x10 &&
+                             eff_model <= vrm_models[i].eff_model) ||
                             (vrm_models[i].eff_model==ANY)) &&
                             (eff_stepping <= vrm_models[i].eff_stepping))
                                return vrm_models[i].vrm_type;
index f9e2ed621f7b6b55d0595bf1c9bd2e79bfba634d..2ede9388096bc5917866089c5b1ec91ce7471814 100644 (file)
@@ -81,6 +81,8 @@ static unsigned long amb_reg_temp(unsigned int amb)
 #define MAX_AMBS_PER_CHANNEL           16
 #define MAX_AMBS                       (MAX_MEM_CHANNELS * \
                                         MAX_AMBS_PER_CHANNEL)
+#define CHANNEL_SHIFT                  4
+#define DIMM_MASK                      0xF
 /*
  * Ugly hack: For some reason the highest bit is set if there
  * are _any_ DIMMs in the channel.  Attempting to read from
@@ -89,7 +91,7 @@ static unsigned long amb_reg_temp(unsigned int amb)
  * might prevent us from seeing the 16th DIMM in the channel.
  */
 #define REAL_MAX_AMBS_PER_CHANNEL      15
-#define KNOBS_PER_AMB                  5
+#define KNOBS_PER_AMB                  6
 
 static unsigned long amb_num_from_reg(unsigned int byte_num, unsigned int bit)
 {
@@ -238,6 +240,16 @@ static ssize_t show_amb_temp(struct device *dev,
                500 * amb_read_byte(data, amb_reg_temp(attr->index)));
 }
 
+static ssize_t show_label(struct device *dev,
+                         struct device_attribute *devattr,
+                         char *buf)
+{
+       struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+
+       return sprintf(buf, "Ch. %d DIMM %d\n", attr->index >> CHANNEL_SHIFT,
+                      attr->index & DIMM_MASK);
+}
+
 static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev)
 {
        int i, j, k, d = 0;
@@ -268,6 +280,20 @@ static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev)
                                continue;
                        d++;
 
+                       /* sysfs label */
+                       iattr = data->attrs + data->num_attrs;
+                       snprintf(iattr->name, AMB_SYSFS_NAME_LEN,
+                                "temp%d_label", d);
+                       iattr->s_attr.dev_attr.attr.name = iattr->name;
+                       iattr->s_attr.dev_attr.attr.mode = S_IRUGO;
+                       iattr->s_attr.dev_attr.show = show_label;
+                       iattr->s_attr.index = k;
+                       res = device_create_file(&pdev->dev,
+                                                &iattr->s_attr.dev_attr);
+                       if (res)
+                               goto exit_remove;
+                       data->num_attrs++;
+
                        /* Temperature sysfs knob */
                        iattr = data->attrs + data->num_attrs;
                        snprintf(iattr->name, AMB_SYSFS_NAME_LEN,
index c9416e657487d52ac317bffe74c592742446b882..0f70dc204105370ce203a9725bdfd272fb6c3a24 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * A hwmon driver for the IBM Active Energy Manager temperature/power sensors
- * and capping functionality.
+ * A hwmon driver for the IBM System Director Active Energy Manager (AEM)
+ * temperature/power/energy sensors and capping functionality.
  * Copyright (C) 2008 IBM
  *
  * Author: Darrick J. Wong <djwong@us.ibm.com>
@@ -463,12 +463,18 @@ static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg,
 }
 
 /* Update AEM energy registers */
+static void update_aem_energy_one(struct aem_data *data, int which)
+{
+       aem_read_sensor(data, AEM_ENERGY_ELEMENT, which,
+                       &data->energy[which], 8);
+}
+
 static void update_aem_energy(struct aem_data *data)
 {
-       aem_read_sensor(data, AEM_ENERGY_ELEMENT, 0, &data->energy[0], 8);
+       update_aem_energy_one(data, 0);
        if (data->ver_major < 2)
                return;
-       aem_read_sensor(data, AEM_ENERGY_ELEMENT, 1, &data->energy[1], 8);
+       update_aem_energy_one(data, 1);
 }
 
 /* Update all AEM1 sensors */
@@ -676,7 +682,8 @@ static int aem_find_aem2(struct aem_ipmi_data *data,
                return -ETIMEDOUT;
 
        if (data->rx_result || data->rx_msg_len != sizeof(*fi_resp) ||
-           memcmp(&fi_resp->id, &system_x_id, sizeof(system_x_id)))
+           memcmp(&fi_resp->id, &system_x_id, sizeof(system_x_id)) ||
+           fi_resp->num_instances <= instance_num)
                return -ENOENT;
 
        return 0;
@@ -849,7 +856,7 @@ static ssize_t aem_show_power(struct device *dev,
        struct timespec b, a;
 
        mutex_lock(&data->lock);
-       update_aem_energy(data);
+       update_aem_energy_one(data, attr->index);
        getnstimeofday(&b);
        before = data->energy[attr->index];
 
@@ -861,7 +868,7 @@ static ssize_t aem_show_power(struct device *dev,
                return 0;
        }
 
-       update_aem_energy(data);
+       update_aem_energy_one(data, attr->index);
        getnstimeofday(&a);
        after = data->energy[attr->index];
        mutex_unlock(&data->lock);
@@ -880,7 +887,9 @@ static ssize_t aem_show_energy(struct device *dev,
 {
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
        struct aem_data *a = dev_get_drvdata(dev);
-       a->update(a);
+       mutex_lock(&a->lock);
+       update_aem_energy_one(a, attr->index);
+       mutex_unlock(&a->lock);
 
        return sprintf(buf, "%llu\n",
                        (unsigned long long)a->energy[attr->index] * 1000);
@@ -1104,7 +1113,7 @@ static void __exit aem_exit(void)
 }
 
 MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>");
-MODULE_DESCRIPTION("IBM Active Energy Manager power/temp sensor driver");
+MODULE_DESCRIPTION("IBM AEM power/temp/energy sensor driver");
 MODULE_LICENSE("GPL");
 
 module_init(aem_init);
index daa7d121483bdd042c4396ec62e903e6a9b46cb8..de21142d106c10efbbd3af4858c0c9c140360606 100644 (file)
@@ -1055,9 +1055,10 @@ static int w83791d_probe(struct i2c_client *client,
 {
        struct w83791d_data *data;
        struct device *dev = &client->dev;
-       int i, val1, err;
+       int i, err;
 
 #ifdef DEBUG
+       int val1;
        val1 = w83791d_read(client, W83791D_REG_DID_VID4);
        dev_dbg(dev, "Device ID version: %d.%d (0x%02x)\n",
                        (val1 >> 5) & 0x07, (val1 >> 1) & 0x0f, val1);
index 89a112d513adc9fb9e1ccf2cf2d4c8a818eea675..49a8c589e346c15982e158e5116c9fd930aa9b46 100644 (file)
@@ -1272,9 +1272,9 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,
  */
 static void msf_from_bcd(struct atapi_msf *msf)
 {
-       msf->minute = BCD2BIN(msf->minute);
-       msf->second = BCD2BIN(msf->second);
-       msf->frame  = BCD2BIN(msf->frame);
+       msf->minute = bcd2bin(msf->minute);
+       msf->second = bcd2bin(msf->second);
+       msf->frame  = bcd2bin(msf->frame);
 }
 
 int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense)
@@ -1415,8 +1415,8 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
                return stat;
 
        if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) {
-               toc->hdr.first_track = BCD2BIN(toc->hdr.first_track);
-               toc->hdr.last_track  = BCD2BIN(toc->hdr.last_track);
+               toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
+               toc->hdr.last_track  = bcd2bin(toc->hdr.last_track);
        }
 
        ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
@@ -1456,8 +1456,8 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
                        return stat;
 
                if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) {
-                       toc->hdr.first_track = (u8)BIN2BCD(CDROM_LEADOUT);
-                       toc->hdr.last_track = (u8)BIN2BCD(CDROM_LEADOUT);
+                       toc->hdr.first_track = (u8)bin2bcd(CDROM_LEADOUT);
+                       toc->hdr.last_track = (u8)bin2bcd(CDROM_LEADOUT);
                } else {
                        toc->hdr.first_track = CDROM_LEADOUT;
                        toc->hdr.last_track = CDROM_LEADOUT;
@@ -1470,14 +1470,14 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
        toc->hdr.toc_length = be16_to_cpu(toc->hdr.toc_length);
 
        if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) {
-               toc->hdr.first_track = BCD2BIN(toc->hdr.first_track);
-               toc->hdr.last_track  = BCD2BIN(toc->hdr.last_track);
+               toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
+               toc->hdr.last_track  = bcd2bin(toc->hdr.last_track);
        }
 
        for (i = 0; i <= ntracks; i++) {
                if (drive->atapi_flags & IDE_AFLAG_TOCADDR_AS_BCD) {
                        if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD)
-                               toc->ent[i].track = BCD2BIN(toc->ent[i].track);
+                               toc->ent[i].track = bcd2bin(toc->ent[i].track);
                        msf_from_bcd(&toc->ent[i].addr.msf);
                }
                toc->ent[i].addr.lba = msf_to_lba(toc->ent[i].addr.msf.minute,
index 40644b6f1c002876c6286e80a29923996e58eee9..3187215e8f8997a95ec54abcd63a7ee5ee9f9a6d 100644 (file)
@@ -307,7 +307,7 @@ static struct pci_driver driver = {
        .name           = "AEC62xx_IDE",
        .id_table       = aec62xx_pci_tbl,
        .probe          = aec62xx_init_one,
-       .remove         = aec62xx_remove,
+       .remove         = __devexit_p(aec62xx_remove),
 };
 
 static int __init aec62xx_ide_init(void)
index bfae2f882f48d48ec75ab4fb304ac5aa4321892c..e6d8ee88d56d21c184154d96957eed66756f2f5f 100644 (file)
@@ -447,7 +447,7 @@ static struct pci_driver driver = {
        .name           = "Cypress_IDE",
        .id_table       = cy82c693_pci_tbl,
        .probe          = cy82c693_init_one,
-       .remove         = cy82c693_remove,
+       .remove         = __devexit_p(cy82c693_remove),
 };
 
 static int __init cy82c693_ide_init(void)
index 748793a413ab8900c1ad0cdb0b82d9e6ba1d3d82..eb107eef0dbc8e89cac9a5604b5fe0619165f4d3 100644 (file)
@@ -1620,7 +1620,7 @@ static struct pci_driver driver = {
        .name           = "HPT366_IDE",
        .id_table       = hpt366_pci_tbl,
        .probe          = hpt366_init_one,
-       .remove         = hpt366_remove,
+       .remove         = __devexit_p(hpt366_remove),
 };
 
 static int __init hpt366_ide_init(void)
index b6dc723de702677dbc799b9cc6b9a4e07014f37a..4a1508a707cc76ba73c7df440d224d88d0f5b4a8 100644 (file)
@@ -686,7 +686,7 @@ static struct pci_driver driver = {
        .name           = "ITE821x IDE",
        .id_table       = it821x_pci_tbl,
        .probe          = it821x_init_one,
-       .remove         = it821x_remove,
+       .remove         = __devexit_p(it821x_remove),
 };
 
 static int __init it821x_ide_init(void)
index 0f609b72f47003e710e68ea04c0c093e5fe83eb8..d477da6b58589962fc43f49b45a04d822c2dd28a 100644 (file)
@@ -566,7 +566,7 @@ static struct pci_driver driver = {
        .name           = "Promise_IDE",
        .id_table       = pdc202new_pci_tbl,
        .probe          = pdc202new_init_one,
-       .remove         = pdc202new_remove,
+       .remove         = __devexit_p(pdc202new_remove),
 };
 
 static int __init pdc202new_ide_init(void)
index 6cde48bba6f8825c998218de12d88fb9ca4ec773..44cccd1e086acdf91650161a0ae339bd05aa697d 100644 (file)
@@ -954,7 +954,7 @@ static struct pci_driver driver = {
        .name = "SCC IDE",
        .id_table = scc_pci_tbl,
        .probe = scc_init_one,
-       .remove = scc_remove,
+       .remove = __devexit_p(scc_remove),
 };
 
 static int scc_ide_init(void)
index 42eef19a18f14f7c46611ffb2a7073e8d8cce6d4..681306c9d79be56e8fa1c44decf2bc2a29b950c4 100644 (file)
@@ -621,9 +621,9 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
        if (!request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE,
            DRV_NAME)) {
                printk(KERN_ERR
-                       "%s : %s -- ERROR, Addresses "
+                       "%s %s: -- ERROR, Addresses "
                        "0x%p to 0x%p ALREADY in use\n",
-                      __func__, DRV_NAME, (void *) cmd_phys_base,
+                      DRV_NAME, pci_name(dev), (void *)cmd_phys_base,
                       (void *) cmd_phys_base + IOC4_CMD_CTL_BLK_SIZE);
                return -ENOMEM;
        }
index 445ce6fbea335a6291c3ad47b4b92ac4adcf40d8..db2b88a369ab36634e8dbfb1e82f6ebfebface97 100644 (file)
@@ -832,7 +832,7 @@ static struct pci_driver driver = {
        .name           = "SiI_IDE",
        .id_table       = siimage_pci_tbl,
        .probe          = siimage_init_one,
-       .remove         = siimage_remove,
+       .remove         = __devexit_p(siimage_remove),
 };
 
 static int __init siimage_ide_init(void)
index e5a4b42b4e33c0aea391b671d847d4a099692ddc..5efe21d6ef9733807b7aa0827456451420ada3e8 100644 (file)
@@ -610,7 +610,7 @@ static struct pci_driver driver = {
        .name           = "SIS_IDE",
        .id_table       = sis5513_pci_tbl,
        .probe          = sis5513_init_one,
-       .remove         = sis5513_remove,
+       .remove         = __devexit_p(sis5513_remove),
 };
 
 static int __init sis5513_ide_init(void)
index 7fc88c375e5db4561ccc477a5f690c2437e14df3..927277c54ec9609d542605234761efa58a7cbce2 100644 (file)
@@ -249,7 +249,7 @@ static struct pci_driver driver = {
        .name           = "TC86C001",
        .id_table       = tc86c001_pci_tbl,
        .probe          = tc86c001_init_one,
-       .remove         = tc86c001_remove,
+       .remove         = __devexit_p(tc86c001_remove),
 };
 
 static int __init tc86c001_ide_init(void)
index a6b2cc83f293cbcf34a97eec5d0b071a2905955e..94fb9ab3223f8ff61088bd32fb40087610a96381 100644 (file)
@@ -491,7 +491,7 @@ static struct pci_driver driver = {
        .name           = "VIA_IDE",
        .id_table       = via_pci_tbl,
        .probe          = via_init_one,
-       .remove         = via_remove,
+       .remove         = __devexit_p(via_remove),
 };
 
 static int __init via_ide_init(void)
index 994a21e5a0aa7e6d929e94b82f0f8f99efe5b72f..16240a7896509c024bacf59ff48bd8dd1c227d9d 100644 (file)
@@ -844,7 +844,7 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, struct csr1212_csr
        ne->host = host;
        ne->nodeid = nodeid;
        ne->generation = generation;
-       ne->needs_probe = 1;
+       ne->needs_probe = true;
 
        ne->guid = guid;
        ne->guid_vendor_id = (guid >> 40) & 0xffffff;
@@ -1144,7 +1144,7 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent
        struct csr1212_keyval *kv, *vendor_name_kv = NULL;
        u8 last_key_id = 0;
 
-       ne->needs_probe = 0;
+       ne->needs_probe = false;
 
        csr1212_for_each_dir_entry(ne->csr, kv, ne->csr->root_kv, dentry) {
                switch (kv->key.id) {
@@ -1295,7 +1295,7 @@ static void nodemgr_update_node(struct node_entry *ne, struct csr1212_csr *csr,
                nodemgr_update_bus_options(ne);
 
                /* Mark the node as new, so it gets re-probed */
-               ne->needs_probe = 1;
+               ne->needs_probe = true;
        } else {
                /* old cache is valid, so update its generation */
                struct nodemgr_csr_info *ci = ne->csr->private;
@@ -1566,57 +1566,60 @@ static void nodemgr_probe_ne(struct host_info *hi, struct node_entry *ne, int ge
 struct probe_param {
        struct host_info *hi;
        int generation;
+       bool probe_now;
 };
 
-static int __nodemgr_node_probe(struct device *dev, void *data)
+static int node_probe(struct device *dev, void *data)
 {
-       struct probe_param *param = (struct probe_param *)data;
+       struct probe_param *p = data;
        struct node_entry *ne;
 
+       if (p->generation != get_hpsb_generation(p->hi->host))
+               return -EAGAIN;
+
        ne = container_of(dev, struct node_entry, node_dev);
-       if (!ne->needs_probe)
-               nodemgr_probe_ne(param->hi, ne, param->generation);
-       if (ne->needs_probe)
-               nodemgr_probe_ne(param->hi, ne, param->generation);
+       if (ne->needs_probe == p->probe_now)
+               nodemgr_probe_ne(p->hi, ne, p->generation);
        return 0;
 }
 
 static void nodemgr_node_probe(struct host_info *hi, int generation)
 {
-       struct hpsb_host *host = hi->host;
-       struct probe_param param;
+       struct probe_param p;
 
-       param.hi = hi;
-       param.generation = generation;
-       /* Do some processing of the nodes we've probed. This pulls them
+       p.hi = hi;
+       p.generation = generation;
+       /*
+        * Do some processing of the nodes we've probed. This pulls them
         * into the sysfs layer if needed, and can result in processing of
         * unit-directories, or just updating the node and it's
         * unit-directories.
         *
         * Run updates before probes. Usually, updates are time-critical
-        * while probes are time-consuming. (Well, those probes need some
-        * improvement...) */
-
-       class_for_each_device(&nodemgr_ne_class, NULL, &param,
-                             __nodemgr_node_probe);
-
-       /* If we had a bus reset while we were scanning the bus, it is
-        * possible that we did not probe all nodes.  In that case, we
-        * skip the clean up for now, since we could remove nodes that
-        * were still on the bus.  Another bus scan is pending which will
-        * do the clean up eventually.
+        * while probes are time-consuming.
         *
+        * Meanwhile, another bus reset may have happened. In this case we
+        * skip everything here and let the next bus scan handle it.
+        * Otherwise we may prematurely remove nodes which are still there.
+        */
+       p.probe_now = false;
+       if (class_for_each_device(&nodemgr_ne_class, NULL, &p, node_probe) != 0)
+               return;
+
+       p.probe_now = true;
+       if (class_for_each_device(&nodemgr_ne_class, NULL, &p, node_probe) != 0)
+               return;
+       /*
         * Now let's tell the bus to rescan our devices. This may seem
         * like overhead, but the driver-model core will only scan a
         * device for a driver when either the device is added, or when a
         * new driver is added. A bus reset is a good reason to rescan
         * devices that were there before.  For example, an sbp2 device
         * may become available for login, if the host that held it was
-        * just removed.  */
-
-       if (generation == get_hpsb_generation(host))
-               if (bus_rescan_devices(&ieee1394_bus_type))
-                       HPSB_DEBUG("bus_rescan_devices had an error");
+        * just removed.
+        */
+       if (bus_rescan_devices(&ieee1394_bus_type) != 0)
+               HPSB_DEBUG("bus_rescan_devices had an error");
 }
 
 static int nodemgr_send_resume_packet(struct hpsb_host *host)
index 919e92e2a9556b12045fca7371f8faf6e955e679..6eb26465a84ca44029c4d43cc3ba17ba1eb1c378 100644 (file)
@@ -97,7 +97,7 @@ struct node_entry {
        struct hpsb_host *host;         /* Host this node is attached to */
        nodeid_t nodeid;                /* NodeID */
        struct bus_options busopt;      /* Bus Options */
-       int needs_probe;
+       bool needs_probe;
        unsigned int generation;        /* Synced with hpsb generation */
 
        /* The following is read from the config rom */
index 9cbf3154d2432ec748a03625450b35b92f9ade7f..1d6ad34355372f1c492d984e1c8b56f625d0acf6 100644 (file)
@@ -731,15 +731,26 @@ static int sbp2_update(struct unit_directory *ud)
 {
        struct sbp2_lu *lu = ud->device.driver_data;
 
-       if (sbp2_reconnect_device(lu)) {
-               /* Reconnect has failed. Perhaps we didn't reconnect fast
-                * enough. Try a regular login, but first log out just in
-                * case of any weirdness. */
+       if (sbp2_reconnect_device(lu) != 0) {
+               /*
+                * Reconnect failed.  If another bus reset happened,
+                * let nodemgr proceed and call sbp2_update again later
+                * (or sbp2_remove if this node went away).
+                */
+               if (!hpsb_node_entry_valid(lu->ne))
+                       return 0;
+               /*
+                * Or the target rejected the reconnect because we weren't
+                * fast enough.  Try a regular login, but first log out
+                * just in case of any weirdness.
+                */
                sbp2_logout_device(lu);
 
-               if (sbp2_login_device(lu)) {
-                       /* Login failed too, just fail, and the backend
-                        * will call our sbp2_remove for us */
+               if (sbp2_login_device(lu) != 0) {
+                       if (!hpsb_node_entry_valid(lu->ne))
+                               return 0;
+
+                       /* Maybe another initiator won the login. */
                        SBP2_ERR("Failed to reconnect to sbp2 device!");
                        return -EBUSY;
                }
index 2d65411f6763499198ecc922e928b02481678e4b..3524bef62be654910ec23ca5c917787269a6b018 100644 (file)
@@ -647,6 +647,47 @@ static int str_to_user(const char *str, unsigned int maxlen, void __user *p)
        return copy_to_user(p, str, len) ? -EFAULT : len;
 }
 
+#define OLD_KEY_MAX    0x1ff
+static int handle_eviocgbit(struct input_dev *dev, unsigned int cmd, void __user *p, int compat_mode)
+{
+       static unsigned long keymax_warn_time;
+       unsigned long *bits;
+       int len;
+
+       switch (_IOC_NR(cmd) & EV_MAX) {
+
+       case      0: bits = dev->evbit;  len = EV_MAX;  break;
+       case EV_KEY: bits = dev->keybit; len = KEY_MAX; break;
+       case EV_REL: bits = dev->relbit; len = REL_MAX; break;
+       case EV_ABS: bits = dev->absbit; len = ABS_MAX; break;
+       case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break;
+       case EV_LED: bits = dev->ledbit; len = LED_MAX; break;
+       case EV_SND: bits = dev->sndbit; len = SND_MAX; break;
+       case EV_FF:  bits = dev->ffbit;  len = FF_MAX;  break;
+       case EV_SW:  bits = dev->swbit;  len = SW_MAX;  break;
+       default: return -EINVAL;
+       }
+
+       /*
+        * Work around bugs in userspace programs that like to do
+        * EVIOCGBIT(EV_KEY, KEY_MAX) and not realize that 'len'
+        * should be in bytes, not in bits.
+        */
+       if ((_IOC_NR(cmd) & EV_MAX) == EV_KEY && _IOC_SIZE(cmd) == OLD_KEY_MAX) {
+               len = OLD_KEY_MAX;
+               if (printk_timed_ratelimit(&keymax_warn_time, 10 * 1000))
+                       printk(KERN_WARNING
+                               "evdev.c(EVIOCGBIT): Suspicious buffer size %u, "
+                               "limiting output to %zu bytes. See "
+                               "http://userweb.kernel.org/~dtor/eviocgbit-bug.html\n",
+                               OLD_KEY_MAX,
+                               BITS_TO_LONGS(OLD_KEY_MAX) * sizeof(long));
+       }
+
+       return bits_to_user(bits, len, _IOC_SIZE(cmd), p, compat_mode);
+}
+#undef OLD_KEY_MAX
+
 static long evdev_do_ioctl(struct file *file, unsigned int cmd,
                           void __user *p, int compat_mode)
 {
@@ -733,26 +774,8 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
 
                if (_IOC_DIR(cmd) == _IOC_READ) {
 
-                       if ((_IOC_NR(cmd) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) {
-
-                               unsigned long *bits;
-                               int len;
-
-                               switch (_IOC_NR(cmd) & EV_MAX) {
-
-                               case      0: bits = dev->evbit;  len = EV_MAX;  break;
-                               case EV_KEY: bits = dev->keybit; len = KEY_MAX; break;
-                               case EV_REL: bits = dev->relbit; len = REL_MAX; break;
-                               case EV_ABS: bits = dev->absbit; len = ABS_MAX; break;
-                               case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break;
-                               case EV_LED: bits = dev->ledbit; len = LED_MAX; break;
-                               case EV_SND: bits = dev->sndbit; len = SND_MAX; break;
-                               case EV_FF:  bits = dev->ffbit;  len = FF_MAX;  break;
-                               case EV_SW:  bits = dev->swbit;  len = SW_MAX;  break;
-                               default: return -EINVAL;
-                               }
-                               return bits_to_user(bits, len, _IOC_SIZE(cmd), p, compat_mode);
-                       }
+                       if ((_IOC_NR(cmd) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0)))
+                               return handle_eviocgbit(dev, cmd, p, compat_mode);
 
                        if (_IOC_NR(cmd) == _IOC_NR(EVIOCGKEY(0)))
                                return bits_to_user(dev->key, KEY_MAX, _IOC_SIZE(cmd),
index 87d3e7eabffd3e57b6b32714701b3cc7d65eb312..6791be81eb2904b15780da13dac99ce11e5925a6 100644 (file)
@@ -127,6 +127,7 @@ static const struct xpad_device {
        { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 },
        { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
        { 0x0c12, 0x8802, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
+       { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", MAP_DPAD_TO_AXES, XTYPE_XBOX },
        { 0x0c12, 0x8810, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
        { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", MAP_DPAD_TO_AXES, XTYPE_XBOX },
        { 0x0e4c, 0x1097, "Radica Gamester Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX },
index be58730e636a4323c1aca62d136e94ec40700bcf..ec96b369dd7ac02ed3bb49dec3bcfe8e9c649ae1 100644 (file)
@@ -9,7 +9,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/version.h>
 
 #include <linux/init.h>
 #include <linux/fs.h>
@@ -118,6 +117,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
                unsigned int type = button->type ?: EV_KEY;
 
                bdata->input = input;
+               bdata->button = button;
                setup_timer(&bdata->timer,
                            gpio_check_button, (unsigned long)bdata);
 
@@ -256,7 +256,7 @@ static int gpio_keys_resume(struct platform_device *pdev)
 #define gpio_keys_resume       NULL
 #endif
 
-struct platform_driver gpio_keys_device_driver = {
+static struct platform_driver gpio_keys_device_driver = {
        .probe          = gpio_keys_probe,
        .remove         = __devexit_p(gpio_keys_remove),
        .suspend        = gpio_keys_suspend,
index 6a1f48b76e3298649130c8d341123bcbf2e0f131..2adf9cb265da69fd67b6d1b8bec3fa3841e95ec2 100644 (file)
@@ -148,6 +148,9 @@ static int __devexit cobalt_buttons_remove(struct platform_device *pdev)
        return 0;
 }
 
+MODULE_AUTHOR("Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>");
+MODULE_DESCRIPTION("Cobalt button interface driver");
+MODULE_LICENSE("GPL");
 /* work with hotplug and coldplug */
 MODULE_ALIAS("platform:Cobalt buttons");
 
index 7bbea097cda2849108a9e5c052101226059e1802..f996546fc443757151f4f7f09f95c996f4c576d9 100644 (file)
@@ -130,6 +130,29 @@ config MOUSE_APPLETOUCH
          To compile this driver as a module, choose M here: the
          module will be called appletouch.
 
+config MOUSE_BCM5974
+       tristate "Apple USB BCM5974 Multitouch trackpad support"
+       depends on USB_ARCH_HAS_HCD
+       select USB
+       help
+         Say Y here if you have an Apple USB BCM5974 Multitouch
+         trackpad.
+
+         The BCM5974 is the multitouch trackpad found in the Macbook
+         Air (JAN2008) and Macbook Pro Penryn (FEB2008) laptops.
+
+         It is also found in the IPhone (2007) and Ipod Touch (2008).
+
+         This driver provides multitouch functionality together with
+         the synaptics X11 driver.
+
+         The interface is currently identical to the appletouch interface,
+         for further information, see
+         <file:Documentation/input/appletouch.txt>.
+
+         To compile this driver as a module, choose M here: the
+         module will be called bcm5974.
+
 config MOUSE_INPORT
        tristate "InPort/MS/ATIXL busmouse"
        depends on ISA
index 9e6e36330820e7d9dc4092a45e2cfd53a6530204..d4d202516090be6075afd735663ded497c7b6b0d 100644 (file)
@@ -6,6 +6,7 @@
 
 obj-$(CONFIG_MOUSE_AMIGA)      += amimouse.o
 obj-$(CONFIG_MOUSE_APPLETOUCH) += appletouch.o
+obj-$(CONFIG_MOUSE_BCM5974)    += bcm5974.o
 obj-$(CONFIG_MOUSE_ATARI)      += atarimouse.o
 obj-$(CONFIG_MOUSE_RISCPC)     += rpcmouse.o
 obj-$(CONFIG_MOUSE_INPORT)     += inport.o
diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c
new file mode 100644 (file)
index 0000000..2ec921b
--- /dev/null
@@ -0,0 +1,681 @@
+/*
+ * Apple USB BCM5974 (Macbook Air and Penryn Macbook Pro) multitouch driver
+ *
+ * Copyright (C) 2008     Henrik Rydberg (rydberg@euromail.se)
+ *
+ * The USB initialization and package decoding was made by
+ * Scott Shawcroft as part of the touchd user-space driver project:
+ * Copyright (C) 2008     Scott Shawcroft (scott.shawcroft@gmail.com)
+ *
+ * The BCM5974 driver is based on the appletouch driver:
+ * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com)
+ * Copyright (C) 2005      Johannes Berg (johannes@sipsolutions.net)
+ * Copyright (C) 2005     Stelian Pop (stelian@popies.net)
+ * Copyright (C) 2005     Frank Arnold (frank@scirocco-5v-turbo.de)
+ * Copyright (C) 2005     Peter Osterlund (petero2@telia.com)
+ * Copyright (C) 2005     Michael Hanselmann (linux-kernel@hansmi.ch)
+ * Copyright (C) 2006     Nicolas Boichat (nicolas@boichat.ch)
+ *
+ * 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/errno.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/usb/input.h>
+#include <linux/hid.h>
+#include <linux/mutex.h>
+
+#define USB_VENDOR_ID_APPLE            0x05ac
+
+/* MacbookAir, aka wellspring */
+#define USB_DEVICE_ID_APPLE_WELLSPRING_ANSI    0x0223
+#define USB_DEVICE_ID_APPLE_WELLSPRING_ISO     0x0224
+#define USB_DEVICE_ID_APPLE_WELLSPRING_JIS     0x0225
+/* MacbookProPenryn, aka wellspring2 */
+#define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI   0x0230
+#define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO    0x0231
+#define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS    0x0232
+
+#define BCM5974_DEVICE(prod) {                                 \
+       .match_flags = (USB_DEVICE_ID_MATCH_DEVICE |            \
+                       USB_DEVICE_ID_MATCH_INT_CLASS |         \
+                       USB_DEVICE_ID_MATCH_INT_PROTOCOL),      \
+       .idVendor = USB_VENDOR_ID_APPLE,                        \
+       .idProduct = (prod),                                    \
+       .bInterfaceClass = USB_INTERFACE_CLASS_HID,             \
+       .bInterfaceProtocol = USB_INTERFACE_PROTOCOL_MOUSE      \
+}
+
+/* table of devices that work with this driver */
+static const struct usb_device_id bcm5974_table [] = {
+       /* MacbookAir1.1 */
+       BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_ANSI),
+       BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_ISO),
+       BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_JIS),
+       /* MacbookProPenryn */
+       BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI),
+       BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_ISO),
+       BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_JIS),
+       /* Terminating entry */
+       {}
+};
+MODULE_DEVICE_TABLE(usb, bcm5974_table);
+
+MODULE_AUTHOR("Henrik Rydberg");
+MODULE_DESCRIPTION("Apple USB BCM5974 multitouch driver");
+MODULE_LICENSE("GPL");
+
+#define dprintk(level, format, a...)\
+       { if (debug >= level) printk(KERN_DEBUG format, ##a); }
+
+static int debug = 1;
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug, "Activate debugging output");
+
+/* button data structure */
+struct bt_data {
+       u8 unknown1;            /* constant */
+       u8 button;              /* left button */
+       u8 rel_x;               /* relative x coordinate */
+       u8 rel_y;               /* relative y coordinate */
+};
+
+/* trackpad header structure */
+struct tp_header {
+       u8 unknown1[16];        /* constants, timers, etc */
+       u8 fingers;             /* number of fingers on trackpad */
+       u8 unknown2[9];         /* constants, timers, etc */
+};
+
+/* trackpad finger structure */
+struct tp_finger {
+       __le16 origin;          /* left/right origin? */
+       __le16 abs_x;           /* absolute x coodinate */
+       __le16 abs_y;           /* absolute y coodinate */
+       __le16 rel_x;           /* relative x coodinate */
+       __le16 rel_y;           /* relative y coodinate */
+       __le16 size_major;      /* finger size, major axis? */
+       __le16 size_minor;      /* finger size, minor axis? */
+       __le16 orientation;     /* 16384 when point, else 15 bit angle */
+       __le16 force_major;     /* trackpad force, major axis? */
+       __le16 force_minor;     /* trackpad force, minor axis? */
+       __le16 unused[3];       /* zeros */
+       __le16 multi;           /* one finger: varies, more fingers: constant */
+};
+
+/* trackpad data structure, empirically at least ten fingers */
+struct tp_data {
+       struct tp_header header;
+       struct tp_finger finger[16];
+};
+
+/* device-specific parameters */
+struct bcm5974_param {
+       int dim;                /* logical dimension */
+       int fuzz;               /* logical noise value */
+       int devmin;             /* device minimum reading */
+       int devmax;             /* device maximum reading */
+};
+
+/* device-specific configuration */
+struct bcm5974_config {
+       int ansi, iso, jis;     /* the product id of this device */
+       int bt_ep;              /* the endpoint of the button interface */
+       int bt_datalen;         /* data length of the button interface */
+       int tp_ep;              /* the endpoint of the trackpad interface */
+       int tp_datalen;         /* data length of the trackpad interface */
+       struct bcm5974_param p; /* finger pressure limits */
+       struct bcm5974_param w; /* finger width limits */
+       struct bcm5974_param x; /* horizontal limits */
+       struct bcm5974_param y; /* vertical limits */
+};
+
+/* logical device structure */
+struct bcm5974 {
+       char phys[64];
+       struct usb_device *udev;        /* usb device */
+       struct usb_interface *intf;     /* our interface */
+       struct input_dev *input;        /* input dev */
+       struct bcm5974_config cfg;      /* device configuration */
+       struct mutex pm_mutex;          /* serialize access to open/suspend */
+       int opened;                     /* 1: opened, 0: closed */
+       struct urb *bt_urb;             /* button usb request block */
+       struct bt_data *bt_data;        /* button transferred data */
+       struct urb *tp_urb;             /* trackpad usb request block */
+       struct tp_data *tp_data;        /* trackpad transferred data */
+};
+
+/* logical dimensions */
+#define DIM_PRESSURE   256             /* maximum finger pressure */
+#define DIM_WIDTH      16              /* maximum finger width */
+#define DIM_X          1280            /* maximum trackpad x value */
+#define DIM_Y          800             /* maximum trackpad y value */
+
+/* logical signal quality */
+#define SN_PRESSURE    45              /* pressure signal-to-noise ratio */
+#define SN_WIDTH       100             /* width signal-to-noise ratio */
+#define SN_COORD       250             /* coordinate signal-to-noise ratio */
+
+/* device constants */
+static const struct bcm5974_config bcm5974_config_table[] = {
+       {
+               USB_DEVICE_ID_APPLE_WELLSPRING_ANSI,
+               USB_DEVICE_ID_APPLE_WELLSPRING_ISO,
+               USB_DEVICE_ID_APPLE_WELLSPRING_JIS,
+               0x84, sizeof(struct bt_data),
+               0x81, sizeof(struct tp_data),
+               { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 256 },
+               { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
+               { DIM_X, DIM_X / SN_COORD, -4824, 5342 },
+               { DIM_Y, DIM_Y / SN_COORD, -172, 5820 }
+       },
+       {
+               USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI,
+               USB_DEVICE_ID_APPLE_WELLSPRING2_ISO,
+               USB_DEVICE_ID_APPLE_WELLSPRING2_JIS,
+               0x84, sizeof(struct bt_data),
+               0x81, sizeof(struct tp_data),
+               { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 256 },
+               { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
+               { DIM_X, DIM_X / SN_COORD, -4824, 4824 },
+               { DIM_Y, DIM_Y / SN_COORD, -172, 4290 }
+       },
+       {}
+};
+
+/* return the device-specific configuration by device */
+static const struct bcm5974_config *bcm5974_get_config(struct usb_device *udev)
+{
+       u16 id = le16_to_cpu(udev->descriptor.idProduct);
+       const struct bcm5974_config *cfg;
+
+       for (cfg = bcm5974_config_table; cfg->ansi; ++cfg)
+               if (cfg->ansi == id || cfg->iso == id || cfg->jis == id)
+                       return cfg;
+
+       return bcm5974_config_table;
+}
+
+/* convert 16-bit little endian to signed integer */
+static inline int raw2int(__le16 x)
+{
+       return (signed short)le16_to_cpu(x);
+}
+
+/* scale device data to logical dimensions (asserts devmin < devmax) */
+static inline int int2scale(const struct bcm5974_param *p, int x)
+{
+       return x * p->dim / (p->devmax - p->devmin);
+}
+
+/* all logical value ranges are [0,dim). */
+static inline int int2bound(const struct bcm5974_param *p, int x)
+{
+       int s = int2scale(p, x);
+
+       return clamp_val(s, 0, p->dim - 1);
+}
+
+/* setup which logical events to report */
+static void setup_events_to_report(struct input_dev *input_dev,
+                                  const struct bcm5974_config *cfg)
+{
+       __set_bit(EV_ABS, input_dev->evbit);
+
+       input_set_abs_params(input_dev, ABS_PRESSURE,
+                               0, cfg->p.dim, cfg->p.fuzz, 0);
+       input_set_abs_params(input_dev, ABS_TOOL_WIDTH,
+                               0, cfg->w.dim, cfg->w.fuzz, 0);
+       input_set_abs_params(input_dev, ABS_X,
+                               0, cfg->x.dim, cfg->x.fuzz, 0);
+       input_set_abs_params(input_dev, ABS_Y,
+                               0, cfg->y.dim, cfg->y.fuzz, 0);
+
+       __set_bit(EV_KEY, input_dev->evbit);
+       __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
+       __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
+       __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
+       __set_bit(BTN_LEFT, input_dev->keybit);
+}
+
+/* report button data as logical button state */
+static int report_bt_state(struct bcm5974 *dev, int size)
+{
+       if (size != sizeof(struct bt_data))
+               return -EIO;
+
+       input_report_key(dev->input, BTN_LEFT, dev->bt_data->button);
+       input_sync(dev->input);
+
+       return 0;
+}
+
+/* report trackpad data as logical trackpad state */
+static int report_tp_state(struct bcm5974 *dev, int size)
+{
+       const struct bcm5974_config *c = &dev->cfg;
+       const struct tp_finger *f = dev->tp_data->finger;
+       struct input_dev *input = dev->input;
+       const int fingers = (size - 26) / 28;
+       int p = 0, w, x, y, n = 0;
+
+       if (size < 26 || (size - 26) % 28 != 0)
+               return -EIO;
+
+       if (fingers) {
+               p = raw2int(f->force_major);
+               w = raw2int(f->size_major);
+               x = raw2int(f->abs_x);
+               y = raw2int(f->abs_y);
+               n = p > 0 ? fingers : 0;
+
+               dprintk(9,
+                       "bcm5974: p: %+05d w: %+05d x: %+05d y: %+05d n: %d\n",
+                       p, w, x, y, n);
+
+               input_report_abs(input, ABS_TOOL_WIDTH, int2bound(&c->w, w));
+               input_report_abs(input, ABS_X, int2bound(&c->x, x - c->x.devmin));
+               input_report_abs(input, ABS_Y, int2bound(&c->y, c->y.devmax - y));
+       }
+
+       input_report_abs(input, ABS_PRESSURE, int2bound(&c->p, p));
+
+       input_report_key(input, BTN_TOOL_FINGER, n == 1);
+       input_report_key(input, BTN_TOOL_DOUBLETAP, n == 2);
+       input_report_key(input, BTN_TOOL_TRIPLETAP, n > 2);
+
+       input_sync(input);
+
+       return 0;
+}
+
+/* Wellspring initialization constants */
+#define BCM5974_WELLSPRING_MODE_READ_REQUEST_ID                1
+#define BCM5974_WELLSPRING_MODE_WRITE_REQUEST_ID       9
+#define BCM5974_WELLSPRING_MODE_REQUEST_VALUE          0x300
+#define BCM5974_WELLSPRING_MODE_REQUEST_INDEX          0
+#define BCM5974_WELLSPRING_MODE_VENDOR_VALUE           0x01
+
+static int bcm5974_wellspring_mode(struct bcm5974 *dev)
+{
+       char *data = kmalloc(8, GFP_KERNEL);
+       int retval = 0, size;
+
+       if (!data) {
+               err("bcm5974: out of memory");
+               retval = -ENOMEM;
+               goto out;
+       }
+
+       /* read configuration */
+       size = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
+                       BCM5974_WELLSPRING_MODE_READ_REQUEST_ID,
+                       USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
+                       BCM5974_WELLSPRING_MODE_REQUEST_VALUE,
+                       BCM5974_WELLSPRING_MODE_REQUEST_INDEX, data, 8, 5000);
+
+       if (size != 8) {
+               err("bcm5974: could not read from device");
+               retval = -EIO;
+               goto out;
+       }
+
+       /* apply the mode switch */
+       data[0] = BCM5974_WELLSPRING_MODE_VENDOR_VALUE;
+
+       /* write configuration */
+       size = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
+                       BCM5974_WELLSPRING_MODE_WRITE_REQUEST_ID,
+                       USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
+                       BCM5974_WELLSPRING_MODE_REQUEST_VALUE,
+                       BCM5974_WELLSPRING_MODE_REQUEST_INDEX, data, 8, 5000);
+
+       if (size != 8) {
+               err("bcm5974: could not write to device");
+               retval = -EIO;
+               goto out;
+       }
+
+       dprintk(2, "bcm5974: switched to wellspring mode.\n");
+
+ out:
+       kfree(data);
+       return retval;
+}
+
+static void bcm5974_irq_button(struct urb *urb)
+{
+       struct bcm5974 *dev = urb->context;
+       int error;
+
+       switch (urb->status) {
+       case 0:
+               break;
+       case -EOVERFLOW:
+       case -ECONNRESET:
+       case -ENOENT:
+       case -ESHUTDOWN:
+               dbg("bcm5974: button urb shutting down: %d", urb->status);
+               return;
+       default:
+               dbg("bcm5974: button urb status: %d", urb->status);
+               goto exit;
+       }
+
+       if (report_bt_state(dev, dev->bt_urb->actual_length))
+               dprintk(1, "bcm5974: bad button package, length: %d\n",
+                       dev->bt_urb->actual_length);
+
+exit:
+       error = usb_submit_urb(dev->bt_urb, GFP_ATOMIC);
+       if (error)
+               err("bcm5974: button urb failed: %d", error);
+}
+
+static void bcm5974_irq_trackpad(struct urb *urb)
+{
+       struct bcm5974 *dev = urb->context;
+       int error;
+
+       switch (urb->status) {
+       case 0:
+               break;
+       case -EOVERFLOW:
+       case -ECONNRESET:
+       case -ENOENT:
+       case -ESHUTDOWN:
+               dbg("bcm5974: trackpad urb shutting down: %d", urb->status);
+               return;
+       default:
+               dbg("bcm5974: trackpad urb status: %d", urb->status);
+               goto exit;
+       }
+
+       /* control response ignored */
+       if (dev->tp_urb->actual_length == 2)
+               goto exit;
+
+       if (report_tp_state(dev, dev->tp_urb->actual_length))
+               dprintk(1, "bcm5974: bad trackpad package, length: %d\n",
+                       dev->tp_urb->actual_length);
+
+exit:
+       error = usb_submit_urb(dev->tp_urb, GFP_ATOMIC);
+       if (error)
+               err("bcm5974: trackpad urb failed: %d", error);
+}
+
+/*
+ * The Wellspring trackpad, like many recent Apple trackpads, share
+ * the usb device with the keyboard. Since keyboards are usually
+ * handled by the HID system, the device ends up being handled by two
+ * modules. Setting up the device therefore becomes slightly
+ * complicated. To enable multitouch features, a mode switch is
+ * required, which is usually applied via the control interface of the
+ * device.  It can be argued where this switch should take place. In
+ * some drivers, like appletouch, the switch is made during
+ * probe. However, the hid module may also alter the state of the
+ * device, resulting in trackpad malfunction under certain
+ * circumstances. To get around this problem, there is at least one
+ * example that utilizes the USB_QUIRK_RESET_RESUME quirk in order to
+ * recieve a reset_resume request rather than the normal resume.
+ * Since the implementation of reset_resume is equal to mode switch
+ * plus start_traffic, it seems easier to always do the switch when
+ * starting traffic on the device.
+ */
+static int bcm5974_start_traffic(struct bcm5974 *dev)
+{
+       if (bcm5974_wellspring_mode(dev)) {
+               dprintk(1, "bcm5974: mode switch failed\n");
+               goto error;
+       }
+
+       if (usb_submit_urb(dev->bt_urb, GFP_KERNEL))
+               goto error;
+
+       if (usb_submit_urb(dev->tp_urb, GFP_KERNEL))
+               goto err_kill_bt;
+
+       return 0;
+
+err_kill_bt:
+       usb_kill_urb(dev->bt_urb);
+error:
+       return -EIO;
+}
+
+static void bcm5974_pause_traffic(struct bcm5974 *dev)
+{
+       usb_kill_urb(dev->tp_urb);
+       usb_kill_urb(dev->bt_urb);
+}
+
+/*
+ * The code below implements open/close and manual suspend/resume.
+ * All functions may be called in random order.
+ *
+ * Opening a suspended device fails with EACCES - permission denied.
+ *
+ * Failing a resume leaves the device resumed but closed.
+ */
+static int bcm5974_open(struct input_dev *input)
+{
+       struct bcm5974 *dev = input_get_drvdata(input);
+       int error;
+
+       error = usb_autopm_get_interface(dev->intf);
+       if (error)
+               return error;
+
+       mutex_lock(&dev->pm_mutex);
+
+       error = bcm5974_start_traffic(dev);
+       if (!error)
+               dev->opened = 1;
+
+       mutex_unlock(&dev->pm_mutex);
+
+       if (error)
+               usb_autopm_put_interface(dev->intf);
+
+       return error;
+}
+
+static void bcm5974_close(struct input_dev *input)
+{
+       struct bcm5974 *dev = input_get_drvdata(input);
+
+       mutex_lock(&dev->pm_mutex);
+
+       bcm5974_pause_traffic(dev);
+       dev->opened = 0;
+
+       mutex_unlock(&dev->pm_mutex);
+
+       usb_autopm_put_interface(dev->intf);
+}
+
+static int bcm5974_suspend(struct usb_interface *iface, pm_message_t message)
+{
+       struct bcm5974 *dev = usb_get_intfdata(iface);
+
+       mutex_lock(&dev->pm_mutex);
+
+       if (dev->opened)
+               bcm5974_pause_traffic(dev);
+
+       mutex_unlock(&dev->pm_mutex);
+
+       return 0;
+}
+
+static int bcm5974_resume(struct usb_interface *iface)
+{
+       struct bcm5974 *dev = usb_get_intfdata(iface);
+       int error = 0;
+
+       mutex_lock(&dev->pm_mutex);
+
+       if (dev->opened)
+               error = bcm5974_start_traffic(dev);
+
+       mutex_unlock(&dev->pm_mutex);
+
+       return error;
+}
+
+static int bcm5974_probe(struct usb_interface *iface,
+                        const struct usb_device_id *id)
+{
+       struct usb_device *udev = interface_to_usbdev(iface);
+       const struct bcm5974_config *cfg;
+       struct bcm5974 *dev;
+       struct input_dev *input_dev;
+       int error = -ENOMEM;
+
+       /* find the product index */
+       cfg = bcm5974_get_config(udev);
+
+       /* allocate memory for our device state and initialize it */
+       dev = kzalloc(sizeof(struct bcm5974), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!dev || !input_dev) {
+               err("bcm5974: out of memory");
+               goto err_free_devs;
+       }
+
+       dev->udev = udev;
+       dev->intf = iface;
+       dev->input = input_dev;
+       dev->cfg = *cfg;
+       mutex_init(&dev->pm_mutex);
+
+       /* setup urbs */
+       dev->bt_urb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!dev->bt_urb)
+               goto err_free_devs;
+
+       dev->tp_urb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!dev->tp_urb)
+               goto err_free_bt_urb;
+
+       dev->bt_data = usb_buffer_alloc(dev->udev,
+                                       dev->cfg.bt_datalen, GFP_KERNEL,
+                                       &dev->bt_urb->transfer_dma);
+       if (!dev->bt_data)
+               goto err_free_urb;
+
+       dev->tp_data = usb_buffer_alloc(dev->udev,
+                                       dev->cfg.tp_datalen, GFP_KERNEL,
+                                       &dev->tp_urb->transfer_dma);
+       if (!dev->tp_data)
+               goto err_free_bt_buffer;
+
+       usb_fill_int_urb(dev->bt_urb, udev,
+                        usb_rcvintpipe(udev, cfg->bt_ep),
+                        dev->bt_data, dev->cfg.bt_datalen,
+                        bcm5974_irq_button, dev, 1);
+
+       usb_fill_int_urb(dev->tp_urb, udev,
+                        usb_rcvintpipe(udev, cfg->tp_ep),
+                        dev->tp_data, dev->cfg.tp_datalen,
+                        bcm5974_irq_trackpad, dev, 1);
+
+       /* create bcm5974 device */
+       usb_make_path(udev, dev->phys, sizeof(dev->phys));
+       strlcat(dev->phys, "/input0", sizeof(dev->phys));
+
+       input_dev->name = "bcm5974";
+       input_dev->phys = dev->phys;
+       usb_to_input_id(dev->udev, &input_dev->id);
+       input_dev->dev.parent = &iface->dev;
+
+       input_set_drvdata(input_dev, dev);
+
+       input_dev->open = bcm5974_open;
+       input_dev->close = bcm5974_close;
+
+       setup_events_to_report(input_dev, cfg);
+
+       error = input_register_device(dev->input);
+       if (error)
+               goto err_free_buffer;
+
+       /* save our data pointer in this interface device */
+       usb_set_intfdata(iface, dev);
+
+       return 0;
+
+err_free_buffer:
+       usb_buffer_free(dev->udev, dev->cfg.tp_datalen,
+               dev->tp_data, dev->tp_urb->transfer_dma);
+err_free_bt_buffer:
+       usb_buffer_free(dev->udev, dev->cfg.bt_datalen,
+               dev->bt_data, dev->bt_urb->transfer_dma);
+err_free_urb:
+       usb_free_urb(dev->tp_urb);
+err_free_bt_urb:
+       usb_free_urb(dev->bt_urb);
+err_free_devs:
+       usb_set_intfdata(iface, NULL);
+       input_free_device(input_dev);
+       kfree(dev);
+       return error;
+}
+
+static void bcm5974_disconnect(struct usb_interface *iface)
+{
+       struct bcm5974 *dev = usb_get_intfdata(iface);
+
+       usb_set_intfdata(iface, NULL);
+
+       input_unregister_device(dev->input);
+       usb_buffer_free(dev->udev, dev->cfg.tp_datalen,
+                       dev->tp_data, dev->tp_urb->transfer_dma);
+       usb_buffer_free(dev->udev, dev->cfg.bt_datalen,
+                       dev->bt_data, dev->bt_urb->transfer_dma);
+       usb_free_urb(dev->tp_urb);
+       usb_free_urb(dev->bt_urb);
+       kfree(dev);
+}
+
+static struct usb_driver bcm5974_driver = {
+       .name                   = "bcm5974",
+       .probe                  = bcm5974_probe,
+       .disconnect             = bcm5974_disconnect,
+       .suspend                = bcm5974_suspend,
+       .resume                 = bcm5974_resume,
+       .reset_resume           = bcm5974_resume,
+       .id_table               = bcm5974_table,
+       .supports_autosuspend   = 1,
+};
+
+static int __init bcm5974_init(void)
+{
+       return usb_register(&bcm5974_driver);
+}
+
+static void __exit bcm5974_exit(void)
+{
+       usb_deregister(&bcm5974_driver);
+}
+
+module_init(bcm5974_init);
+module_exit(bcm5974_exit);
+
index 3392901848711f4f5053b4d042387ce5d69a2611..72cf5e33790ea6e0541b7e351e53e2cf03803bd4 100644 (file)
@@ -9,7 +9,6 @@
  */
 
 #include <linux/init.h>
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/input-polldev.h>
index fe732a574ec2c5774d729248c1ba2a6e3470a00d..3282b741e2460ed20d30ef4fd3a5f655fc228f5c 100644 (file)
@@ -394,6 +394,13 @@ static struct dmi_system_id __initdata i8042_dmi_dritek_table[] = {
                        DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"),
                },
        },
+       {
+               .ident = "Acer TravelMate 4280",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"),
+               },
+       },
        { }
 };
 
index 0ed044d5e685790ea8a96a051fa279b1747a1f91..765007899d9a87b759defaee46f49dc5647d5867 100644 (file)
@@ -269,8 +269,8 @@ static int xps2_setup(struct device *dev, struct resource *regs_res,
         * we have the PS2 in a good state */
        out_be32(drvdata->base_address + XPS2_SRST_OFFSET, XPS2_SRST_RESET);
 
-       dev_info(dev, "Xilinx PS2 at 0x%08X mapped to 0x%08X, irq=%d\n",
-               drvdata->phys_addr, (u32)drvdata->base_address, drvdata->irq);
+       dev_info(dev, "Xilinx PS2 at 0x%08X mapped to 0x%p, irq=%d\n",
+               drvdata->phys_addr, drvdata->base_address, drvdata->irq);
 
        serio = &drvdata->serio;
        serio->id.type = SERIO_8042;
index b9b7a98bc5a5b49a450d46b4a94fcc6f8037ee89..7df0228e836e1dff3c679f9009b66bece3fe1558 100644 (file)
@@ -64,7 +64,6 @@ Scott Hill shill@gtcocalcomp.com
 #include <asm/byteorder.h>
 
 
-#include <linux/version.h>
 #include <linux/usb/input.h>
 
 /* Version with a Major number of 2 is for kernel inclusion only. */
index 6e60a97a234c108540d68ca9ddedf22167b4318e..25287e80e236727f70bffef85bc0a6d782c44543 100644 (file)
@@ -249,29 +249,26 @@ config TOUCHSCREEN_WM97XX
 config TOUCHSCREEN_WM9705
        bool "WM9705 Touchscreen interface support"
        depends on TOUCHSCREEN_WM97XX
+       default y
        help
-         Say Y here if you have a Wolfson Microelectronics WM9705
-         touchscreen controller connected to your system.
-
-         If unsure, say N.
+         Say Y here to enable support for the Wolfson Microelectronics
+         WM9705 touchscreen controller.
 
 config TOUCHSCREEN_WM9712
        bool "WM9712 Touchscreen interface support"
        depends on TOUCHSCREEN_WM97XX
+       default y
        help
-         Say Y here if you have a Wolfson Microelectronics WM9712
-         touchscreen controller connected to your system.
-
-         If unsure, say N.
+         Say Y here to enable support for the Wolfson Microelectronics
+         WM9712 touchscreen controller.
 
 config TOUCHSCREEN_WM9713
        bool "WM9713 Touchscreen interface support"
        depends on TOUCHSCREEN_WM97XX
+       default y
        help
-         Say Y here if you have a Wolfson Microelectronics WM9713 touchscreen
-         controller connected to your system.
-
-         If unsure, say N.
+         Say Y here to enable support for the Wolfson Microelectronics
+         WM9713 touchscreen controller.
 
 config TOUCHSCREEN_WM97XX_MAINSTONE
        tristate "WM97xx Mainstone accelerated touch"
index c1cd99d589810de0c03387a6af4f89fdf0f40c86..504ca11749a1896e35b489bfba4bdc6747c57e71 100644 (file)
@@ -173,7 +173,7 @@ static int migor_ts_probe(struct i2c_client *client,
        input_set_abs_params(input, ABS_X, 95, 955, 0, 0);
        input_set_abs_params(input, ABS_Y, 85, 935, 0, 0);
 
-       input->name = client->driver_name;
+       input->name = client->name;
        input->id.bustype = BUS_I2C;
        input->dev.parent = &client->dev;
 
@@ -192,7 +192,7 @@ static int migor_ts_probe(struct i2c_client *client,
                goto err1;
 
        error = request_irq(priv->irq, migor_ts_isr, IRQF_TRIGGER_LOW,
-                           client->driver_name, priv);
+                           client->name, priv);
        if (error) {
                dev_err(&client->dev, "Unable to request touchscreen IRQ.\n");
                goto err2;
@@ -224,12 +224,19 @@ static int migor_ts_remove(struct i2c_client *client)
        return 0;
 }
 
+static const struct i2c_device_id migor_ts_id[] = {
+       { "migor_ts", 0 },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, migor_ts);
+
 static struct i2c_driver migor_ts_driver = {
        .driver = {
                .name = "migor_ts",
        },
        .probe = migor_ts_probe,
        .remove = migor_ts_remove,
+       .id_table = migor_ts_id,
 };
 
 static int __init migor_ts_init(void)
index 978e1a13ffc7437c3dec7b0917227b1440dd07d2..372efbc694ffbf7ebe71e96decefd71060e6d7c8 100644 (file)
@@ -17,7 +17,6 @@
 
 #include <linux/module.h>
 #include <linux/moduleparam.h>
-#include <linux/version.h>
 #include <linux/kernel.h>
 #include <linux/input.h>
 #include <linux/delay.h>
index 4c5d85a249aeceb6edc7d59506618bbe5dc22807..c8bb1e7335fcf8f9450c0be194cafc9f014d03fb 100644 (file)
@@ -17,7 +17,6 @@
 
 #include <linux/module.h>
 #include <linux/moduleparam.h>
-#include <linux/version.h>
 #include <linux/kernel.h>
 #include <linux/input.h>
 #include <linux/delay.h>
index 838458792ea0dc6924676ac6448573d6270da871..781ee83547e68374eba1f253a016a26435135e27 100644 (file)
@@ -17,7 +17,6 @@
 
 #include <linux/module.h>
 #include <linux/moduleparam.h>
-#include <linux/version.h>
 #include <linux/kernel.h>
 #include <linux/input.h>
 #include <linux/delay.h>
index cdc24ad314e0b7478b0a6cdde46362e335974a3c..d589ab0e3adc41c0b75eb55c645937afdcdef843 100644 (file)
@@ -37,7 +37,6 @@
 
 #include <linux/module.h>
 #include <linux/moduleparam.h>
-#include <linux/version.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/delay.h>
index c7aae66c6f9bc55386aea5a57db74b78ca27dd30..8cfadc5bd2ba54f858c8f28c8f17c5db40942891 100644 (file)
@@ -2393,6 +2393,8 @@ static void analyze_sbs(mddev_t * mddev)
 
 }
 
+static void md_safemode_timeout(unsigned long data);
+
 static ssize_t
 safe_delay_show(mddev_t *mddev, char *page)
 {
@@ -2432,9 +2434,12 @@ safe_delay_store(mddev_t *mddev, const char *cbuf, size_t len)
        if (msec == 0)
                mddev->safemode_delay = 0;
        else {
+               unsigned long old_delay = mddev->safemode_delay;
                mddev->safemode_delay = (msec*HZ)/1000;
                if (mddev->safemode_delay == 0)
                        mddev->safemode_delay = 1;
+               if (mddev->safemode_delay < old_delay)
+                       md_safemode_timeout((unsigned long)mddev);
        }
        return len;
 }
@@ -4634,6 +4639,11 @@ static int update_size(mddev_t *mddev, sector_t num_sectors)
         */
        if (mddev->sync_thread)
                return -EBUSY;
+       if (mddev->bitmap)
+               /* Sorry, cannot grow a bitmap yet, just remove it,
+                * grow, and re-add.
+                */
+               return -EBUSY;
        rdev_for_each(rdev, tmp, mddev) {
                sector_t avail;
                avail = rdev->size * 2;
@@ -5993,7 +6003,7 @@ static int remove_and_add_spares(mddev_t *mddev)
                        }
                }
 
-       if (mddev->degraded) {
+       if (mddev->degraded && ! mddev->ro) {
                rdev_for_each(rdev, rtmp, mddev) {
                        if (rdev->raid_disk >= 0 &&
                            !test_bit(In_sync, &rdev->flags) &&
@@ -6067,6 +6077,8 @@ void md_check_recovery(mddev_t *mddev)
                flush_signals(current);
        }
 
+       if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
+               return;
        if ( ! (
                (mddev->flags && !mddev->external) ||
                test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||
@@ -6080,6 +6092,15 @@ void md_check_recovery(mddev_t *mddev)
        if (mddev_trylock(mddev)) {
                int spares = 0;
 
+               if (mddev->ro) {
+                       /* Only thing we do on a ro array is remove
+                        * failed devices.
+                        */
+                       remove_and_add_spares(mddev);
+                       clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
+                       goto unlock;
+               }
+
                if (!mddev->external) {
                        int did_change = 0;
                        spin_lock_irq(&mddev->write_lock);
@@ -6117,7 +6138,8 @@ void md_check_recovery(mddev_t *mddev)
                        /* resync has finished, collect result */
                        md_unregister_thread(mddev->sync_thread);
                        mddev->sync_thread = NULL;
-                       if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
+                       if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) &&
+                           !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
                                /* success...*/
                                /* activate any spares */
                                if (mddev->pers->spare_active(mddev))
@@ -6169,6 +6191,7 @@ void md_check_recovery(mddev_t *mddev)
                } else if ((spares = remove_and_add_spares(mddev))) {
                        clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
                        clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
+                       clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
                        set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
                } else if (mddev->recovery_cp < MaxSector) {
                        set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
@@ -6232,7 +6255,11 @@ static int md_notify_reboot(struct notifier_block *this,
 
                for_each_mddev(mddev, tmp)
                        if (mddev_trylock(mddev)) {
-                               do_md_stop (mddev, 1, 0);
+                               /* Force a switch to readonly even array
+                                * appears to still be in use.  Hence
+                                * the '100'.
+                                */
+                               do_md_stop (mddev, 1, 100);
                                mddev_unlock(mddev);
                        }
                /*
index d41bebb6da0fb719aff854112567249ed597d73e..e34cd0e6247385f5827d7232ae4257c664f47c7b 100644 (file)
@@ -76,11 +76,13 @@ static void r10bio_pool_free(void *r10_bio, void *data)
        kfree(r10_bio);
 }
 
+/* Maximum size of each resync request */
 #define RESYNC_BLOCK_SIZE (64*1024)
-//#define RESYNC_BLOCK_SIZE PAGE_SIZE
-#define RESYNC_SECTORS (RESYNC_BLOCK_SIZE >> 9)
 #define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE)
-#define RESYNC_WINDOW (2048*1024)
+/* amount of memory to reserve for resync requests */
+#define RESYNC_WINDOW (1024*1024)
+/* maximum number of concurrent requests, memory permitting */
+#define RESYNC_DEPTH (32*1024*1024/RESYNC_BLOCK_SIZE)
 
 /*
  * When performing a resync, we need to read and compare, so
@@ -690,7 +692,6 @@ static int flush_pending_writes(conf_t *conf)
  *    there is no normal IO happeing.  It must arrange to call
  *    lower_barrier when the particular background IO completes.
  */
-#define RESYNC_DEPTH 32
 
 static void raise_barrier(conf_t *conf, int force)
 {
index 40e9396756573c204b50dee7bdd9517f57f9dab0..224de022e7c5d6574cf46747947b3c9e326c8632 100644 (file)
@@ -2568,10 +2568,10 @@ static bool handle_stripe5(struct stripe_head *sh)
                if (dev->written)
                        s.written++;
                rdev = rcu_dereference(conf->disks[i].rdev);
-               if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) {
+               if (blocked_rdev == NULL &&
+                   rdev && unlikely(test_bit(Blocked, &rdev->flags))) {
                        blocked_rdev = rdev;
                        atomic_inc(&rdev->nr_pending);
-                       break;
                }
                if (!rdev || !test_bit(In_sync, &rdev->flags)) {
                        /* The ReadError flag will just be confusing now */
@@ -2588,8 +2588,14 @@ static bool handle_stripe5(struct stripe_head *sh)
        rcu_read_unlock();
 
        if (unlikely(blocked_rdev)) {
-               set_bit(STRIPE_HANDLE, &sh->state);
-               goto unlock;
+               if (s.syncing || s.expanding || s.expanded ||
+                   s.to_write || s.written) {
+                       set_bit(STRIPE_HANDLE, &sh->state);
+                       goto unlock;
+               }
+               /* There is nothing for the blocked_rdev to block */
+               rdev_dec_pending(blocked_rdev, conf->mddev);
+               blocked_rdev = NULL;
        }
 
        if (s.to_fill && !test_bit(STRIPE_BIOFILL_RUN, &sh->state)) {
@@ -2832,10 +2838,10 @@ static bool handle_stripe6(struct stripe_head *sh, struct page *tmp_page)
                if (dev->written)
                        s.written++;
                rdev = rcu_dereference(conf->disks[i].rdev);
-               if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) {
+               if (blocked_rdev == NULL &&
+                   rdev && unlikely(test_bit(Blocked, &rdev->flags))) {
                        blocked_rdev = rdev;
                        atomic_inc(&rdev->nr_pending);
-                       break;
                }
                if (!rdev || !test_bit(In_sync, &rdev->flags)) {
                        /* The ReadError flag will just be confusing now */
@@ -2853,9 +2859,16 @@ static bool handle_stripe6(struct stripe_head *sh, struct page *tmp_page)
        rcu_read_unlock();
 
        if (unlikely(blocked_rdev)) {
-               set_bit(STRIPE_HANDLE, &sh->state);
-               goto unlock;
+               if (s.syncing || s.expanding || s.expanded ||
+                   s.to_write || s.written) {
+                       set_bit(STRIPE_HANDLE, &sh->state);
+                       goto unlock;
+               }
+               /* There is nothing for the blocked_rdev to block */
+               rdev_dec_pending(blocked_rdev, conf->mddev);
+               blocked_rdev = NULL;
        }
+
        pr_debug("locked=%d uptodate=%d to_read=%d"
               " to_write=%d failed=%d failed_num=%d,%d\n",
               s.locked, s.uptodate, s.to_read, s.to_write, s.failed,
@@ -4446,6 +4459,9 @@ static int raid5_check_reshape(mddev_t *mddev)
                return -EINVAL; /* Cannot shrink array or change level yet */
        if (mddev->delta_disks == 0)
                return 0; /* nothing to do */
+       if (mddev->bitmap)
+               /* Cannot grow a bitmap yet */
+               return -EBUSY;
 
        /* Can only proceed if there are plenty of stripe_heads.
         * We need a minimum of one full stripe,, and for sensible progress
index e7a3fe508dff00c9cd9d0e8db8a5227e487f3737..b2d9878dc3f0ea606896c356ced7d942acef2106 100644 (file)
@@ -803,11 +803,30 @@ static acpi_status get_u32(u32 *value, u32 cap)
 
 static acpi_status set_u32(u32 value, u32 cap)
 {
+       acpi_status status;
+
        if (interface->capability & cap) {
                switch (interface->type) {
                case ACER_AMW0:
                        return AMW0_set_u32(value, cap, interface);
                case ACER_AMW0_V2:
+                       if (cap == ACER_CAP_MAILLED)
+                               return AMW0_set_u32(value, cap, interface);
+
+                       /*
+                        * On some models, some WMID methods don't toggle
+                        * properly. For those cases, we want to run the AMW0
+                        * method afterwards to be certain we've really toggled
+                        * the device state.
+                        */
+                       if (cap == ACER_CAP_WIRELESS ||
+                               cap == ACER_CAP_BLUETOOTH) {
+                               status = WMID_set_u32(value, cap, interface);
+                               if (ACPI_FAILURE(status))
+                                       return status;
+
+                               return AMW0_set_u32(value, cap, interface);
+                       }
                case ACER_WMID:
                        return WMID_set_u32(value, cap, interface);
                default:
index 9e8d79e7e9f4cb4b105840ce71420e435820edd5..facdb9893c84c322dbb65f47e2a7bf8de3c69685 100644 (file)
@@ -553,9 +553,9 @@ static void eeepc_hwmon_exit(void)
        hwmon = eeepc_hwmon_device;
        if (!hwmon)
                return ;
-       hwmon_device_unregister(hwmon);
        sysfs_remove_group(&hwmon->kobj,
                           &hwmon_attribute_group);
+       hwmon_device_unregister(hwmon);
        eeepc_hwmon_device = NULL;
 }
 
index 7c994e1ae2769a4adf3c9c50c1f84544292e0584..ae16d845d7463aca1c0c1841ff029be8f1cc8075 100644 (file)
@@ -595,8 +595,9 @@ static irqreturn_t s3cmci_irq_cd(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-void s3cmci_dma_done_callback(struct s3c2410_dma_chan *dma_ch, void *buf_id,
-                             int size, enum s3c2410_dma_buffresult result)
+static void s3cmci_dma_done_callback(struct s3c2410_dma_chan *dma_ch,
+                                    void *buf_id, int size,
+                                    enum s3c2410_dma_buffresult result)
 {
        struct s3cmci_host *host = buf_id;
        unsigned long iflags;
@@ -740,8 +741,8 @@ request_done:
        mmc_request_done(host->mmc, mrq);
 }
 
-
-void s3cmci_dma_setup(struct s3cmci_host *host, enum s3c2410_dmasrc source)
+static void s3cmci_dma_setup(struct s3cmci_host *host,
+                            enum s3c2410_dmasrc source)
 {
        static enum s3c2410_dmasrc last_source = -1;
        static int setup_ok;
@@ -1003,8 +1004,9 @@ static void s3cmci_send_request(struct mmc_host *mmc)
        enable_irq(host->irq);
 }
 
-static int s3cmci_card_present(struct s3cmci_host *host)
+static int s3cmci_card_present(struct mmc_host *mmc)
 {
+       struct s3cmci_host *host = mmc_priv(mmc);
        struct s3c24xx_mci_pdata *pdata = host->pdata;
        int ret;
 
@@ -1023,7 +1025,7 @@ static void s3cmci_request(struct mmc_host *mmc, struct mmc_request *mrq)
        host->cmd_is_stop = 0;
        host->mrq = mrq;
 
-       if (s3cmci_card_present(host) == 0) {
+       if (s3cmci_card_present(mmc) == 0) {
                dbg(host, dbg_err, "%s: no medium present\n", __func__);
                host->mrq->cmd->error = -ENOMEDIUM;
                mmc_request_done(mmc, mrq);
@@ -1138,6 +1140,7 @@ static struct mmc_host_ops s3cmci_ops = {
        .request        = s3cmci_request,
        .set_ios        = s3cmci_set_ios,
        .get_ro         = s3cmci_get_ro,
+       .get_cd         = s3cmci_card_present,
 };
 
 static struct s3c24xx_mci_pdata s3cmci_def_pdata = {
@@ -1206,7 +1209,7 @@ static int __devinit s3cmci_probe(struct platform_device *pdev, int is2440)
        }
 
        host->base = ioremap(host->mem->start, RESSIZE(host->mem));
-       if (host->base == 0) {
+       if (!host->base) {
                dev_err(&pdev->dev, "failed to ioremap() io memory region.\n");
                ret = -EINVAL;
                goto probe_free_mem_region;
index f99e9f721629b0cd2bda5cde25cdd1a834572113..1df44d966bdb927dc7bc7da7ff1ef5b1ee27a05e 100644 (file)
@@ -29,7 +29,6 @@
 #include <linux/pci.h>
 #include <linux/ioport.h>
 #include <linux/scatterlist.h>
-#include <linux/version.h>
 
 #include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
index 64002488c6eeff76b977c7a128fb2000233ecd2c..917cf8d3ae9561c5e4e1559758b46efb89d466d2 100644 (file)
@@ -19,7 +19,7 @@
 #include <asm/io.h>
 #include <asm/sizes.h>
 #include <mach/hardware.h>
-#include <asm/plat-orion/orion_nand.h>
+#include <plat/orion_nand.h>
 
 #ifdef CONFIG_MTD_CMDLINE_PARTS
 static const char *part_probes[] = { "cmdlinepart", NULL };
index 9931b5ab59cdd991fce206b39e5e4fe16b1e56cf..45bdf0b339bb55f0aa132b2256385014079a8731 100644 (file)
@@ -300,6 +300,19 @@ config LIBERTAS_DEBUG
        ---help---
          Debugging support.
 
+config LIBERTAS_THINFIRM
+       tristate "Marvell 8xxx Libertas WLAN driver support with thin firmware"
+       depends on WLAN_80211 && MAC80211
+       select FW_LOADER
+       ---help---
+         A library for Marvell Libertas 8xxx devices using thinfirm.
+
+config LIBERTAS_THINFIRM_USB
+       tristate "Marvell Libertas 8388 USB 802.11b/g cards with thin firmware"
+       depends on LIBERTAS_THINFIRM && USB
+       ---help---
+         A driver for Marvell Libertas 8388 USB devices using thinfirm.
+
 config AIRO
        tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards"
        depends on ISA_DMA_API && WLAN_80211 && (PCI || BROKEN)
@@ -322,6 +335,9 @@ config HERMES
        tristate "Hermes chipset 802.11b support (Orinoco/Prism2/Symbol)"
        depends on (PPC_PMAC || PCI || PCMCIA) && WLAN_80211
        select WIRELESS_EXT
+       select FW_LOADER
+       select CRYPTO
+       select CRYPTO_MICHAEL_MIC
        ---help---
          A driver for 802.11b wireless cards based on the "Hermes" or
          Intersil HFA384x (Prism 2) MAC controller.  This includes the vast
@@ -411,7 +427,6 @@ config PCMCIA_HERMES
 config PCMCIA_SPECTRUM
        tristate "Symbol Spectrum24 Trilogy PCMCIA card support"
        depends on PCMCIA && HERMES
-       select FW_LOADER
        ---help---
 
          This is a driver for 802.11b cards using RAM-loadable Symbol
index 59aa89ec6e81cc9f22f77fa2eca79d8257ae9d92..59d2d805f60b4591b1332944b51ac7cf380b5006 100644 (file)
@@ -16,7 +16,7 @@ obj-$(CONFIG_WAVELAN)         += wavelan.o
 obj-$(CONFIG_PCMCIA_NETWAVE)   += netwave_cs.o
 obj-$(CONFIG_PCMCIA_WAVELAN)   += wavelan_cs.o
 
-obj-$(CONFIG_HERMES)           += orinoco.o hermes.o
+obj-$(CONFIG_HERMES)           += orinoco.o hermes.o hermes_dld.o
 obj-$(CONFIG_PCMCIA_HERMES)    += orinoco_cs.o
 obj-$(CONFIG_APPLE_AIRPORT)    += airport.o
 obj-$(CONFIG_PLX_HERMES)       += orinoco_plx.o
@@ -48,6 +48,8 @@ obj-$(CONFIG_USB_NET_RNDIS_WLAN)      += rndis_wlan.o
 obj-$(CONFIG_USB_ZD1201)       += zd1201.o
 obj-$(CONFIG_LIBERTAS)         += libertas/
 
+obj-$(CONFIG_LIBERTAS_THINFIRM)        += libertas_tf/
+
 rtl8180-objs           := rtl8180_dev.o rtl8180_rtl8225.o rtl8180_sa2400.o rtl8180_max2820.o rtl8180_grf5101.o
 rtl8187-objs           := rtl8187_dev.o rtl8187_rtl8225.o
 
index b5cd850a4a59e8995c68bfa80717614515531e69..ae58a12befd349a2e8445fcf2f20324395cf921b 100644 (file)
@@ -1915,7 +1915,7 @@ static int mpi_start_xmit(struct sk_buff *skb, struct net_device *dev) {
        struct airo_info *ai = dev->priv;
 
        if (!skb) {
-               airo_print_err(dev->name, "%s: skb == NULL!",__FUNCTION__);
+               airo_print_err(dev->name, "%s: skb == NULL!",__func__);
                return 0;
        }
        npacks = skb_queue_len (&ai->txq);
@@ -1964,7 +1964,7 @@ static int mpi_send_packet (struct net_device *dev)
        if ((skb = skb_dequeue(&ai->txq)) == NULL) {
                airo_print_err(dev->name,
                        "%s: Dequeue'd zero in send_packet()",
-                       __FUNCTION__);
+                       __func__);
                return 0;
        }
 
@@ -2115,7 +2115,7 @@ static int airo_start_xmit(struct sk_buff *skb, struct net_device *dev) {
        u32 *fids = priv->fids;
 
        if ( skb == NULL ) {
-               airo_print_err(dev->name, "%s: skb == NULL!", __FUNCTION__);
+               airo_print_err(dev->name, "%s: skb == NULL!", __func__);
                return 0;
        }
 
@@ -2186,7 +2186,7 @@ static int airo_start_xmit11(struct sk_buff *skb, struct net_device *dev) {
        }
 
        if ( skb == NULL ) {
-               airo_print_err(dev->name, "%s: skb == NULL!", __FUNCTION__);
+               airo_print_err(dev->name, "%s: skb == NULL!", __func__);
                return 0;
        }
 
@@ -4127,7 +4127,7 @@ static int PC4500_writerid(struct airo_info *ai, u16 rid,
                if (test_bit(FLAG_ENABLED, &ai->flags) && (RID_WEP_TEMP != rid))
                        airo_print_err(ai->dev->name,
                                "%s: MAC should be disabled (rid=%04x)",
-                               __FUNCTION__, rid);
+                               __func__, rid);
                memset(&cmd, 0, sizeof(cmd));
                memset(&rsp, 0, sizeof(rsp));
 
@@ -4142,7 +4142,7 @@ static int PC4500_writerid(struct airo_info *ai, u16 rid,
                        &ai->config_desc.rid_desc, sizeof(Rid));
 
                if (len < 4 || len > 2047) {
-                       airo_print_err(ai->dev->name, "%s: len=%d", __FUNCTION__, len);
+                       airo_print_err(ai->dev->name, "%s: len=%d", __func__, len);
                        rc = -1;
                } else {
                        memcpy((char *)ai->config_desc.virtual_host_addr,
@@ -4151,9 +4151,9 @@ static int PC4500_writerid(struct airo_info *ai, u16 rid,
                        rc = issuecommand(ai, &cmd, &rsp);
                        if ((rc & 0xff00) != 0) {
                                airo_print_err(ai->dev->name, "%s: Write rid Error %d",
-                                               __FUNCTION__, rc);
+                                               __func__, rc);
                                airo_print_err(ai->dev->name, "%s: Cmd=%04x",
-                                               __FUNCTION__, cmd.cmd);
+                                               __func__, cmd.cmd);
                        }
 
                        if ((rsp.status & 0x7f00))
index 6f7eb9f59223b43ccdd25b4b6d60e7906a054eaa..ce03a2e865fabafbc6b04b0eee3022a4a6b1a20d 100644 (file)
@@ -180,7 +180,8 @@ airport_attach(struct macio_dev *mdev, const struct of_device_id *match)
        }
 
        /* Allocate space for private device-specific data */
-       dev = alloc_orinocodev(sizeof(*card), airport_hard_reset);
+       dev = alloc_orinocodev(sizeof(*card), &mdev->ofdev.dev,
+                              airport_hard_reset, NULL);
        if (! dev) {
                printk(KERN_ERR PFX "Cannot allocate network device\n");
                return -ENODEV;
index 9102eea3c8bf783208400425618d2f6419e97ca2..c1b49787366870d47329f525420a2c25bc8a269a 100644 (file)
@@ -271,11 +271,6 @@ enum ath5k_driver_mode {
 /* adding this flag to rate_code enables short preamble, see ar5212_reg.h */
 #define AR5K_SET_SHORT_PREAMBLE 0x04
 
-#define HAS_SHPREAMBLE(_ix) \
-       (rt->rates[_ix].modulation == IEEE80211_RATE_SHORT_PREAMBLE)
-#define SHPREAMBLE_FLAG(_ix) \
-       (HAS_SHPREAMBLE(_ix) ? AR5K_SET_SHORT_PREAMBLE : 0)
-
 
 /****************\
   TX DEFINITIONS
@@ -568,152 +563,61 @@ struct ath5k_athchan_2ghz {
        u16     a2_athchan;
 };
 
+
 /*
  * Rate definitions
- * TODO: Clean them up or move them on mac80211 -most of these infos are
- *      used by the rate control algorytm on MadWiFi.
  */
 
-/* Max number of rates on the rate table and what it seems
- * Atheros hardware supports */
-#define AR5K_MAX_RATES 32
-
 /**
- * struct ath5k_rate - rate structure
- * @valid: is this a valid rate for rate control (remove)
- * @modulation: respective mac80211 modulation
- * @rate_kbps: rate in kbit/s
- * @rate_code: hardware rate value, used in &struct ath5k_desc, on RX on
- *     &struct ath5k_rx_status.rs_rate and on TX on
- *     &struct ath5k_tx_status.ts_rate. Seems the ar5xxx harware supports
- *     up to 32 rates, indexed by 1-32. This means we really only need
- *     6 bits for the rate_code.
- * @dot11_rate: respective IEEE-802.11 rate value
- * @control_rate: index of rate assumed to be used to send control frames.
- *     This can be used to set override the value on the rate duration
- *     registers. This is only useful if we can override in the harware at
- *     what rate we want to send control frames at. Note that IEEE-802.11
- *     Ch. 9.6 (after IEEE 802.11g changes) defines the rate at which we
- *     should send ACK/CTS, if we change this value we can be breaking
- *     the spec.
+ * Seems the ar5xxx harware supports up to 32 rates, indexed by 1-32.
  *
- * This structure is used to get the RX rate or set the TX rate on the
+ * The rate code is used to get the RX rate or set the TX rate on the
  * hardware descriptors. It is also used for internal modulation control
  * and settings.
  *
- * On RX after the &struct ath5k_desc is parsed by the appropriate
- * ah_proc_rx_desc() the respective hardware rate value is set in
- * &struct ath5k_rx_status.rs_rate. On TX the desired rate is set in
- * &struct ath5k_tx_status.ts_rate which is later used to setup the
- * &struct ath5k_desc correctly. This is the hardware rate map we are
- * aware of:
+ * This is the hardware rate map we are aware of:
  *
- * rate_code   1       2       3       4       5       6       7       8
+ * rate_code   0x01    0x02    0x03    0x04    0x05    0x06    0x07    0x08
  * rate_kbps   3000    1000    ?       ?       ?       2000    500     48000
  *
- * rate_code   9       10      11      12      13      14      15      16
+ * rate_code   0x09    0x0A    0x0B    0x0C    0x0D    0x0E    0x0F    0x10
  * rate_kbps   24000   12000   6000    54000   36000   18000   9000    ?
  *
  * rate_code   17      18      19      20      21      22      23      24
  * rate_kbps   ?       ?       ?       ?       ?       ?       ?       11000
  *
  * rate_code   25      26      27      28      29      30      31      32
- * rate_kbps   5500    2000    1000    ?       ?       ?       ?       ?
+ * rate_kbps   5500    2000    1000    11000S  5500S   2000S   ?       ?
  *
+ * "S" indicates CCK rates with short preamble.
+ *
+ * AR5211 has different rate codes for CCK (802.11B) rates. It only uses the
+ * lowest 4 bits, so they are the same as below with a 0xF mask.
+ * (0xB, 0xA, 0x9 and 0x8 for 1M, 2M, 5.5M and 11M).
+ * We handle this in ath5k_setup_bands().
  */
-struct ath5k_rate {
-       u8      valid;
-       u32     modulation;
-       u16     rate_kbps;
-       u8      rate_code;
-       u8      dot11_rate;
-       u8      control_rate;
-};
-
-/* XXX: GRR all this stuff to get leds blinking ??? (check out setcurmode) */
-struct ath5k_rate_table {
-       u16     rate_count;
-       u8      rate_code_to_index[AR5K_MAX_RATES];     /* Back-mapping */
-       struct ath5k_rate rates[AR5K_MAX_RATES];
-};
-
-/*
- * Rate tables...
- * TODO: CLEAN THIS !!!
- */
-#define AR5K_RATES_11A { 8, {                                  \
-       255, 255, 255, 255, 255, 255, 255, 255, 6, 4, 2, 0,     \
-       7, 5, 3, 1, 255, 255, 255, 255, 255, 255, 255, 255,     \
-       255, 255, 255, 255, 255, 255, 255, 255 }, {             \
-       { 1, 0, 6000, 11, 140, 0 },             \
-       { 1, 0, 9000, 15, 18, 0 },              \
-       { 1, 0, 12000, 10, 152, 2 },            \
-       { 1, 0, 18000, 14, 36, 2 },             \
-       { 1, 0, 24000, 9, 176, 4 },             \
-       { 1, 0, 36000, 13, 72, 4 },             \
-       { 1, 0, 48000, 8, 96, 4 },              \
-       { 1, 0, 54000, 12, 108, 4 } }           \
-}
-
-#define AR5K_RATES_11B { 4, {                                          \
-       255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,     \
-       255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,     \
-       3, 2, 1, 0, 255, 255, 255, 255 }, {                             \
-       { 1, 0, 1000, 27, 130, 0 },     \
-       { 1, IEEE80211_RATE_SHORT_PREAMBLE, 2000, 26, 132, 1 }, \
-       { 1, IEEE80211_RATE_SHORT_PREAMBLE, 5500, 25, 139, 1 }, \
-       { 1, IEEE80211_RATE_SHORT_PREAMBLE, 11000, 24, 150, 1 } }       \
-}
-
-#define AR5K_RATES_11G { 12, {                                 \
-       255, 255, 255, 255, 255, 255, 255, 255, 10, 8, 6, 4,    \
-       11, 9, 7, 5, 255, 255, 255, 255, 255, 255, 255, 255,    \
-       3, 2, 1, 0, 255, 255, 255, 255 }, {                     \
-       { 1, 0, 1000, 27, 2, 0 },               \
-       { 1, IEEE80211_RATE_SHORT_PREAMBLE, 2000, 26, 4, 1 },           \
-       { 1, IEEE80211_RATE_SHORT_PREAMBLE, 5500, 25, 11, 1 },          \
-       { 1, IEEE80211_RATE_SHORT_PREAMBLE, 11000, 24, 22, 1 }, \
-       { 0, 0, 6000, 11, 12, 4 },      \
-       { 0, 0, 9000, 15, 18, 4 },      \
-       { 1, 0, 12000, 10, 24, 6 },     \
-       { 1, 0, 18000, 14, 36, 6 },     \
-       { 1, 0, 24000, 9, 48, 8 },      \
-       { 1, 0, 36000, 13, 72, 8 },     \
-       { 1, 0, 48000, 8, 96, 8 },      \
-       { 1, 0, 54000, 12, 108, 8 } }   \
-}
+#define AR5K_MAX_RATES 32
 
-#define AR5K_RATES_TURBO { 8, {                                        \
-       255, 255, 255, 255, 255, 255, 255, 255, 6, 4, 2, 0,     \
-       7, 5, 3, 1, 255, 255, 255, 255, 255, 255, 255, 255,     \
-       255, 255, 255, 255, 255, 255, 255, 255 }, {             \
-       { 1, MODULATION_TURBO, 6000, 11, 140, 0 },      \
-       { 1, MODULATION_TURBO, 9000, 15, 18, 0 },       \
-       { 1, MODULATION_TURBO, 12000, 10, 152, 2 },     \
-       { 1, MODULATION_TURBO, 18000, 14, 36, 2 },      \
-       { 1, MODULATION_TURBO, 24000, 9, 176, 4 },      \
-       { 1, MODULATION_TURBO, 36000, 13, 72, 4 },      \
-       { 1, MODULATION_TURBO, 48000, 8, 96, 4 },       \
-       { 1, MODULATION_TURBO, 54000, 12, 108, 4 } }    \
-}
+/* B */
+#define ATH5K_RATE_CODE_1M     0x1B
+#define ATH5K_RATE_CODE_2M     0x1A
+#define ATH5K_RATE_CODE_5_5M   0x19
+#define ATH5K_RATE_CODE_11M    0x18
+/* A and G */
+#define ATH5K_RATE_CODE_6M     0x0B
+#define ATH5K_RATE_CODE_9M     0x0F
+#define ATH5K_RATE_CODE_12M    0x0A
+#define ATH5K_RATE_CODE_18M    0x0E
+#define ATH5K_RATE_CODE_24M    0x09
+#define ATH5K_RATE_CODE_36M    0x0D
+#define ATH5K_RATE_CODE_48M    0x08
+#define ATH5K_RATE_CODE_54M    0x0C
+/* XR */
+#define ATH5K_RATE_CODE_XR_500K        0x07
+#define ATH5K_RATE_CODE_XR_1M  0x02
+#define ATH5K_RATE_CODE_XR_2M  0x06
+#define ATH5K_RATE_CODE_XR_3M  0x01
 
-#define AR5K_RATES_XR { 12, {                                  \
-       255, 3, 1, 255, 255, 255, 2, 0, 10, 8, 6, 4,            \
-       11, 9, 7, 5, 255, 255, 255, 255, 255, 255, 255, 255,    \
-       255, 255, 255, 255, 255, 255, 255, 255 }, {             \
-       { 1, MODULATION_XR, 500, 7, 129, 0 },           \
-       { 1, MODULATION_XR, 1000, 2, 139, 1 },          \
-       { 1, MODULATION_XR, 2000, 6, 150, 2 },          \
-       { 1, MODULATION_XR, 3000, 1, 150, 3 },          \
-       { 1, 0, 6000, 11, 140, 4 },     \
-       { 1, 0, 9000, 15, 18, 4 },      \
-       { 1, 0, 12000, 10, 152, 6 },    \
-       { 1, 0, 18000, 14, 36, 6 },     \
-       { 1, 0, 24000, 9, 176, 8 },     \
-       { 1, 0, 36000, 13, 72, 8 },     \
-       { 1, 0, 48000, 8, 96, 8 },      \
-       { 1, 0, 54000, 12, 108, 8 } }   \
-}
 
 /*
  * Crypto definitions
index b20a45aa8680ec1b0fb0501142fedb4ba3c7978c..cd598c0d8d6db1ccfc31d3f91d15fc2ca24a6746 100644 (file)
@@ -132,6 +132,48 @@ static struct ath5k_srev_name srev_names[] = {
        { "xxxxx",      AR5K_VERSION_RAD,       AR5K_SREV_UNKNOWN },
 };
 
+static struct ieee80211_rate ath5k_rates[] = {
+       { .bitrate = 10,
+         .hw_value = ATH5K_RATE_CODE_1M, },
+       { .bitrate = 20,
+         .hw_value = ATH5K_RATE_CODE_2M,
+         .hw_value_short = ATH5K_RATE_CODE_2M | AR5K_SET_SHORT_PREAMBLE,
+         .flags = IEEE80211_RATE_SHORT_PREAMBLE },
+       { .bitrate = 55,
+         .hw_value = ATH5K_RATE_CODE_5_5M,
+         .hw_value_short = ATH5K_RATE_CODE_5_5M | AR5K_SET_SHORT_PREAMBLE,
+         .flags = IEEE80211_RATE_SHORT_PREAMBLE },
+       { .bitrate = 110,
+         .hw_value = ATH5K_RATE_CODE_11M,
+         .hw_value_short = ATH5K_RATE_CODE_11M | AR5K_SET_SHORT_PREAMBLE,
+         .flags = IEEE80211_RATE_SHORT_PREAMBLE },
+       { .bitrate = 60,
+         .hw_value = ATH5K_RATE_CODE_6M,
+         .flags = 0 },
+       { .bitrate = 90,
+         .hw_value = ATH5K_RATE_CODE_9M,
+         .flags = 0 },
+       { .bitrate = 120,
+         .hw_value = ATH5K_RATE_CODE_12M,
+         .flags = 0 },
+       { .bitrate = 180,
+         .hw_value = ATH5K_RATE_CODE_18M,
+         .flags = 0 },
+       { .bitrate = 240,
+         .hw_value = ATH5K_RATE_CODE_24M,
+         .flags = 0 },
+       { .bitrate = 360,
+         .hw_value = ATH5K_RATE_CODE_36M,
+         .flags = 0 },
+       { .bitrate = 480,
+         .hw_value = ATH5K_RATE_CODE_48M,
+         .flags = 0 },
+       { .bitrate = 540,
+         .hw_value = ATH5K_RATE_CODE_54M,
+         .flags = 0 },
+       /* XR missing */
+};
+
 /*
  * Prototypes - PCI stack related functions
  */
@@ -162,7 +204,8 @@ static struct pci_driver ath5k_pci_driver = {
  * Prototypes - MAC 802.11 stack related functions
  */
 static int ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb);
-static int ath5k_reset(struct ieee80211_hw *hw);
+static int ath5k_reset(struct ath5k_softc *sc, bool stop, bool change_channel);
+static int ath5k_reset_wake(struct ath5k_softc *sc);
 static int ath5k_start(struct ieee80211_hw *hw);
 static void ath5k_stop(struct ieee80211_hw *hw);
 static int ath5k_add_interface(struct ieee80211_hw *hw,
@@ -218,20 +261,16 @@ static void       ath5k_detach(struct pci_dev *pdev,
                        struct ieee80211_hw *hw);
 /* Channel/mode setup */
 static inline short ath5k_ieee2mhz(short chan);
-static unsigned int ath5k_copy_rates(struct ieee80211_rate *rates,
-                               const struct ath5k_rate_table *rt,
-                               unsigned int max);
 static unsigned int ath5k_copy_channels(struct ath5k_hw *ah,
                                struct ieee80211_channel *channels,
                                unsigned int mode,
                                unsigned int max);
-static int     ath5k_getchannels(struct ieee80211_hw *hw);
+static int     ath5k_setup_bands(struct ieee80211_hw *hw);
 static int     ath5k_chan_set(struct ath5k_softc *sc,
                                struct ieee80211_channel *chan);
 static void    ath5k_setcurmode(struct ath5k_softc *sc,
                                unsigned int mode);
 static void    ath5k_mode_setup(struct ath5k_softc *sc);
-static void    ath5k_set_total_hw_rates(struct ath5k_softc *sc);
 
 /* Descriptor setup */
 static int     ath5k_desc_alloc(struct ath5k_softc *sc,
@@ -645,7 +684,6 @@ err_no_irq:
 #endif /* CONFIG_PM */
 
 
-
 /***********************\
 * Driver Initialization *
 \***********************/
@@ -687,15 +725,12 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw)
         * on settings like the phy mode and regulatory
         * domain restrictions.
         */
-       ret = ath5k_getchannels(hw);
+       ret = ath5k_setup_bands(hw);
        if (ret) {
                ATH5K_ERR(sc, "can't get channels\n");
                goto err;
        }
 
-       /* Set *_rates so we can map hw rate index */
-       ath5k_set_total_hw_rates(sc);
-
        /* NB: setup here so ath5k_rate_update is happy */
        if (test_bit(AR5K_MODE_11A, ah->ah_modes))
                ath5k_setcurmode(sc, AR5K_MODE_11A);
@@ -811,27 +846,6 @@ ath5k_ieee2mhz(short chan)
                return 2212 + chan * 20;
 }
 
-static unsigned int
-ath5k_copy_rates(struct ieee80211_rate *rates,
-               const struct ath5k_rate_table *rt,
-               unsigned int max)
-{
-       unsigned int i, count;
-
-       if (rt == NULL)
-               return 0;
-
-       for (i = 0, count = 0; i < rt->rate_count && max > 0; i++) {
-               rates[count].bitrate = rt->rates[i].rate_kbps / 100;
-               rates[count].hw_value = rt->rates[i].rate_code;
-               rates[count].flags = rt->rates[i].modulation;
-               count++;
-               max--;
-       }
-
-       return count;
-}
-
 static unsigned int
 ath5k_copy_channels(struct ath5k_hw *ah,
                struct ieee80211_channel *channels,
@@ -894,74 +908,97 @@ ath5k_copy_channels(struct ath5k_hw *ah,
        return count;
 }
 
+static void
+ath5k_setup_rate_idx(struct ath5k_softc *sc, struct ieee80211_supported_band *b)
+{
+       u8 i;
+
+       for (i = 0; i < AR5K_MAX_RATES; i++)
+               sc->rate_idx[b->band][i] = -1;
+
+       for (i = 0; i < b->n_bitrates; i++) {
+               sc->rate_idx[b->band][b->bitrates[i].hw_value] = i;
+               if (b->bitrates[i].hw_value_short)
+                       sc->rate_idx[b->band][b->bitrates[i].hw_value_short] = i;
+       }
+}
+
 static int
-ath5k_getchannels(struct ieee80211_hw *hw)
+ath5k_setup_bands(struct ieee80211_hw *hw)
 {
        struct ath5k_softc *sc = hw->priv;
        struct ath5k_hw *ah = sc->ah;
-       struct ieee80211_supported_band *sbands = sc->sbands;
-       const struct ath5k_rate_table *hw_rates;
-       unsigned int max_r, max_c, count_r, count_c;
-       int mode2g = AR5K_MODE_11G;
+       struct ieee80211_supported_band *sband;
+       int max_c, count_c = 0;
+       int i;
 
        BUILD_BUG_ON(ARRAY_SIZE(sc->sbands) < IEEE80211_NUM_BANDS);
-
-       max_r = ARRAY_SIZE(sc->rates);
        max_c = ARRAY_SIZE(sc->channels);
-       count_r = count_c = 0;
 
        /* 2GHz band */
-       if (!test_bit(AR5K_MODE_11G, sc->ah->ah_capabilities.cap_mode)) {
-               mode2g = AR5K_MODE_11B;
-               if (!test_bit(AR5K_MODE_11B,
-                       sc->ah->ah_capabilities.cap_mode))
-                       mode2g = -1;
-       }
+       sband = &sc->sbands[IEEE80211_BAND_2GHZ];
+       sband->band = IEEE80211_BAND_2GHZ;
+       sband->bitrates = &sc->rates[IEEE80211_BAND_2GHZ][0];
 
-       if (mode2g > 0) {
-               struct ieee80211_supported_band *sband =
-                       &sbands[IEEE80211_BAND_2GHZ];
+       if (test_bit(AR5K_MODE_11G, sc->ah->ah_capabilities.cap_mode)) {
+               /* G mode */
+               memcpy(sband->bitrates, &ath5k_rates[0],
+                      sizeof(struct ieee80211_rate) * 12);
+               sband->n_bitrates = 12;
 
-               sband->bitrates = sc->rates;
                sband->channels = sc->channels;
-
-               sband->band = IEEE80211_BAND_2GHZ;
                sband->n_channels = ath5k_copy_channels(ah, sband->channels,
-                                       mode2g, max_c);
-
-               hw_rates = ath5k_hw_get_rate_table(ah, mode2g);
-               sband->n_bitrates = ath5k_copy_rates(sband->bitrates,
-                                       hw_rates, max_r);
+                                       AR5K_MODE_11G, max_c);
 
+               hw->wiphy->bands[IEEE80211_BAND_2GHZ] = sband;
                count_c = sband->n_channels;
-               count_r = sband->n_bitrates;
+               max_c -= count_c;
+       } else if (test_bit(AR5K_MODE_11B, sc->ah->ah_capabilities.cap_mode)) {
+               /* B mode */
+               memcpy(sband->bitrates, &ath5k_rates[0],
+                      sizeof(struct ieee80211_rate) * 4);
+               sband->n_bitrates = 4;
+
+               /* 5211 only supports B rates and uses 4bit rate codes
+                * (e.g normally we have 0x1B for 1M, but on 5211 we have 0x0B)
+                * fix them up here:
+                */
+               if (ah->ah_version == AR5K_AR5211) {
+                       for (i = 0; i < 4; i++) {
+                               sband->bitrates[i].hw_value =
+                                       sband->bitrates[i].hw_value & 0xF;
+                               sband->bitrates[i].hw_value_short =
+                                       sband->bitrates[i].hw_value_short & 0xF;
+                       }
+               }
 
-               hw->wiphy->bands[IEEE80211_BAND_2GHZ] = sband;
+               sband->channels = sc->channels;
+               sband->n_channels = ath5k_copy_channels(ah, sband->channels,
+                                       AR5K_MODE_11B, max_c);
 
-               max_r -= count_r;
+               hw->wiphy->bands[IEEE80211_BAND_2GHZ] = sband;
+               count_c = sband->n_channels;
                max_c -= count_c;
-
        }
+       ath5k_setup_rate_idx(sc, sband);
 
-       /* 5GHz band */
-
+       /* 5GHz band, A mode */
        if (test_bit(AR5K_MODE_11A, sc->ah->ah_capabilities.cap_mode)) {
-               struct ieee80211_supported_band *sband =
-                       &sbands[IEEE80211_BAND_5GHZ];
+               sband = &sc->sbands[IEEE80211_BAND_5GHZ];
+               sband->band = IEEE80211_BAND_5GHZ;
+               sband->bitrates = &sc->rates[IEEE80211_BAND_5GHZ][0];
 
-               sband->bitrates = &sc->rates[count_r];
-               sband->channels = &sc->channels[count_c];
+               memcpy(sband->bitrates, &ath5k_rates[4],
+                      sizeof(struct ieee80211_rate) * 8);
+               sband->n_bitrates = 8;
 
-               sband->band = IEEE80211_BAND_5GHZ;
+               sband->channels = &sc->channels[count_c];
                sband->n_channels = ath5k_copy_channels(ah, sband->channels,
                                        AR5K_MODE_11A, max_c);
 
-               hw_rates = ath5k_hw_get_rate_table(ah, AR5K_MODE_11A);
-               sband->n_bitrates = ath5k_copy_rates(sband->bitrates,
-                                       hw_rates, max_r);
-
                hw->wiphy->bands[IEEE80211_BAND_5GHZ] = sband;
        }
+       ath5k_setup_rate_idx(sc, sband);
 
        ath5k_debug_dump_bands(sc);
 
@@ -977,9 +1014,6 @@ ath5k_getchannels(struct ieee80211_hw *hw)
 static int
 ath5k_chan_set(struct ath5k_softc *sc, struct ieee80211_channel *chan)
 {
-       struct ath5k_hw *ah = sc->ah;
-       int ret;
-
        ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "(%u MHz) -> (%u MHz)\n",
                sc->curchan->center_freq, chan->center_freq);
 
@@ -995,41 +1029,7 @@ ath5k_chan_set(struct ath5k_softc *sc, struct ieee80211_channel *chan)
                 * hardware at the new frequency, and then re-enable
                 * the relevant bits of the h/w.
                 */
-               ath5k_hw_set_intr(ah, 0);       /* disable interrupts */
-               ath5k_txq_cleanup(sc);          /* clear pending tx frames */
-               ath5k_rx_stop(sc);              /* turn off frame recv */
-               ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, true);
-               if (ret) {
-                       ATH5K_ERR(sc, "%s: unable to reset channel "
-                               "(%u Mhz)\n", __func__, chan->center_freq);
-                       return ret;
-               }
-
-               ath5k_hw_set_txpower_limit(sc->ah, 0);
-
-               /*
-                * Re-enable rx framework.
-                */
-               ret = ath5k_rx_start(sc);
-               if (ret) {
-                       ATH5K_ERR(sc, "%s: unable to restart recv logic\n",
-                                       __func__);
-                       return ret;
-               }
-
-               /*
-                * Change channels and update the h/w rate map
-                * if we're switching; e.g. 11a to 11b/g.
-                *
-                * XXX needed?
-                */
-/*             ath5k_chan_change(sc, chan); */
-
-               ath5k_beacon_config(sc);
-               /*
-                * Re-enable interrupts.
-                */
-               ath5k_hw_set_intr(ah, sc->imask);
+               return ath5k_reset(sc, true, true);
        }
 
        return 0;
@@ -1067,75 +1067,13 @@ ath5k_mode_setup(struct ath5k_softc *sc)
        ATH5K_DBG(sc, ATH5K_DEBUG_MODE, "RX filter 0x%x\n", rfilt);
 }
 
-/*
- * Match the hw provided rate index (through descriptors)
- * to an index for sc->curband->bitrates, so it can be used
- * by the stack.
- *
- * This one is a little bit tricky but i think i'm right
- * about this...
- *
- * We have 4 rate tables in the following order:
- * XR (4 rates)
- * 802.11a (8 rates)
- * 802.11b (4 rates)
- * 802.11g (12 rates)
- * that make the hw rate table.
- *
- * Lets take a 5211 for example that supports a and b modes only.
- * First comes the 802.11a table and then 802.11b (total 12 rates).
- * When hw returns eg. 11 it points to the last 802.11b rate (11Mbit),
- * if it returns 2 it points to the second 802.11a rate etc.
- *
- * Same goes for 5212 who has xr/a/b/g support (total 28 rates).
- * First comes the XR table, then 802.11a, 802.11b and 802.11g.
- * When hw returns eg. 27 it points to the last 802.11g rate (54Mbits) etc
- */
-static void
-ath5k_set_total_hw_rates(struct ath5k_softc *sc) {
-
-       struct ath5k_hw *ah = sc->ah;
-
-       if (test_bit(AR5K_MODE_11A, ah->ah_modes))
-               sc->a_rates = 8;
-
-       if (test_bit(AR5K_MODE_11B, ah->ah_modes))
-               sc->b_rates = 4;
-
-       if (test_bit(AR5K_MODE_11G, ah->ah_modes))
-               sc->g_rates = 12;
-
-       /* XXX: Need to see what what happens when
-               xr disable bits in eeprom are set */
-       if (ah->ah_version >= AR5K_AR5212)
-               sc->xr_rates = 4;
-
-}
-
 static inline int
-ath5k_hw_to_driver_rix(struct ath5k_softc *sc, int hw_rix) {
-
-       int mac80211_rix;
-
-       if(sc->curband->band == IEEE80211_BAND_2GHZ) {
-               /* We setup a g ratetable for both b/g modes */
-               mac80211_rix =
-                       hw_rix - sc->b_rates - sc->a_rates - sc->xr_rates;
-       } else {
-               mac80211_rix = hw_rix - sc->xr_rates;
-       }
-
-       /* Something went wrong, fallback to basic rate for this band */
-       if ((mac80211_rix >= sc->curband->n_bitrates) ||
-               (mac80211_rix <= 0 ))
-               mac80211_rix = 1;
-
-       return mac80211_rix;
+ath5k_hw_to_driver_rix(struct ath5k_softc *sc, int hw_rix)
+{
+       WARN_ON(hw_rix < 0 || hw_rix > AR5K_MAX_RATES);
+       return sc->rate_idx[sc->curband->band][hw_rix];
 }
 
-
-
-
 /***************\
 * Buffers setup *
 \***************/
@@ -1432,7 +1370,8 @@ ath5k_beaconq_config(struct ath5k_softc *sc)
        ret = ath5k_hw_get_tx_queueprops(ah, sc->bhalq, &qi);
        if (ret)
                return ret;
-       if (sc->opmode == IEEE80211_IF_TYPE_AP) {
+       if (sc->opmode == IEEE80211_IF_TYPE_AP ||
+               sc->opmode == IEEE80211_IF_TYPE_MESH_POINT) {
                /*
                 * Always burst out beacon and CAB traffic
                 * (aifs = cwmin = cwmax = 0)
@@ -1601,7 +1540,7 @@ ath5k_rx_decrypted(struct ath5k_softc *sc, struct ath5k_desc *ds,
                struct sk_buff *skb, struct ath5k_rx_status *rs)
 {
        struct ieee80211_hdr *hdr = (void *)skb->data;
-       unsigned int keyix, hlen = ieee80211_get_hdrlen_from_skb(skb);
+       unsigned int keyix, hlen;
 
        if (!(rs->rs_status & AR5K_RXERR_DECRYPT) &&
                        rs->rs_keyix != AR5K_RXKEYIX_INVALID)
@@ -1610,6 +1549,7 @@ ath5k_rx_decrypted(struct ath5k_softc *sc, struct ath5k_desc *ds,
        /* Apparently when a default key is used to decrypt the packet
           the hw does not set the index used to decrypt.  In such cases
           get the index from the packet. */
+       hlen = ieee80211_hdrlen(hdr->frame_control);
        if (ieee80211_has_protected(hdr->frame_control) &&
            !(rs->rs_status & AR5K_RXERR_DECRYPT) &&
            skb->len >= hlen + 4) {
@@ -1823,6 +1763,10 @@ accept:
                rxs.rate_idx = ath5k_hw_to_driver_rix(sc, rs.rs_rate);
                rxs.flag |= ath5k_rx_decrypted(sc, ds, skb, &rs);
 
+               if (rxs.rate_idx >= 0 && rs.rs_rate ==
+                   sc->curband->bitrates[rxs.rate_idx].hw_value_short)
+                       rxs.flag |= RX_FLAG_SHORTPRE;
+
                ath5k_debug_dump_skb(sc, skb, "RX  ", 0);
 
                /* check beacons in IBSS mode */
@@ -2216,36 +2160,13 @@ ath5k_init(struct ath5k_softc *sc)
         */
        sc->curchan = sc->hw->conf.channel;
        sc->curband = &sc->sbands[sc->curchan->band];
-       ret = ath5k_hw_reset(sc->ah, sc->opmode, sc->curchan, false);
-       if (ret) {
-               ATH5K_ERR(sc, "unable to reset hardware: %d\n", ret);
-               goto done;
-       }
-       /*
-        * This is needed only to setup initial state
-        * but it's best done after a reset.
-        */
-       ath5k_hw_set_txpower_limit(sc->ah, 0);
-
-       /*
-        * Setup the hardware after reset: the key cache
-        * is filled as needed and the receive engine is
-        * set going.  Frame transmit is handled entirely
-        * in the frame output path; there's nothing to do
-        * here except setup the interrupt mask.
-        */
-       ret = ath5k_rx_start(sc);
-       if (ret)
-               goto done;
-
-       /*
-        * Enable interrupts.
-        */
        sc->imask = AR5K_INT_RX | AR5K_INT_TX | AR5K_INT_RXEOL |
                AR5K_INT_RXORN | AR5K_INT_FATAL | AR5K_INT_GLOBAL |
                AR5K_INT_MIB;
+       ret = ath5k_reset(sc, false, false);
+       if (ret)
+               goto done;
 
-       ath5k_hw_set_intr(sc->ah, sc->imask);
        /* Set ack to be sent at low bit-rates */
        ath5k_hw_set_ack_bitrate_high(sc->ah, false);
 
@@ -2445,7 +2366,7 @@ ath5k_tasklet_reset(unsigned long data)
 {
        struct ath5k_softc *sc = (void *)data;
 
-       ath5k_reset(sc->hw);
+       ath5k_reset_wake(sc);
 }
 
 /*
@@ -2468,7 +2389,7 @@ ath5k_calibrate(unsigned long data)
                 * to load new gain values.
                 */
                ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "calibration, resetting\n");
-               ath5k_reset(sc->hw);
+               ath5k_reset_wake(sc);
        }
        if (ath5k_hw_phy_calibrate(ah, sc->curchan))
                ATH5K_ERR(sc, "calibration of channel %u failed\n",
@@ -2669,48 +2590,67 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
 }
 
 static int
-ath5k_reset(struct ieee80211_hw *hw)
+ath5k_reset(struct ath5k_softc *sc, bool stop, bool change_channel)
 {
-       struct ath5k_softc *sc = hw->priv;
        struct ath5k_hw *ah = sc->ah;
        int ret;
 
        ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "resetting\n");
 
-       ath5k_hw_set_intr(ah, 0);
-       ath5k_txq_cleanup(sc);
-       ath5k_rx_stop(sc);
-
+       if (stop) {
+               ath5k_hw_set_intr(ah, 0);
+               ath5k_txq_cleanup(sc);
+               ath5k_rx_stop(sc);
+       }
        ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, true);
-       if (unlikely(ret)) {
+       if (ret) {
                ATH5K_ERR(sc, "can't reset hardware (%d)\n", ret);
                goto err;
        }
+
+       /*
+        * This is needed only to setup initial state
+        * but it's best done after a reset.
+        */
        ath5k_hw_set_txpower_limit(sc->ah, 0);
 
        ret = ath5k_rx_start(sc);
-       if (unlikely(ret)) {
+       if (ret) {
                ATH5K_ERR(sc, "can't start recv logic\n");
                goto err;
        }
+
        /*
-        * We may be doing a reset in response to an ioctl
-        * that changes the channel so update any state that
-        * might change as a result.
+        * Change channels and update the h/w rate map if we're switching;
+        * e.g. 11a to 11b/g.
+        *
+        * We may be doing a reset in response to an ioctl that changes the
+        * channel so update any state that might change as a result.
         *
         * XXX needed?
         */
 /*     ath5k_chan_change(sc, c); */
-       ath5k_beacon_config(sc);
-       /* intrs are started by ath5k_beacon_config */
 
-       ieee80211_wake_queues(hw);
+       ath5k_beacon_config(sc);
+       /* intrs are enabled by ath5k_beacon_config */
 
        return 0;
 err:
        return ret;
 }
 
+static int
+ath5k_reset_wake(struct ath5k_softc *sc)
+{
+       int ret;
+
+       ret = ath5k_reset(sc, true, true);
+       if (!ret)
+               ieee80211_wake_queues(sc->hw);
+
+       return ret;
+}
+
 static int ath5k_start(struct ieee80211_hw *hw)
 {
        return ath5k_init(hw->priv);
@@ -2819,7 +2759,7 @@ ath5k_config_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 
        mutex_unlock(&sc->lock);
 
-       return ath5k_reset(hw);
+       return ath5k_reset_wake(sc);
 unlock:
        mutex_unlock(&sc->lock);
        return ret;
@@ -2932,6 +2872,7 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw,
        if (sc->opmode != IEEE80211_IF_TYPE_STA)
                rfilt |= AR5K_RX_FILTER_PROBEREQ;
        if (sc->opmode != IEEE80211_IF_TYPE_AP &&
+               sc->opmode != IEEE80211_IF_TYPE_MESH_POINT &&
                test_bit(ATH_STAT_PROMISC, sc->status))
                rfilt |= AR5K_RX_FILTER_PROM;
        if (sc->opmode == IEEE80211_IF_TYPE_STA ||
index d7e03e6b827126720834b1a3b0ecd7e32590e7e2..248e32eb6cb36a4ef27c8994a8517dc4b764e380 100644 (file)
@@ -111,17 +111,13 @@ struct ath5k_softc {
        struct ieee80211_hw     *hw;            /* IEEE 802.11 common */
        struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
        struct ieee80211_channel channels[ATH_CHAN_MAX];
-       struct ieee80211_rate   rates[AR5K_MAX_RATES * IEEE80211_NUM_BANDS];
+       struct ieee80211_rate   rates[IEEE80211_NUM_BANDS][AR5K_MAX_RATES];
+       u8                      rate_idx[IEEE80211_NUM_BANDS][AR5K_MAX_RATES];
        enum ieee80211_if_types opmode;
        struct ath5k_hw         *ah;            /* Atheros HW */
 
        struct ieee80211_supported_band         *curband;
 
-       u8                      a_rates;
-       u8                      b_rates;
-       u8                      g_rates;
-       u8                      xr_rates;
-
 #ifdef CONFIG_ATH5K_DEBUG
        struct ath5k_dbg_info   debug;          /* debug info */
 #endif /* CONFIG_ATH5K_DEBUG */
index ad1a5b422c8c8c6e2a9ee9d23519da0130837500..b987aa1e0f77ea5ffae5c54a4669b3f56f2cbb60 100644 (file)
 #include "base.h"
 #include "debug.h"
 
-/* Rate tables */
-static const struct ath5k_rate_table ath5k_rt_11a = AR5K_RATES_11A;
-static const struct ath5k_rate_table ath5k_rt_11b = AR5K_RATES_11B;
-static const struct ath5k_rate_table ath5k_rt_11g = AR5K_RATES_11G;
-static const struct ath5k_rate_table ath5k_rt_turbo = AR5K_RATES_TURBO;
-static const struct ath5k_rate_table ath5k_rt_xr = AR5K_RATES_XR;
-
 /* Prototypes */
 static int ath5k_hw_nic_reset(struct ath5k_hw *, u32);
 static int ath5k_hw_nic_wakeup(struct ath5k_hw *, int, bool);
@@ -520,34 +513,6 @@ static int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int flags, bool initial)
        return 0;
 }
 
-/*
- * Get the rate table for a specific operation mode
- */
-const struct ath5k_rate_table *ath5k_hw_get_rate_table(struct ath5k_hw *ah,
-               unsigned int mode)
-{
-       ATH5K_TRACE(ah->ah_sc);
-
-       if (!test_bit(mode, ah->ah_capabilities.cap_mode))
-               return NULL;
-
-       /* Get rate tables */
-       switch (mode) {
-       case AR5K_MODE_11A:
-               return &ath5k_rt_11a;
-       case AR5K_MODE_11A_TURBO:
-               return &ath5k_rt_turbo;
-       case AR5K_MODE_11B:
-               return &ath5k_rt_11b;
-       case AR5K_MODE_11G:
-               return &ath5k_rt_11g;
-       case AR5K_MODE_11G_TURBO:
-               return &ath5k_rt_xr;
-       }
-
-       return NULL;
-}
-
 /*
  * Free the ath5k_hw struct
  */
@@ -618,45 +583,42 @@ static inline int ath5k_hw_write_ofdm_timings(struct ath5k_hw *ah,
        return 0;
 }
 
+
+/*
+ * index into rates for control rates, we can set it up like this because
+ * this is only used for AR5212 and we know it supports G mode
+ */
+static int control_rates[] =
+       { 0, 1, 1, 1, 4, 4, 6, 6, 8, 8, 8, 8 };
+
 /**
  * ath5k_hw_write_rate_duration - set rate duration during hw resets
  *
  * @ah: the &struct ath5k_hw
  * @mode: one of enum ath5k_driver_mode
  *
- * Write the rate duration table for the current mode upon hw reset. This
- * is a helper for ath5k_hw_reset(). It seems all this is doing is setting
- * an ACK timeout for the hardware for the current mode for each rate. The
- * rates which are capable of short preamble (802.11b rates 2Mbps, 5.5Mbps,
- * and 11Mbps) have another register for the short preamble ACK timeout
- * calculation.
- *
+ * Write the rate duration table upon hw reset. This is a helper for
+ * ath5k_hw_reset(). It seems all this is doing is setting an ACK timeout for
+ * the hardware for the current mode for each rate. The rates which are capable
+ * of short preamble (802.11b rates 2Mbps, 5.5Mbps, and 11Mbps) have another
+ * register for the short preamble ACK timeout calculation.
  */
 static inline void ath5k_hw_write_rate_duration(struct ath5k_hw *ah,
        unsigned int mode)
 {
        struct ath5k_softc *sc = ah->ah_sc;
-       const struct ath5k_rate_table *rt;
-       struct ieee80211_rate srate = {};
+       struct ieee80211_rate *rate;
        unsigned int i;
 
-       /* Get rate table for the current operating mode */
-       rt = ath5k_hw_get_rate_table(ah, mode);
-
        /* Write rate duration table */
-       for (i = 0; i < rt->rate_count; i++) {
-               const struct ath5k_rate *rate, *control_rate;
-
+       for (i = 0; i < sc->sbands[IEEE80211_BAND_2GHZ].n_bitrates; i++) {
                u32 reg;
                u16 tx_time;
 
-               rate = &rt->rates[i];
-               control_rate = &rt->rates[rate->control_rate];
+               rate = &sc->sbands[IEEE80211_BAND_2GHZ].bitrates[control_rates[i]];
 
                /* Set ACK timeout */
-               reg = AR5K_RATE_DUR(rate->rate_code);
-
-               srate.bitrate = control_rate->rate_kbps/100;
+               reg = AR5K_RATE_DUR(rate->hw_value);
 
                /* An ACK frame consists of 10 bytes. If you add the FCS,
                 * which ieee80211_generic_frame_duration() adds,
@@ -665,11 +627,11 @@ static inline void ath5k_hw_write_rate_duration(struct ath5k_hw *ah,
                 * ieee80211_duration() for a brief description of
                 * what rate we should choose to TX ACKs. */
                tx_time = le16_to_cpu(ieee80211_generic_frame_duration(sc->hw,
-                                                       sc->vif, 10, &srate));
+                                                       sc->vif, 10, rate));
 
                ath5k_hw_reg_write(ah, tx_time, reg);
 
-               if (!HAS_SHPREAMBLE(i))
+               if (!(rate->flags & IEEE80211_RATE_SHORT_PREAMBLE))
                        continue;
 
                /*
@@ -2387,6 +2349,7 @@ int ath5k_hw_set_opmode(struct ath5k_hw *ah)
                break;
 
        case IEEE80211_IF_TYPE_AP:
+       case IEEE80211_IF_TYPE_MESH_POINT:
                pcu_reg |= AR5K_STA_ID1_AP | AR5K_STA_ID1_RTS_DEF_ANTENNA |
                        (ah->ah_version == AR5K_AR5210 ?
                                AR5K_STA_ID1_NO_PSPOLL : 0);
index 68e1f8c78727dd1d4c2504f12b41a75d5080d06e..c5ca72aa59e7eb1c08791334866fe796a4885790 100644 (file)
@@ -193,7 +193,6 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
 {
        const struct ieee80211_hdr *wlhdr;
        int use_encryption = !!info->control.hw_key;
-       u16 fctl;
        u8 rate;
        struct ieee80211_rate *rate_fb;
        int rate_ofdm;
@@ -204,7 +203,6 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
        struct ieee80211_rate *tx_rate;
 
        wlhdr = (const struct ieee80211_hdr *)fragment_data;
-       fctl = le16_to_cpu(wlhdr->frame_control);
 
        memset(txhdr, 0, sizeof(*txhdr));
 
@@ -253,7 +251,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
                        mac_ctl |= (key->algorithm <<
                                   B43legacy_TX4_MAC_KEYALG_SHIFT) &
                                   B43legacy_TX4_MAC_KEYALG;
-                       wlhdr_len = ieee80211_get_hdrlen(fctl);
+                       wlhdr_len = ieee80211_hdrlen(wlhdr->frame_control);
                        iv_len = min((size_t)info->control.iv_len,
                                     ARRAY_SIZE(txhdr->iv));
                        memcpy(txhdr->iv, ((u8 *)wlhdr) + wlhdr_len, iv_len);
index 29d39105f5b869a4a59be436e41ab2015a3c822e..bfa375369df3fc517cd639c2db190b7518b9d782 100644 (file)
@@ -87,7 +87,8 @@ MODULE_LICENSE("Dual MPL/GPL");
 
    Callable from any context.
 */
-static int hermes_issue_cmd(hermes_t *hw, u16 cmd, u16 param0)
+static int hermes_issue_cmd(hermes_t *hw, u16 cmd, u16 param0,
+                           u16 param1, u16 param2)
 {
        int k = CMD_BUSY_TIMEOUT;
        u16 reg;
@@ -103,8 +104,8 @@ static int hermes_issue_cmd(hermes_t *hw, u16 cmd, u16 param0)
                return -EBUSY;
        }
 
-       hermes_write_regn(hw, PARAM2, 0);
-       hermes_write_regn(hw, PARAM1, 0);
+       hermes_write_regn(hw, PARAM2, param2);
+       hermes_write_regn(hw, PARAM1, param1);
        hermes_write_regn(hw, PARAM0, param0);
        hermes_write_regn(hw, CMD, cmd);
        
@@ -115,16 +116,72 @@ static int hermes_issue_cmd(hermes_t *hw, u16 cmd, u16 param0)
  * Function definitions
  */
 
+/* For doing cmds that wipe the magic constant in SWSUPPORT0 */
+int hermes_doicmd_wait(hermes_t *hw, u16 cmd,
+                      u16 parm0, u16 parm1, u16 parm2,
+                      struct hermes_response *resp)
+{
+       int err = 0;
+       int k;
+       u16 status, reg;
+
+       err = hermes_issue_cmd(hw, cmd, parm0, parm1, parm2);
+       if (err)
+               return err;
+
+       reg = hermes_read_regn(hw, EVSTAT);
+       k = CMD_INIT_TIMEOUT;
+       while ((!(reg & HERMES_EV_CMD)) && k) {
+               k--;
+               udelay(10);
+               reg = hermes_read_regn(hw, EVSTAT);
+       }
+
+       hermes_write_regn(hw, SWSUPPORT0, HERMES_MAGIC);
+
+       if (!hermes_present(hw)) {
+               DEBUG(0, "hermes @ 0x%x: Card removed during reset.\n",
+                      hw->iobase);
+               err = -ENODEV;
+               goto out;
+       }
+
+       if (!(reg & HERMES_EV_CMD)) {
+               printk(KERN_ERR "hermes @ %p: "
+                      "Timeout waiting for card to reset (reg=0x%04x)!\n",
+                      hw->iobase, reg);
+               err = -ETIMEDOUT;
+               goto out;
+       }
+
+       status = hermes_read_regn(hw, STATUS);
+       if (resp) {
+               resp->status = status;
+               resp->resp0 = hermes_read_regn(hw, RESP0);
+               resp->resp1 = hermes_read_regn(hw, RESP1);
+               resp->resp2 = hermes_read_regn(hw, RESP2);
+       }
+
+       hermes_write_regn(hw, EVACK, HERMES_EV_CMD);
+
+       if (status & HERMES_STATUS_RESULT)
+               err = -EIO;
+out:
+       return err;
+}
+EXPORT_SYMBOL(hermes_doicmd_wait);
+
 void hermes_struct_init(hermes_t *hw, void __iomem *address, int reg_spacing)
 {
        hw->iobase = address;
        hw->reg_spacing = reg_spacing;
        hw->inten = 0x0;
 }
+EXPORT_SYMBOL(hermes_struct_init);
 
 int hermes_init(hermes_t *hw)
 {
-       u16 status, reg;
+       u16 reg;
        int err = 0;
        int k;
 
@@ -162,45 +219,11 @@ int hermes_init(hermes_t *hw)
 
        /* We don't use hermes_docmd_wait here, because the reset wipes
           the magic constant in SWSUPPORT0 away, and it gets confused */
-       err = hermes_issue_cmd(hw, HERMES_CMD_INIT, 0);
-       if (err)
-               return err;
-
-       reg = hermes_read_regn(hw, EVSTAT);
-       k = CMD_INIT_TIMEOUT;
-       while ( (! (reg & HERMES_EV_CMD)) && k) {
-               k--;
-               udelay(10);
-               reg = hermes_read_regn(hw, EVSTAT);
-       }
-
-       hermes_write_regn(hw, SWSUPPORT0, HERMES_MAGIC);
-
-       if (! hermes_present(hw)) {
-               DEBUG(0, "hermes @ 0x%x: Card removed during reset.\n",
-                      hw->iobase);
-               err = -ENODEV;
-               goto out;
-       }
-               
-       if (! (reg & HERMES_EV_CMD)) {
-               printk(KERN_ERR "hermes @ %p: " 
-                      "Timeout waiting for card to reset (reg=0x%04x)!\n",
-                      hw->iobase, reg);
-               err = -ETIMEDOUT;
-               goto out;
-       }
+       err = hermes_doicmd_wait(hw, HERMES_CMD_INIT, 0, 0, 0, NULL);
 
-       status = hermes_read_regn(hw, STATUS);
-
-       hermes_write_regn(hw, EVACK, HERMES_EV_CMD);
-
-       if (status & HERMES_STATUS_RESULT)
-               err = -EIO;
-
- out:
        return err;
 }
+EXPORT_SYMBOL(hermes_init);
 
 /* Issue a command to the chip, and (busy!) wait for it to
  * complete.
@@ -216,7 +239,7 @@ int hermes_docmd_wait(hermes_t *hw, u16 cmd, u16 parm0,
        u16 reg;
        u16 status;
 
-       err = hermes_issue_cmd(hw, cmd, parm0);
+       err = hermes_issue_cmd(hw, cmd, parm0, 0, 0);
        if (err) {
                if (! hermes_present(hw)) {
                        if (net_ratelimit())
@@ -271,6 +294,7 @@ int hermes_docmd_wait(hermes_t *hw, u16 cmd, u16 parm0,
  out:
        return err;
 }
+EXPORT_SYMBOL(hermes_docmd_wait);
 
 int hermes_allocate(hermes_t *hw, u16 size, u16 *fid)
 {
@@ -313,7 +337,7 @@ int hermes_allocate(hermes_t *hw, u16 size, u16 *fid)
        
        return 0;
 }
-
+EXPORT_SYMBOL(hermes_allocate);
 
 /* Set up a BAP to read a particular chunk of data from card's internal buffer.
  *
@@ -397,6 +421,7 @@ int hermes_bap_pread(hermes_t *hw, int bap, void *buf, int len,
  out:
        return err;
 }
+EXPORT_SYMBOL(hermes_bap_pread);
 
 /* Write a block of data to the chip's buffer, via the
  * BAP. Synchronization/serialization is the caller's problem.
@@ -422,6 +447,7 @@ int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, int len,
  out:  
        return err;
 }
+EXPORT_SYMBOL(hermes_bap_pwrite);
 
 /* Read a Length-Type-Value record from the card.
  *
@@ -463,7 +489,7 @@ int hermes_read_ltv(hermes_t *hw, int bap, u16 rid, unsigned bufsize,
        if (rtype != rid)
                printk(KERN_WARNING "hermes @ %p: %s(): "
                       "rid (0x%04x) does not match type (0x%04x)\n",
-                      hw->iobase, __FUNCTION__, rid, rtype);
+                      hw->iobase, __func__, rid, rtype);
        if (HERMES_RECLEN_TO_BYTES(rlength) > bufsize)
                printk(KERN_WARNING "hermes @ %p: "
                       "Truncating LTV record from %d to %d bytes. "
@@ -475,6 +501,7 @@ int hermes_read_ltv(hermes_t *hw, int bap, u16 rid, unsigned bufsize,
 
        return 0;
 }
+EXPORT_SYMBOL(hermes_read_ltv);
 
 int hermes_write_ltv(hermes_t *hw, int bap, u16 rid, 
                     u16 length, const void *value)
@@ -497,20 +524,11 @@ int hermes_write_ltv(hermes_t *hw, int bap, u16 rid,
 
        hermes_write_bytes(hw, dreg, value, count << 1);
 
-       err = hermes_docmd_wait(hw, HERMES_CMD_ACCESS | HERMES_CMD_WRITE, 
+       err = hermes_docmd_wait(hw, HERMES_CMD_ACCESS | HERMES_CMD_WRITE,
                                rid, NULL);
 
        return err;
 }
-
-EXPORT_SYMBOL(hermes_struct_init);
-EXPORT_SYMBOL(hermes_init);
-EXPORT_SYMBOL(hermes_docmd_wait);
-EXPORT_SYMBOL(hermes_allocate);
-
-EXPORT_SYMBOL(hermes_bap_pread);
-EXPORT_SYMBOL(hermes_bap_pwrite);
-EXPORT_SYMBOL(hermes_read_ltv);
 EXPORT_SYMBOL(hermes_write_ltv);
 
 static int __init init_hermes(void)
index 8e3f0e3edb58f57e6a20aef2187c8317acb8ddc3..8b13c8fef3dcf49f4ebfe976362ca173c9a5edf6 100644 (file)
 #define HERMES_802_11_OFFSET           (14)
 #define HERMES_802_3_OFFSET            (14+32)
 #define HERMES_802_2_OFFSET            (14+32+14)
+#define HERMES_TXCNTL2_OFFSET          (HERMES_802_3_OFFSET - 2)
 
 #define HERMES_RXSTAT_ERR              (0x0003)
 #define        HERMES_RXSTAT_BADCRC            (0x0001)
 #define        HERMES_RXSTAT_UNDECRYPTABLE     (0x0002)
+#define        HERMES_RXSTAT_MIC               (0x0010)        /* Frame contains MIC */
 #define        HERMES_RXSTAT_MACPORT           (0x0700)
 #define HERMES_RXSTAT_PCF              (0x1000)        /* Frame was received in CF period */
+#define        HERMES_RXSTAT_MIC_KEY_ID        (0x1800)        /* MIC key used */
 #define        HERMES_RXSTAT_MSGTYPE           (0xE000)
 #define        HERMES_RXSTAT_1042              (0x2000)        /* RFC-1042 frame */
 #define        HERMES_RXSTAT_TUNNEL            (0x4000)        /* bridge-tunnel encoded frame */
 #define        HERMES_RXSTAT_WMP               (0x6000)        /* Wavelan-II Management Protocol frame */
 
+/* Shift amount for key ID in RXSTAT and TXCTRL */
+#define        HERMES_MIC_KEY_ID_SHIFT         11
+
 struct hermes_tx_descriptor {
        __le16 status;
        __le16 reserved1;
@@ -208,6 +214,8 @@ struct hermes_tx_descriptor {
 #define HERMES_TXCTRL_TX_OK            (0x0002)        /* ?? interrupt on Tx complete */
 #define HERMES_TXCTRL_TX_EX            (0x0004)        /* ?? interrupt on Tx exception */
 #define HERMES_TXCTRL_802_11           (0x0008)        /* We supply 802.11 header */
+#define HERMES_TXCTRL_MIC              (0x0010)        /* 802.3 + TKIP */
+#define HERMES_TXCTRL_MIC_KEY_ID       (0x1800)        /* MIC Key ID mask */
 #define HERMES_TXCTRL_ALT_RTRY         (0x0020)
 
 /* Inquiry constants and data types */
@@ -302,6 +310,40 @@ union hermes_scan_info {
        struct symbol_scan_apinfo       s;
 };
 
+/* Extended scan struct for HERMES_INQ_CHANNELINFO.
+ * wl_lkm calls this an ACS scan (Automatic Channel Select).
+ * Keep out of union hermes_scan_info because it is much bigger than
+ * the older scan structures. */
+struct agere_ext_scan_info {
+       __le16  reserved0;
+
+       u8      noise;
+       u8      level;
+       u8      rx_flow;
+       u8      rate;
+       __le16  reserved1[2];
+
+       __le16  frame_control;
+       __le16  dur_id;
+       u8      addr1[ETH_ALEN];
+       u8      addr2[ETH_ALEN];
+       u8      bssid[ETH_ALEN];
+       __le16  sequence;
+       u8      addr4[ETH_ALEN];
+
+       __le16  data_length;
+
+       /* Next 3 fields do not get filled in. */
+       u8      daddr[ETH_ALEN];
+       u8      saddr[ETH_ALEN];
+       __le16  len_type;
+
+       __le64  timestamp;
+       __le16  beacon_interval;
+       __le16  capabilities;
+       u8      data[316];
+} __attribute__ ((packed));
+
 #define HERMES_LINKSTATUS_NOT_CONNECTED   (0x0000)  
 #define HERMES_LINKSTATUS_CONNECTED       (0x0001)
 #define HERMES_LINKSTATUS_DISCONNECTED    (0x0002)
@@ -353,6 +395,9 @@ void hermes_struct_init(hermes_t *hw, void __iomem *address, int reg_spacing);
 int hermes_init(hermes_t *hw);
 int hermes_docmd_wait(hermes_t *hw, u16 cmd, u16 parm0,
                      struct hermes_response *resp);
+int hermes_doicmd_wait(hermes_t *hw, u16 cmd,
+                      u16 parm0, u16 parm1, u16 parm2,
+                      struct hermes_response *resp);
 int hermes_allocate(hermes_t *hw, u16 size, u16 *fid);
 
 int hermes_bap_pread(hermes_t *hw, int bap, void *buf, int len,
diff --git a/drivers/net/wireless/hermes_dld.c b/drivers/net/wireless/hermes_dld.c
new file mode 100644 (file)
index 0000000..d8c626e
--- /dev/null
@@ -0,0 +1,730 @@
+/*
+ * Hermes download helper driver.
+ *
+ * This could be entirely merged into hermes.c.
+ *
+ * I'm keeping it separate to minimise the amount of merging between
+ * kernel upgrades. It also means the memory overhead for drivers that
+ * don't need firmware download low.
+ *
+ * This driver:
+ *  - is capable of writing to the volatile area of the hermes device
+ *  - is currently not capable of writing to non-volatile areas
+ *  - provide helpers to identify and update plugin data
+ *  - is not capable of interpreting a fw image directly. That is up to
+ *    the main card driver.
+ *  - deals with Hermes I devices. It can probably be modified to deal
+ *    with Hermes II devices
+ *
+ * Copyright (C) 2007, David Kilroy
+ *
+ * Plug data code slightly modified from spectrum_cs driver
+ *    Copyright (C) 2002-2005 Pavel Roskin <proski@gnu.org>
+ * Portions based on information in wl_lkm_718 Agere driver
+ *    COPYRIGHT (C) 2001-2004 by Agere Systems Inc. All Rights Reserved
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License
+ * at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and
+ * limitations under the License.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
+ * above.  If you wish to allow the use of your version of this file
+ * only under the terms of the GPL and not to allow others to use your
+ * version of this file under the MPL, indicate your decision by
+ * deleting the provisions above and replace them with the notice and
+ * other provisions required by the GPL.  If you do not delete the
+ * provisions above, a recipient may use your version of this file
+ * under either the MPL or the GPL.
+ */
+
+#include <linux/module.h>
+#include <linux/delay.h>
+#include "hermes.h"
+#include "hermes_dld.h"
+
+MODULE_DESCRIPTION("Download helper for Lucent Hermes chipset");
+MODULE_AUTHOR("David Kilroy <kilroyd@gmail.com>");
+MODULE_LICENSE("Dual MPL/GPL");
+
+#define PFX "hermes_dld: "
+
+/*
+ * AUX port access.  To unlock the AUX port write the access keys to the
+ * PARAM0-2 registers, then write HERMES_AUX_ENABLE to the HERMES_CONTROL
+ * register.  Then read it and make sure it's HERMES_AUX_ENABLED.
+ */
+#define HERMES_AUX_ENABLE      0x8000  /* Enable auxiliary port access */
+#define HERMES_AUX_DISABLE     0x4000  /* Disable to auxiliary port access */
+#define HERMES_AUX_ENABLED     0xC000  /* Auxiliary port is open */
+#define HERMES_AUX_DISABLED    0x0000  /* Auxiliary port is closed */
+
+#define HERMES_AUX_PW0 0xFE01
+#define HERMES_AUX_PW1 0xDC23
+#define HERMES_AUX_PW2 0xBA45
+
+/* HERMES_CMD_DOWNLD */
+#define HERMES_PROGRAM_DISABLE             (0x0000 | HERMES_CMD_DOWNLD)
+#define HERMES_PROGRAM_ENABLE_VOLATILE     (0x0100 | HERMES_CMD_DOWNLD)
+#define HERMES_PROGRAM_ENABLE_NON_VOLATILE (0x0200 | HERMES_CMD_DOWNLD)
+#define HERMES_PROGRAM_NON_VOLATILE        (0x0300 | HERMES_CMD_DOWNLD)
+
+/* End markers used in dblocks */
+#define PDI_END                0x00000000      /* End of PDA */
+#define BLOCK_END      0xFFFFFFFF      /* Last image block */
+#define TEXT_END       0x1A            /* End of text header */
+
+/*
+ * PDA == Production Data Area
+ *
+ * In principle, the max. size of the PDA is is 4096 words. Currently,
+ * however, only about 500 bytes of this area are used.
+ *
+ * Some USB implementations can't handle sizes in excess of 1016. Note
+ * that PDA is not actually used in those USB environments, but may be
+ * retrieved by common code.
+ */
+#define MAX_PDA_SIZE   1000
+
+/* Limit the amout we try to download in a single shot.
+ * Size is in bytes.
+ */
+#define MAX_DL_SIZE 1024
+#define LIMIT_PROGRAM_SIZE 0
+
+/*
+ * The following structures have little-endian fields denoted by
+ * the leading underscore.  Don't access them directly - use inline
+ * functions defined below.
+ */
+
+/*
+ * The binary image to be downloaded consists of series of data blocks.
+ * Each block has the following structure.
+ */
+struct dblock {
+       __le32 addr;            /* adapter address where to write the block */
+       __le16 len;             /* length of the data only, in bytes */
+       char data[0];           /* data to be written */
+} __attribute__ ((packed));
+
+/*
+ * Plug Data References are located in in the image after the last data
+ * block.  They refer to areas in the adapter memory where the plug data
+ * items with matching ID should be written.
+ */
+struct pdr {
+       __le32 id;              /* record ID */
+       __le32 addr;            /* adapter address where to write the data */
+       __le32 len;             /* expected length of the data, in bytes */
+       char next[0];           /* next PDR starts here */
+} __attribute__ ((packed));
+
+/*
+ * Plug Data Items are located in the EEPROM read from the adapter by
+ * primary firmware.  They refer to the device-specific data that should
+ * be plugged into the secondary firmware.
+ */
+struct pdi {
+       __le16 len;             /* length of ID and data, in words */
+       __le16 id;              /* record ID */
+       char data[0];           /* plug data */
+} __attribute__ ((packed));
+
+/*** FW data block access functions ***/
+
+static inline u32
+dblock_addr(const struct dblock *blk)
+{
+       return le32_to_cpu(blk->addr);
+}
+
+static inline u32
+dblock_len(const struct dblock *blk)
+{
+       return le16_to_cpu(blk->len);
+}
+
+/*** PDR Access functions ***/
+
+static inline u32
+pdr_id(const struct pdr *pdr)
+{
+       return le32_to_cpu(pdr->id);
+}
+
+static inline u32
+pdr_addr(const struct pdr *pdr)
+{
+       return le32_to_cpu(pdr->addr);
+}
+
+static inline u32
+pdr_len(const struct pdr *pdr)
+{
+       return le32_to_cpu(pdr->len);
+}
+
+/*** PDI Access functions ***/
+
+static inline u32
+pdi_id(const struct pdi *pdi)
+{
+       return le16_to_cpu(pdi->id);
+}
+
+/* Return length of the data only, in bytes */
+static inline u32
+pdi_len(const struct pdi *pdi)
+{
+       return 2 * (le16_to_cpu(pdi->len) - 1);
+}
+
+/*** Hermes AUX control ***/
+
+static inline void
+hermes_aux_setaddr(hermes_t *hw, u32 addr)
+{
+       hermes_write_reg(hw, HERMES_AUXPAGE, (u16) (addr >> 7));
+       hermes_write_reg(hw, HERMES_AUXOFFSET, (u16) (addr & 0x7F));
+}
+
+static inline int
+hermes_aux_control(hermes_t *hw, int enabled)
+{
+       int desired_state = enabled ? HERMES_AUX_ENABLED : HERMES_AUX_DISABLED;
+       int action = enabled ? HERMES_AUX_ENABLE : HERMES_AUX_DISABLE;
+       int i;
+
+       /* Already open? */
+       if (hermes_read_reg(hw, HERMES_CONTROL) == desired_state)
+               return 0;
+
+       hermes_write_reg(hw, HERMES_PARAM0, HERMES_AUX_PW0);
+       hermes_write_reg(hw, HERMES_PARAM1, HERMES_AUX_PW1);
+       hermes_write_reg(hw, HERMES_PARAM2, HERMES_AUX_PW2);
+       hermes_write_reg(hw, HERMES_CONTROL, action);
+
+       for (i = 0; i < 20; i++) {
+               udelay(10);
+               if (hermes_read_reg(hw, HERMES_CONTROL) ==
+                   desired_state)
+                       return 0;
+       }
+
+       return -EBUSY;
+}
+
+/*** Plug Data Functions ***/
+
+/*
+ * Scan PDR for the record with the specified RECORD_ID.
+ * If it's not found, return NULL.
+ */
+static struct pdr *
+hermes_find_pdr(struct pdr *first_pdr, u32 record_id)
+{
+       struct pdr *pdr = first_pdr;
+       void *end = (void *)first_pdr + MAX_PDA_SIZE;
+
+       while (((void *)pdr < end) &&
+              (pdr_id(pdr) != PDI_END)) {
+               /*
+                * PDR area is currently not terminated by PDI_END.
+                * It's followed by CRC records, which have the type
+                * field where PDR has length.  The type can be 0 or 1.
+                */
+               if (pdr_len(pdr) < 2)
+                       return NULL;
+
+               /* If the record ID matches, we are done */
+               if (pdr_id(pdr) == record_id)
+                       return pdr;
+
+               pdr = (struct pdr *) pdr->next;
+       }
+       return NULL;
+}
+
+/* Scan production data items for a particular entry */
+static struct pdi *
+hermes_find_pdi(struct pdi *first_pdi, u32 record_id)
+{
+       struct pdi *pdi = first_pdi;
+
+       while (pdi_id(pdi) != PDI_END) {
+
+               /* If the record ID matches, we are done */
+               if (pdi_id(pdi) == record_id)
+                       return pdi;
+
+               pdi = (struct pdi *) &pdi->data[pdi_len(pdi)];
+       }
+       return NULL;
+}
+
+/* Process one Plug Data Item - find corresponding PDR and plug it */
+static int
+hermes_plug_pdi(hermes_t *hw, struct pdr *first_pdr, const struct pdi *pdi)
+{
+       struct pdr *pdr;
+
+       /* Find the PDR corresponding to this PDI */
+       pdr = hermes_find_pdr(first_pdr, pdi_id(pdi));
+
+       /* No match is found, safe to ignore */
+       if (!pdr)
+               return 0;
+
+       /* Lengths of the data in PDI and PDR must match */
+       if (pdi_len(pdi) != pdr_len(pdr))
+               return -EINVAL;
+
+       /* do the actual plugging */
+       hermes_aux_setaddr(hw, pdr_addr(pdr));
+       hermes_write_bytes(hw, HERMES_AUXDATA, pdi->data, pdi_len(pdi));
+
+       return 0;
+}
+
+/* Read PDA from the adapter */
+int hermes_read_pda(hermes_t *hw,
+                   __le16 *pda,
+                   u32 pda_addr,
+                   u16 pda_len,
+                   int use_eeprom) /* can we get this into hw? */
+{
+       int ret;
+       u16 pda_size;
+       u16 data_len = pda_len;
+       __le16 *data = pda;
+
+       if (use_eeprom) {
+               /* PDA of spectrum symbol is in eeprom */
+
+               /* Issue command to read EEPROM */
+               ret = hermes_docmd_wait(hw, HERMES_CMD_READMIF, 0, NULL);
+               if (ret)
+                       return ret;
+       } else {
+               /* wl_lkm does not include PDA size in the PDA area.
+                * We will pad the information into pda, so other routines
+                * don't have to be modified */
+               pda[0] = cpu_to_le16(pda_len - 2);
+                       /* Includes CFG_PROD_DATA but not itself */
+               pda[1] = cpu_to_le16(0x0800); /* CFG_PROD_DATA */
+               data_len = pda_len - 4;
+               data = pda + 2;
+       }
+
+       /* Open auxiliary port */
+       ret = hermes_aux_control(hw, 1);
+       printk(KERN_DEBUG PFX "AUX enable returned %d\n", ret);
+       if (ret)
+               return ret;
+
+       /* read PDA from EEPROM */
+       hermes_aux_setaddr(hw, pda_addr);
+       hermes_read_words(hw, HERMES_AUXDATA, data, data_len / 2);
+
+       /* Close aux port */
+       ret = hermes_aux_control(hw, 0);
+       printk(KERN_DEBUG PFX "AUX disable returned %d\n", ret);
+
+       /* Check PDA length */
+       pda_size = le16_to_cpu(pda[0]);
+       printk(KERN_DEBUG PFX "Actual PDA length %d, Max allowed %d\n",
+              pda_size, pda_len);
+       if (pda_size > pda_len)
+               return -EINVAL;
+
+       return 0;
+}
+EXPORT_SYMBOL(hermes_read_pda);
+
+/* Parse PDA and write the records into the adapter
+ *
+ * Attempt to write every records that is in the specified pda
+ * which also has a valid production data record for the firmware.
+ */
+int hermes_apply_pda(hermes_t *hw,
+                    const char *first_pdr,
+                    const __le16 *pda)
+{
+       int ret;
+       const struct pdi *pdi;
+       struct pdr *pdr;
+
+       pdr = (struct pdr *) first_pdr;
+
+       /* Go through every PDI and plug them into the adapter */
+       pdi = (const struct pdi *) (pda + 2);
+       while (pdi_id(pdi) != PDI_END) {
+               ret = hermes_plug_pdi(hw, pdr, pdi);
+               if (ret)
+                       return ret;
+
+               /* Increment to the next PDI */
+               pdi = (const struct pdi *) &pdi->data[pdi_len(pdi)];
+       }
+       return 0;
+}
+EXPORT_SYMBOL(hermes_apply_pda);
+
+/* Identify the total number of bytes in all blocks
+ * including the header data.
+ */
+size_t
+hermes_blocks_length(const char *first_block)
+{
+       const struct dblock *blk = (const struct dblock *) first_block;
+       int total_len = 0;
+       int len;
+
+       /* Skip all blocks to locate Plug Data References
+        * (Spectrum CS) */
+       while (dblock_addr(blk) != BLOCK_END) {
+               len = dblock_len(blk);
+               total_len += sizeof(*blk) + len;
+               blk = (struct dblock *) &blk->data[len];
+       }
+
+       return total_len;
+}
+EXPORT_SYMBOL(hermes_blocks_length);
+
+/*** Hermes programming ***/
+
+/* About to start programming data (Hermes I)
+ * offset is the entry point
+ *
+ * Spectrum_cs' Symbol fw does not require this
+ * wl_lkm Agere fw does
+ * Don't know about intersil
+ */
+int hermesi_program_init(hermes_t *hw, u32 offset)
+{
+       int err;
+
+       /* Disable interrupts?*/
+       /*hw->inten = 0x0;*/
+       /*hermes_write_regn(hw, INTEN, 0);*/
+       /*hermes_set_irqmask(hw, 0);*/
+
+       /* Acknowledge any outstanding command */
+       hermes_write_regn(hw, EVACK, 0xFFFF);
+
+       /* Using doicmd_wait rather than docmd_wait */
+       err = hermes_doicmd_wait(hw,
+                                0x0100 | HERMES_CMD_INIT,
+                                0, 0, 0, NULL);
+       if (err)
+               return err;
+
+       err = hermes_doicmd_wait(hw,
+                                0x0000 | HERMES_CMD_INIT,
+                                0, 0, 0, NULL);
+       if (err)
+               return err;
+
+       err = hermes_aux_control(hw, 1);
+       printk(KERN_DEBUG PFX "AUX enable returned %d\n", err);
+
+       if (err)
+               return err;
+
+       printk(KERN_DEBUG PFX "Enabling volatile, EP 0x%08x\n", offset);
+       err = hermes_doicmd_wait(hw,
+                                HERMES_PROGRAM_ENABLE_VOLATILE,
+                                offset & 0xFFFFu,
+                                offset >> 16,
+                                0,
+                                NULL);
+       printk(KERN_DEBUG PFX "PROGRAM_ENABLE returned %d\n",
+              err);
+
+       return err;
+}
+EXPORT_SYMBOL(hermesi_program_init);
+
+/* Done programming data (Hermes I)
+ *
+ * Spectrum_cs' Symbol fw does not require this
+ * wl_lkm Agere fw does
+ * Don't know about intersil
+ */
+int hermesi_program_end(hermes_t *hw)
+{
+       struct hermes_response resp;
+       int rc = 0;
+       int err;
+
+       rc = hermes_docmd_wait(hw, HERMES_PROGRAM_DISABLE, 0, &resp);
+
+       printk(KERN_DEBUG PFX "PROGRAM_DISABLE returned %d, "
+              "r0 0x%04x, r1 0x%04x, r2 0x%04x\n",
+              rc, resp.resp0, resp.resp1, resp.resp2);
+
+       if ((rc == 0) &&
+           ((resp.status & HERMES_STATUS_CMDCODE) != HERMES_CMD_DOWNLD))
+               rc = -EIO;
+
+       err = hermes_aux_control(hw, 0);
+       printk(KERN_DEBUG PFX "AUX disable returned %d\n", err);
+
+       /* Acknowledge any outstanding command */
+       hermes_write_regn(hw, EVACK, 0xFFFF);
+
+       /* Reinitialise, ignoring return */
+       (void) hermes_doicmd_wait(hw, 0x0000 | HERMES_CMD_INIT,
+                                 0, 0, 0, NULL);
+
+       return rc ? rc : err;
+}
+EXPORT_SYMBOL(hermesi_program_end);
+
+/* Program the data blocks */
+int hermes_program(hermes_t *hw, const char *first_block, const char *end)
+{
+       const struct dblock *blk;
+       u32 blkaddr;
+       u32 blklen;
+#if LIMIT_PROGRAM_SIZE
+       u32 addr;
+       u32 len;
+#endif
+
+       blk = (const struct dblock *) first_block;
+
+       if ((const char *) blk > (end - sizeof(*blk)))
+               return -EIO;
+
+       blkaddr = dblock_addr(blk);
+       blklen = dblock_len(blk);
+
+       while ((blkaddr != BLOCK_END) &&
+              (((const char *) blk + blklen) <= end)) {
+               printk(KERN_DEBUG PFX
+                      "Programming block of length %d to address 0x%08x\n",
+                      blklen, blkaddr);
+
+#if !LIMIT_PROGRAM_SIZE
+               /* wl_lkm driver splits this into writes of 2000 bytes */
+               hermes_aux_setaddr(hw, blkaddr);
+               hermes_write_bytes(hw, HERMES_AUXDATA, blk->data,
+                                  blklen);
+#else
+               len = (blklen < MAX_DL_SIZE) ? blklen : MAX_DL_SIZE;
+               addr = blkaddr;
+
+               while (addr < (blkaddr + blklen)) {
+                       printk(KERN_DEBUG PFX
+                              "Programming subblock of length %d "
+                              "to address 0x%08x. Data @ %p\n",
+                              len, addr, &blk->data[addr - blkaddr]);
+
+                       hermes_aux_setaddr(hw, addr);
+                       hermes_write_bytes(hw, HERMES_AUXDATA,
+                                          &blk->data[addr - blkaddr],
+                                          len);
+
+                       addr += len;
+                       len = ((blkaddr + blklen - addr) < MAX_DL_SIZE) ?
+                               (blkaddr + blklen - addr) : MAX_DL_SIZE;
+               }
+#endif
+               blk = (const struct dblock *) &blk->data[blklen];
+
+               if ((const char *) blk > (end - sizeof(*blk)))
+                       return -EIO;
+
+               blkaddr = dblock_addr(blk);
+               blklen = dblock_len(blk);
+       }
+       return 0;
+}
+EXPORT_SYMBOL(hermes_program);
+
+static int __init init_hermes_dld(void)
+{
+       return 0;
+}
+
+static void __exit exit_hermes_dld(void)
+{
+}
+
+module_init(init_hermes_dld);
+module_exit(exit_hermes_dld);
+
+/*** Default plugging data for Hermes I ***/
+/* Values from wl_lkm_718/hcf/dhf.c */
+
+#define DEFINE_DEFAULT_PDR(pid, length, data)                          \
+static const struct {                                                  \
+       __le16 len;                                                     \
+       __le16 id;                                                      \
+       u8 val[length];                                                 \
+} __attribute__ ((packed)) default_pdr_data_##pid = {                  \
+       __constant_cpu_to_le16((sizeof(default_pdr_data_##pid)/         \
+                               sizeof(__le16)) - 1),                   \
+       __constant_cpu_to_le16(pid),                                    \
+       data                                                            \
+}
+
+#define DEFAULT_PDR(pid) default_pdr_data_##pid
+
+/*  HWIF Compatiblity */
+DEFINE_DEFAULT_PDR(0x0005, 10, "\x00\x00\x06\x00\x01\x00\x01\x00\x01\x00");
+
+/* PPPPSign */
+DEFINE_DEFAULT_PDR(0x0108, 4, "\x00\x00\x00\x00");
+
+/* PPPPProf */
+DEFINE_DEFAULT_PDR(0x0109, 10, "\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00");
+
+/* Antenna diversity */
+DEFINE_DEFAULT_PDR(0x0150, 2, "\x00\x3F");
+
+/* Modem VCO band Set-up */
+DEFINE_DEFAULT_PDR(0x0160, 28,
+                  "\x00\x00\x00\x00\x00\x00\x00\x00"
+                  "\x00\x00\x00\x00\x00\x00\x00\x00"
+                  "\x00\x00\x00\x00\x00\x00\x00\x00"
+                  "\x00\x00\x00\x00");
+
+/* Modem Rx Gain Table Values */
+DEFINE_DEFAULT_PDR(0x0161, 256,
+                  "\x3F\x01\x3F\01\x3F\x01\x3F\x01"
+                  "\x3F\x01\x3F\01\x3F\x01\x3F\x01"
+                  "\x3F\x01\x3F\01\x3F\x01\x3F\x01"
+                  "\x3F\x01\x3F\01\x3F\x01\x3F\x01"
+                  "\x3F\x01\x3E\01\x3E\x01\x3D\x01"
+                  "\x3D\x01\x3C\01\x3C\x01\x3B\x01"
+                  "\x3B\x01\x3A\01\x3A\x01\x39\x01"
+                  "\x39\x01\x38\01\x38\x01\x37\x01"
+                  "\x37\x01\x36\01\x36\x01\x35\x01"
+                  "\x35\x01\x34\01\x34\x01\x33\x01"
+                  "\x33\x01\x32\x01\x32\x01\x31\x01"
+                  "\x31\x01\x30\x01\x30\x01\x7B\x01"
+                  "\x7B\x01\x7A\x01\x7A\x01\x79\x01"
+                  "\x79\x01\x78\x01\x78\x01\x77\x01"
+                  "\x77\x01\x76\x01\x76\x01\x75\x01"
+                  "\x75\x01\x74\x01\x74\x01\x73\x01"
+                  "\x73\x01\x72\x01\x72\x01\x71\x01"
+                  "\x71\x01\x70\x01\x70\x01\x68\x01"
+                  "\x68\x01\x67\x01\x67\x01\x66\x01"
+                  "\x66\x01\x65\x01\x65\x01\x57\x01"
+                  "\x57\x01\x56\x01\x56\x01\x55\x01"
+                  "\x55\x01\x54\x01\x54\x01\x53\x01"
+                  "\x53\x01\x52\x01\x52\x01\x51\x01"
+                  "\x51\x01\x50\x01\x50\x01\x48\x01"
+                  "\x48\x01\x47\x01\x47\x01\x46\x01"
+                  "\x46\x01\x45\x01\x45\x01\x44\x01"
+                  "\x44\x01\x43\x01\x43\x01\x42\x01"
+                  "\x42\x01\x41\x01\x41\x01\x40\x01"
+                  "\x40\x01\x40\x01\x40\x01\x40\x01"
+                  "\x40\x01\x40\x01\x40\x01\x40\x01"
+                  "\x40\x01\x40\x01\x40\x01\x40\x01"
+                  "\x40\x01\x40\x01\x40\x01\x40\x01");
+
+/* Write PDA according to certain rules.
+ *
+ * For every production data record, look for a previous setting in
+ * the pda, and use that.
+ *
+ * For certain records, use defaults if they are not found in pda.
+ */
+int hermes_apply_pda_with_defaults(hermes_t *hw,
+                                  const char *first_pdr,
+                                  const __le16 *pda)
+{
+       const struct pdr *pdr = (const struct pdr *) first_pdr;
+       struct pdi *first_pdi = (struct pdi *) &pda[2];
+       struct pdi *pdi;
+       struct pdi *default_pdi = NULL;
+       struct pdi *outdoor_pdi;
+       void *end = (void *)first_pdr + MAX_PDA_SIZE;
+       int record_id;
+
+       while (((void *)pdr < end) &&
+              (pdr_id(pdr) != PDI_END)) {
+               /*
+                * For spectrum_cs firmwares,
+                * PDR area is currently not terminated by PDI_END.
+                * It's followed by CRC records, which have the type
+                * field where PDR has length.  The type can be 0 or 1.
+                */
+               if (pdr_len(pdr) < 2)
+                       break;
+               record_id = pdr_id(pdr);
+
+               pdi = hermes_find_pdi(first_pdi, record_id);
+               if (pdi)
+                       printk(KERN_DEBUG PFX "Found record 0x%04x at %p\n",
+                              record_id, pdi);
+
+               switch (record_id) {
+               case 0x110: /* Modem REFDAC values */
+               case 0x120: /* Modem VGDAC values */
+                       outdoor_pdi = hermes_find_pdi(first_pdi, record_id + 1);
+                       default_pdi = NULL;
+                       if (outdoor_pdi) {
+                               pdi = outdoor_pdi;
+                               printk(KERN_DEBUG PFX
+                                      "Using outdoor record 0x%04x at %p\n",
+                                      record_id + 1, pdi);
+                       }
+                       break;
+               case 0x5: /*  HWIF Compatiblity */
+                       default_pdi = (struct pdi *) &DEFAULT_PDR(0x0005);
+                       break;
+               case 0x108: /* PPPPSign */
+                       default_pdi = (struct pdi *) &DEFAULT_PDR(0x0108);
+                       break;
+               case 0x109: /* PPPPProf */
+                       default_pdi = (struct pdi *) &DEFAULT_PDR(0x0109);
+                       break;
+               case 0x150: /* Antenna diversity */
+                       default_pdi = (struct pdi *) &DEFAULT_PDR(0x0150);
+                       break;
+               case 0x160: /* Modem VCO band Set-up */
+                       default_pdi = (struct pdi *) &DEFAULT_PDR(0x0160);
+                       break;
+               case 0x161: /* Modem Rx Gain Table Values */
+                       default_pdi = (struct pdi *) &DEFAULT_PDR(0x0161);
+                       break;
+               default:
+                       default_pdi = NULL;
+                       break;
+               }
+               if (!pdi && default_pdi) {
+                       /* Use default */
+                       pdi = default_pdi;
+                       printk(KERN_DEBUG PFX
+                              "Using default record 0x%04x at %p\n",
+                              record_id, pdi);
+               }
+
+               if (pdi) {
+                       /* Lengths of the data in PDI and PDR must match */
+                       if (pdi_len(pdi) == pdr_len(pdr)) {
+                               /* do the actual plugging */
+                               hermes_aux_setaddr(hw, pdr_addr(pdr));
+                               hermes_write_bytes(hw, HERMES_AUXDATA,
+                                                  pdi->data, pdi_len(pdi));
+                       }
+               }
+
+               pdr++;
+       }
+       return 0;
+}
+EXPORT_SYMBOL(hermes_apply_pda_with_defaults);
diff --git a/drivers/net/wireless/hermes_dld.h b/drivers/net/wireless/hermes_dld.h
new file mode 100644 (file)
index 0000000..6fcb262
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2007, David Kilroy
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License
+ * at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and
+ * limitations under the License.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * terms of the GNU General Public License version 2 (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of the
+ * above.  If you wish to allow the use of your version of this file
+ * only under the terms of the GPL and not to allow others to use your
+ * version of this file under the MPL, indicate your decision by
+ * deleting the provisions above and replace them with the notice and
+ * other provisions required by the GPL.  If you do not delete the
+ * provisions above, a recipient may use your version of this file
+ * under either the MPL or the GPL.
+ */
+#ifndef _HERMES_DLD_H
+#define _HERMES_DLD_H
+
+#include "hermes.h"
+
+int hermesi_program_init(hermes_t *hw, u32 offset);
+int hermesi_program_end(hermes_t *hw);
+int hermes_program(hermes_t *hw, const char *first_block, const char *end);
+
+int hermes_read_pda(hermes_t *hw,
+                   __le16 *pda,
+                   u32 pda_addr,
+                   u16 pda_len,
+                   int use_eeprom);
+int hermes_apply_pda(hermes_t *hw,
+                    const char *first_pdr,
+                    const __le16 *pda);
+int hermes_apply_pda_with_defaults(hermes_t *hw,
+                                  const char *first_pdr,
+                                  const __le16 *pda);
+
+size_t hermes_blocks_length(const char *first_block);
+
+#endif /* _HERMES_DLD_H */
index 4f46b4809e554d6858cf48dc01afd4465c2cb25c..42eb67dea1df20eeec73039f92808ee57d67725e 100644 (file)
@@ -30,6 +30,7 @@
 #define HERMES_RID_CNFWEPENABLED_AGERE         0xFC20
 #define HERMES_RID_CNFAUTHENTICATION_AGERE     0xFC21
 #define HERMES_RID_CNFMANDATORYBSSID_SYMBOL    0xFC21
+#define HERMES_RID_CNFDROPUNENCRYPTED          0xFC22
 #define HERMES_RID_CNFWEPDEFAULTKEYID          0xFC23
 #define HERMES_RID_CNFDEFAULTKEY0              0xFC24
 #define HERMES_RID_CNFDEFAULTKEY1              0xFC25
 #define HERMES_RID_CNFSCANSSID_AGERE           0xFCB2
 #define HERMES_RID_CNFBASICRATES               0xFCB3
 #define HERMES_RID_CNFSUPPORTEDRATES           0xFCB4
+#define HERMES_RID_CNFADDDEFAULTTKIPKEY_AGERE  0xFCB4
+#define HERMES_RID_CNFSETWPAAUTHMGMTSUITE_AGERE        0xFCB5
+#define HERMES_RID_CNFREMDEFAULTTKIPKEY_AGERE  0xFCB6
+#define HERMES_RID_CNFADDMAPPEDTKIPKEY_AGERE   0xFCB7
+#define HERMES_RID_CNFREMMAPPEDTKIPKEY_AGERE   0xFCB8
+#define HERMES_RID_CNFSETWPACAPABILITIES_AGERE 0xFCB9
+#define HERMES_RID_CNFCACHEDPMKADDRESS         0xFCBA
+#define HERMES_RID_CNFREMOVEPMKADDRESS         0xFCBB
+#define HERMES_RID_CNFSCANCHANNELS2GHZ         0xFCC2
+#define HERMES_RID_CNFDISASSOCIATE             0xFCC8
 #define HERMES_RID_CNFTICKTIME                 0xFCE0
 #define HERMES_RID_CNFSCANREQUEST              0xFCE1
 #define HERMES_RID_CNFJOINREQUEST              0xFCE2
 #define HERMES_RID_CURRENTTXRATE6              0xFD85
 #define HERMES_RID_OWNMACADDR                  0xFD86
 #define HERMES_RID_SCANRESULTSTABLE            0xFD88
+#define HERMES_RID_CURRENT_COUNTRY_INFO                0xFD89
+#define HERMES_RID_CURRENT_WPA_IE              0xFD8A
+#define HERMES_RID_CURRENT_TKIP_IV             0xFD8B
+#define HERMES_RID_CURRENT_ASSOC_REQ_INFO      0xFD8C
+#define HERMES_RID_CURRENT_ASSOC_RESP_INFO     0xFD8D
+#define HERMES_RID_TXQUEUEEMPTY                        0xFD91
 #define HERMES_RID_PHYTYPE                     0xFDC0
 #define HERMES_RID_CURRENTCHANNEL              0xFDC1
 #define HERMES_RID_CURRENTPOWERSTATE           0xFDC2
index 19a401c4a0dcd507f23d89db9100bcb2415385d4..bca74811bc7ff34dd946d6ef0c5b852b54165935 100644 (file)
@@ -211,7 +211,7 @@ static u32 ipw2100_debug_level = IPW_DL_NONE;
 do { \
        if (ipw2100_debug_level & (level)) { \
                printk(KERN_DEBUG "ipw2100: %c %s ", \
-                       in_interrupt() ? 'I' : 'U',  __FUNCTION__); \
+                       in_interrupt() ? 'I' : 'U',  __func__); \
                printk(message); \
        } \
 } while (0)
index d4ab28b73b321542fcf5e3d03503be5fc15f2127..0bad1ec3e7e0af7c9594d6cdc2deb0cce002811a 100644 (file)
@@ -1394,13 +1394,13 @@ BIT_ARG16(x)
 #define IPW_DEBUG(level, fmt, args...) \
 do { if (ipw_debug_level & (level)) \
   printk(KERN_DEBUG DRV_NAME": %c %s " fmt, \
-         in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0)
+         in_interrupt() ? 'I' : 'U', __func__ , ## args); } while (0)
 
 #ifdef CONFIG_IPW2200_DEBUG
 #define IPW_LL_DEBUG(level, fmt, args...) \
 do { if (ipw_debug_level & (level)) \
   printk(KERN_DEBUG DRV_NAME": %c %s " fmt, \
-         in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0)
+         in_interrupt() ? 'I' : 'U', __func__ , ## args); } while (0)
 #else
 #define IPW_LL_DEBUG(level, fmt, args...) do {} while (0)
 #endif                         /* CONFIG_IPW2200_DEBUG */
index f1d002f7b790715fdcd40076316c82fa04e8223a..33016fb5e9b3c01d3e0e9af04bf023b239bab0c4 100644 (file)
@@ -34,12 +34,12 @@ extern u32 iwl3945_debug_level;
 #define IWL_DEBUG(level, fmt, args...) \
 do { if (iwl3945_debug_level & (level)) \
   printk(KERN_ERR DRV_NAME": %c %s " fmt, \
-        in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0)
+        in_interrupt() ? 'I' : 'U', __func__ , ## args); } while (0)
 
 #define IWL_DEBUG_LIMIT(level, fmt, args...) \
 do { if ((iwl3945_debug_level & (level)) && net_ratelimit()) \
   printk(KERN_ERR DRV_NAME": %c %s " fmt, \
-        in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0)
+        in_interrupt() ? 'I' : 'U', __func__ , ## args); } while (0)
 
 static inline void iwl3945_print_hex_dump(int level, void *p, u32 len)
 {
index 3f51f36353449bdf0eaa8afa6c2fc1ec2bb39665..8dc26adc1975bc7c4e6f37f51fec0a6ab6256278 100644 (file)
@@ -531,99 +531,6 @@ static int iwl3945_is_network_packet(struct iwl3945_priv *priv,
        }
 }
 
-static void iwl3945_add_radiotap(struct iwl3945_priv *priv,
-                                struct sk_buff *skb,
-                                struct iwl3945_rx_frame_hdr *rx_hdr,
-                                struct ieee80211_rx_status *stats)
-{
-       /* First cache any information we need before we overwrite
-        * the information provided in the skb from the hardware */
-       s8 signal = stats->signal;
-       s8 noise = 0;
-       int rate = stats->rate_idx;
-       u64 tsf = stats->mactime;
-       __le16 phy_flags_hw = rx_hdr->phy_flags, antenna;
-
-       struct iwl3945_rt_rx_hdr {
-               struct ieee80211_radiotap_header rt_hdr;
-               __le64 rt_tsf;          /* TSF */
-               u8 rt_flags;            /* radiotap packet flags */
-               u8 rt_rate;             /* rate in 500kb/s */
-               __le16 rt_channelMHz;   /* channel in MHz */
-               __le16 rt_chbitmask;    /* channel bitfield */
-               s8 rt_dbmsignal;        /* signal in dBm, kluged to signed */
-               s8 rt_dbmnoise;
-               u8 rt_antenna;          /* antenna number */
-       } __attribute__ ((packed)) *iwl3945_rt;
-
-       if (skb_headroom(skb) < sizeof(*iwl3945_rt)) {
-               if (net_ratelimit())
-                       printk(KERN_ERR "not enough headroom [%d] for "
-                              "radiotap head [%zd]\n",
-                              skb_headroom(skb), sizeof(*iwl3945_rt));
-               return;
-       }
-
-       /* put radiotap header in front of 802.11 header and data */
-       iwl3945_rt = (void *)skb_push(skb, sizeof(*iwl3945_rt));
-
-       /* initialise radiotap header */
-       iwl3945_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION;
-       iwl3945_rt->rt_hdr.it_pad = 0;
-
-       /* total header + data */
-       put_unaligned_le16(sizeof(*iwl3945_rt), &iwl3945_rt->rt_hdr.it_len);
-
-       /* Indicate all the fields we add to the radiotap header */
-       put_unaligned_le32((1 << IEEE80211_RADIOTAP_TSFT) |
-                          (1 << IEEE80211_RADIOTAP_FLAGS) |
-                          (1 << IEEE80211_RADIOTAP_RATE) |
-                          (1 << IEEE80211_RADIOTAP_CHANNEL) |
-                          (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |
-                          (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) |
-                          (1 << IEEE80211_RADIOTAP_ANTENNA),
-                       &iwl3945_rt->rt_hdr.it_present);
-
-       /* Zero the flags, we'll add to them as we go */
-       iwl3945_rt->rt_flags = 0;
-
-       put_unaligned_le64(tsf, &iwl3945_rt->rt_tsf);
-
-       iwl3945_rt->rt_dbmsignal = signal;
-       iwl3945_rt->rt_dbmnoise = noise;
-
-       /* Convert the channel frequency and set the flags */
-       put_unaligned_le16(stats->freq, &iwl3945_rt->rt_channelMHz);
-       if (!(phy_flags_hw & RX_RES_PHY_FLAGS_BAND_24_MSK))
-               put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ,
-                             &iwl3945_rt->rt_chbitmask);
-       else if (phy_flags_hw & RX_RES_PHY_FLAGS_MOD_CCK_MSK)
-               put_unaligned_le16(IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ,
-                             &iwl3945_rt->rt_chbitmask);
-       else    /* 802.11g */
-               put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ,
-                             &iwl3945_rt->rt_chbitmask);
-
-       if (rate == -1)
-               iwl3945_rt->rt_rate = 0;
-       else {
-               if (stats->band == IEEE80211_BAND_5GHZ)
-                       rate += IWL_FIRST_OFDM_RATE;
-
-               iwl3945_rt->rt_rate = iwl3945_rates[rate].ieee;
-       }
-
-       /* antenna number */
-       antenna = phy_flags_hw & RX_RES_PHY_FLAGS_ANTENNA_MSK;
-       iwl3945_rt->rt_antenna = le16_to_cpu(antenna) >> 4;
-
-       /* set the preamble flag if we have it */
-       if (phy_flags_hw & RX_RES_PHY_FLAGS_SHORT_PREAMBLE_MSK)
-               iwl3945_rt->rt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
-
-       stats->flag |= RX_FLAG_RADIOTAP;
-}
-
 static void iwl3945_pass_packet_to_mac80211(struct iwl3945_priv *priv,
                                   struct iwl3945_rx_mem_buffer *rxb,
                                   struct ieee80211_rx_status *stats)
@@ -657,9 +564,6 @@ static void iwl3945_pass_packet_to_mac80211(struct iwl3945_priv *priv,
                iwl3945_set_decrypted_flag(priv, rxb->skb,
                                       le32_to_cpu(rx_end->status), stats);
 
-       if (priv->add_radiotap)
-               iwl3945_add_radiotap(priv, rxb->skb, rx_hdr, stats);
-
 #ifdef CONFIG_IWL3945_LEDS
        if (ieee80211_is_data(hdr->frame_control))
                priv->rxtxpackets += len;
@@ -684,7 +588,6 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv,
        u16 rx_stats_noise_diff = le16_to_cpu(rx_stats->noise_diff);
        u8 network_packet;
 
-       rx_status.antenna = 0;
        rx_status.flag = 0;
        rx_status.mactime = le64_to_cpu(rx_end->timestamp);
        rx_status.freq =
@@ -696,6 +599,13 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv,
        if (rx_status.band == IEEE80211_BAND_5GHZ)
                rx_status.rate_idx -= IWL_FIRST_OFDM_RATE;
 
+       rx_status.antenna = le16_to_cpu(rx_hdr->phy_flags &
+                                       RX_RES_PHY_FLAGS_ANTENNA_MSK) >> 4;
+
+       /* set the preamble flag if appropriate */
+       if (rx_hdr->phy_flags & RX_RES_PHY_FLAGS_SHORT_PREAMBLE_MSK)
+               rx_status.flag |= RX_FLAG_SHORTPRE;
+
        if ((unlikely(rx_stats->phy_count > 20))) {
                IWL_DEBUG_DROP
                    ("dsp size out of range [0,20]: "
index fa81ba1af3d3266cdff3f63bb9bb91e6f0b20d1e..4dd3f0dbe07b4178642b7a391ff06b76f425b5a3 100644 (file)
@@ -707,7 +707,6 @@ struct iwl3945_priv {
 
        enum ieee80211_band band;
        int alloc_rxb_skb;
-       bool add_radiotap;
 
        void (*rx_handlers[REPLY_MAX])(struct iwl3945_priv *priv,
                                       struct iwl3945_rx_mem_buffer *rxb);
index 061ffba9c884c017c00970bc2a148fd3d6dc0602..676fc0acedee64b47daeed19a8e98a82da0f12f6 100644 (file)
@@ -2790,8 +2790,6 @@ static int iwl4965_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *co
        mutex_lock(&priv->mutex);
        IWL_DEBUG_MAC80211("enter to channel %d\n", conf->channel->hw_value);
 
-       priv->add_radiotap = !!(conf->flags & IEEE80211_CONF_RADIOTAP);
-
        if (conf->radio_enabled && iwl_radio_kill_sw_enable_radio(priv)) {
                IWL_DEBUG_MAC80211("leave - RF-KILL - waiting for uCode\n");
                goto out;
index c72f72579beaeb2f70e2760a695f7b9268a533ab..fbf75a62958dd85f1d493ca8978219fa5f3df691 100644 (file)
@@ -876,7 +876,6 @@ int iwl_init_drv(struct iwl_priv *priv)
        spin_lock_init(&priv->power_data.lock);
        spin_lock_init(&priv->sta_lock);
        spin_lock_init(&priv->hcmd_lock);
-       spin_lock_init(&priv->lq_mngr.lock);
 
        INIT_LIST_HEAD(&priv->free_frames);
 
index d2daa174df220b634cc0d76cc166bbe0b7de703f..e548d67f87fd400583d1ff61ab06d24f78a2885b 100644 (file)
@@ -110,11 +110,12 @@ static inline void iwl_dbgfs_unregister(struct iwl_priv *priv)
  *
  */
 
-#define IWL_DL_INFO          (1 << 0)
-#define IWL_DL_MAC80211      (1 << 1)
-#define IWL_DL_HOST_COMMAND  (1 << 2)
-#define IWL_DL_STATE         (1 << 3)
+#define IWL_DL_INFO            (1 << 0)
+#define IWL_DL_MAC80211                (1 << 1)
+#define IWL_DL_HCMD            (1 << 2)
+#define IWL_DL_STATE           (1 << 3)
 #define IWL_DL_MACDUMP         (1 << 4)
+#define IWL_DL_HCMD_DUMP       (1 << 5)
 #define IWL_DL_RADIO         (1 << 7)
 #define IWL_DL_POWER         (1 << 8)
 #define IWL_DL_TEMP          (1 << 9)
@@ -162,7 +163,8 @@ static inline void iwl_dbgfs_unregister(struct iwl_priv *priv)
 #define IWL_DEBUG_ISR(f, a...)    IWL_DEBUG(IWL_DL_ISR, f, ## a)
 #define IWL_DEBUG_LED(f, a...) IWL_DEBUG(IWL_DL_LED, f, ## a)
 #define IWL_DEBUG_WEP(f, a...)    IWL_DEBUG(IWL_DL_WEP, f, ## a)
-#define IWL_DEBUG_HC(f, a...) IWL_DEBUG(IWL_DL_HOST_COMMAND, f, ## a)
+#define IWL_DEBUG_HC(f, a...) IWL_DEBUG(IWL_DL_HCMD, f, ## a)
+#define IWL_DEBUG_HC_DUMP(f, a...) IWL_DEBUG(IWL_DL_HCMD_DUMP, f, ## a)
 #define IWL_DEBUG_CALIB(f, a...) IWL_DEBUG(IWL_DL_CALIB, f, ## a)
 #define IWL_DEBUG_FW(f, a...) IWL_DEBUG(IWL_DL_FW, f, ## a)
 #define IWL_DEBUG_RF_KILL(f, a...) IWL_DEBUG(IWL_DL_RF_KILL, f, ## a)
index c19db438306cf9fc914b8b05bb278bf1fb417737..f46e9cd1ca192dfd4f2b3f29e3a558a13ab597f6 100644 (file)
@@ -672,18 +672,6 @@ struct iwl_kw {
 
 #define TX_POWER_IWL_ILLEGAL_VOLTAGE -10000
 
-struct iwl4965_lq_mngr {
-       spinlock_t lock;
-       s32 max_window_size;
-       s32 *expected_tpt;
-       u8 *next_higher_rate;
-       u8 *next_lower_rate;
-       unsigned long stamp;
-       unsigned long stamp_last;
-       u32 flush_time;
-       u32 tx_packets;
-};
-
 /* Sensitivity and chain noise calibration */
 #define INTERFERENCE_DATA_AVAILABLE    __constant_cpu_to_le32(1)
 #define INITIALIZATION_VALUE           0xFFFF
@@ -829,7 +817,6 @@ struct iwl_priv {
 
        enum ieee80211_band band;
        int alloc_rxb_skb;
-       bool add_radiotap;
 
        void (*rx_handlers[REPLY_MAX])(struct iwl_priv *priv,
                                       struct iwl_rx_mem_buffer *rxb);
@@ -939,9 +926,6 @@ struct iwl_priv {
        struct iwl_ht_info current_ht_config;
        u8 last_phy_res[100];
 
-       /* Rate scaling data */
-       struct iwl4965_lq_mngr lq_mngr;
-
        /* Rate scaling data */
        s8 data_retry_limit;
        u8 retry_rate;
index 2eb03eea1908f166c24a86aee7d1d5303e5443bc..8300f3d00a0691ff52d5d65c0340779c28b9128a 100644 (file)
@@ -120,8 +120,18 @@ static int iwl_generic_cmd_callback(struct iwl_priv *priv,
                return 1;
        }
 
-       IWL_DEBUG_HC("back from %s (0x%08X)\n",
-                       get_cmd_string(cmd->hdr.cmd), pkt->hdr.flags);
+#ifdef CONFIG_IWLWIFI_DEBUG
+       switch (cmd->hdr.cmd) {
+       case REPLY_TX_LINK_QUALITY_CMD:
+       case SENSITIVITY_CMD:
+               IWL_DEBUG_HC_DUMP("back from %s (0x%08X)\n",
+                               get_cmd_string(cmd->hdr.cmd), pkt->hdr.flags);
+                               break;
+       default:
+               IWL_DEBUG_HC("back from %s (0x%08X)\n",
+                               get_cmd_string(cmd->hdr.cmd), pkt->hdr.flags);
+       }
+#endif
 
        /* Let iwl_tx_complete free the response skb */
        return 1;
index f3f6ea49fdd2d0f287e2d0ca891483dd8faf97bd..b92a580ed2f9c1fb0081c844b0bcf598512c34f9 100644 (file)
@@ -789,107 +789,6 @@ static inline void iwl_dbg_report_frame(struct iwl_priv *priv,
 }
 #endif
 
-static void iwl_add_radiotap(struct iwl_priv *priv,
-                                struct sk_buff *skb,
-                                struct iwl_rx_phy_res *rx_start,
-                                struct ieee80211_rx_status *stats,
-                                u32 ampdu_status)
-{
-       s8 signal = stats->signal;
-       s8 noise = 0;
-       int rate = stats->rate_idx;
-       u64 tsf = stats->mactime;
-       __le16 antenna;
-       __le16 phy_flags_hw = rx_start->phy_flags;
-       struct iwl4965_rt_rx_hdr {
-               struct ieee80211_radiotap_header rt_hdr;
-               __le64 rt_tsf;          /* TSF */
-               u8 rt_flags;            /* radiotap packet flags */
-               u8 rt_rate;             /* rate in 500kb/s */
-               __le16 rt_channelMHz;   /* channel in MHz */
-               __le16 rt_chbitmask;    /* channel bitfield */
-               s8 rt_dbmsignal;        /* signal in dBm, kluged to signed */
-               s8 rt_dbmnoise;
-               u8 rt_antenna;          /* antenna number */
-       } __attribute__ ((packed)) *iwl4965_rt;
-
-       /* TODO: We won't have enough headroom for HT frames. Fix it later. */
-       if (skb_headroom(skb) < sizeof(*iwl4965_rt)) {
-               if (net_ratelimit())
-                       printk(KERN_ERR "not enough headroom [%d] for "
-                              "radiotap head [%zd]\n",
-                              skb_headroom(skb), sizeof(*iwl4965_rt));
-               return;
-       }
-
-       /* put radiotap header in front of 802.11 header and data */
-       iwl4965_rt = (void *)skb_push(skb, sizeof(*iwl4965_rt));
-
-       /* initialise radiotap header */
-       iwl4965_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION;
-       iwl4965_rt->rt_hdr.it_pad = 0;
-
-       /* total header + data */
-       put_unaligned_le16(sizeof(*iwl4965_rt), &iwl4965_rt->rt_hdr.it_len);
-
-       /* Indicate all the fields we add to the radiotap header */
-       put_unaligned_le32((1 << IEEE80211_RADIOTAP_TSFT) |
-                          (1 << IEEE80211_RADIOTAP_FLAGS) |
-                          (1 << IEEE80211_RADIOTAP_RATE) |
-                          (1 << IEEE80211_RADIOTAP_CHANNEL) |
-                          (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |
-                          (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) |
-                          (1 << IEEE80211_RADIOTAP_ANTENNA),
-                          &(iwl4965_rt->rt_hdr.it_present));
-
-       /* Zero the flags, we'll add to them as we go */
-       iwl4965_rt->rt_flags = 0;
-
-       put_unaligned_le64(tsf, &iwl4965_rt->rt_tsf);
-
-       iwl4965_rt->rt_dbmsignal = signal;
-       iwl4965_rt->rt_dbmnoise = noise;
-
-       /* Convert the channel frequency and set the flags */
-       put_unaligned(cpu_to_le16(stats->freq), &iwl4965_rt->rt_channelMHz);
-       if (!(phy_flags_hw & RX_RES_PHY_FLAGS_BAND_24_MSK))
-               put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ,
-                                  &iwl4965_rt->rt_chbitmask);
-       else if (phy_flags_hw & RX_RES_PHY_FLAGS_MOD_CCK_MSK)
-               put_unaligned_le16(IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ,
-                                  &iwl4965_rt->rt_chbitmask);
-       else    /* 802.11g */
-               put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ,
-                                  &iwl4965_rt->rt_chbitmask);
-
-       if (rate == -1)
-               iwl4965_rt->rt_rate = 0;
-       else
-               iwl4965_rt->rt_rate = iwl_rates[rate].ieee;
-
-       /*
-        * "antenna number"
-        *
-        * It seems that the antenna field in the phy flags value
-        * is actually a bitfield. This is undefined by radiotap,
-        * it wants an actual antenna number but I always get "7"
-        * for most legacy frames I receive indicating that the
-        * same frame was received on all three RX chains.
-        *
-        * I think this field should be removed in favour of a
-        * new 802.11n radiotap field "RX chains" that is defined
-        * as a bitmask.
-        */
-       antenna = phy_flags_hw & RX_RES_PHY_FLAGS_ANTENNA_MSK;
-       iwl4965_rt->rt_antenna = le16_to_cpu(antenna) >> 4;
-
-       /* set the preamble flag if appropriate */
-       if (phy_flags_hw & RX_RES_PHY_FLAGS_SHORT_PREAMBLE_MSK)
-               iwl4965_rt->rt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
-
-       stats->flag |= RX_FLAG_RADIOTAP;
-}
-
 static void iwl_update_rx_stats(struct iwl_priv *priv, u16 fc, u16 len)
 {
        /* 0 - mgmt, 1 - cnt, 2 - data */
@@ -1074,9 +973,6 @@ static void iwl_pass_packet_to_mac80211(struct iwl_priv *priv,
            iwl_set_decrypted_flag(priv, hdr, ampdu_status, stats))
                return;
 
-       if (priv->add_radiotap)
-               iwl_add_radiotap(priv, rxb->skb, rx_start, stats, ampdu_status);
-
        iwl_update_rx_stats(priv, le16_to_cpu(hdr->frame_control), len);
        ieee80211_rx_irqsafe(priv->hw, rxb->skb, stats);
        priv->alloc_rxb_skb--;
@@ -1171,7 +1067,6 @@ void iwl_rx_reply_rx(struct iwl_priv *priv,
        if (rx_status.band == IEEE80211_BAND_5GHZ)
                rx_status.rate_idx -= IWL_FIRST_OFDM_RATE;
 
-       rx_status.antenna = 0;
        rx_status.flag = 0;
        rx_status.flag |= RX_FLAG_TSFT;
 
@@ -1250,6 +1145,26 @@ void iwl_rx_reply_rx(struct iwl_priv *priv,
                rx_status.signal, rx_status.noise, rx_status.signal,
                (unsigned long long)rx_status.mactime);
 
+       /*
+        * "antenna number"
+        *
+        * It seems that the antenna field in the phy flags value
+        * is actually a bitfield. This is undefined by radiotap,
+        * it wants an actual antenna number but I always get "7"
+        * for most legacy frames I receive indicating that the
+        * same frame was received on all three RX chains.
+        *
+        * I think this field should be removed in favour of a
+        * new 802.11n radiotap field "RX chains" that is defined
+        * as a bitmask.
+        */
+       rx_status.antenna = le16_to_cpu(rx_start->phy_flags &
+                                       RX_RES_PHY_FLAGS_ANTENNA_MSK) >> 4;
+
+       /* set the preamble flag if appropriate */
+       if (rx_start->phy_flags & RX_RES_PHY_FLAGS_SHORT_PREAMBLE_MSK)
+               rx_status.flag |= RX_FLAG_SHORTPRE;
+
        /* Take shortcut when only in monitor mode */
        if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) {
                iwl_pass_packet_to_mac80211(priv, include_phy,
index d82823b5c8abce08948fad392cd9e8c3368aabf5..6cba5e9c54ecf932db0911fbb702c82cd0ecbb68 100644 (file)
@@ -126,7 +126,7 @@ int iwl_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv, void *ptr,
        u32 num_tbs = IWL_GET_BITS(*tfd, num_tbs);
 
        /* Each TFD can point to a maximum 20 Tx buffers */
-       if ((num_tbs >= MAX_NUM_OF_TBS) || (num_tbs < 0)) {
+       if (num_tbs >= MAX_NUM_OF_TBS) {
                IWL_ERROR("Error can not send more than %d chunks\n",
                          MAX_NUM_OF_TBS);
                return -EINVAL;
@@ -824,7 +824,7 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
 
        spin_unlock_irqrestore(&priv->lock, flags);
 
-       hdr_len = ieee80211_get_hdrlen(le16_to_cpu(fc));
+       hdr_len = ieee80211_hdrlen(fc);
 
        /* Find (or create) index into station table for destination station */
        sta_id = iwl_get_sta_id(priv, hdr);
@@ -842,7 +842,7 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
        txq_id = swq_id;
        if (ieee80211_is_data_qos(fc)) {
                qc = ieee80211_get_qos_ctl(hdr);
-               tid = qc[0] & 0xf;
+               tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
                seq_number = priv->stations[sta_id].tid[tid].seq_number;
                seq_number &= IEEE80211_SCTL_SEQ;
                hdr->seq_ctrl = hdr->seq_ctrl &
@@ -1065,12 +1065,26 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
        phys_addr += offsetof(struct iwl_cmd, hdr);
        iwl_hw_txq_attach_buf_to_tfd(priv, tfd, phys_addr, fix_size);
 
-       IWL_DEBUG_HC("Sending command %s (#%x), seq: 0x%04X, "
-                    "%d bytes at %d[%d]:%d\n",
-                    get_cmd_string(out_cmd->hdr.cmd),
-                    out_cmd->hdr.cmd, le16_to_cpu(out_cmd->hdr.sequence),
-                    fix_size, q->write_ptr, idx, IWL_CMD_QUEUE_NUM);
-
+#ifdef CONFIG_IWLWIFI_DEBUG
+       switch (out_cmd->hdr.cmd) {
+       case REPLY_TX_LINK_QUALITY_CMD:
+       case SENSITIVITY_CMD:
+               IWL_DEBUG_HC_DUMP("Sending command %s (#%x), seq: 0x%04X, "
+                               "%d bytes at %d[%d]:%d\n",
+                               get_cmd_string(out_cmd->hdr.cmd),
+                               out_cmd->hdr.cmd,
+                               le16_to_cpu(out_cmd->hdr.sequence), fix_size,
+                               q->write_ptr, idx, IWL_CMD_QUEUE_NUM);
+                               break;
+       default:
+               IWL_DEBUG_HC("Sending command %s (#%x), seq: 0x%04X, "
+                               "%d bytes at %d[%d]:%d\n",
+                               get_cmd_string(out_cmd->hdr.cmd),
+                               out_cmd->hdr.cmd,
+                               le16_to_cpu(out_cmd->hdr.sequence), fix_size,
+                               q->write_ptr, idx, IWL_CMD_QUEUE_NUM);
+       }
+#endif
        txq->need_update = 1;
 
        /* Set up entry in queue's byte count circular buffer */
index b775d5bab66835c40ac87812305bf405951489f6..a622fc33590a3517aacb86afc729cb397c19baad 100644 (file)
@@ -2574,7 +2574,7 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb)
 
        spin_unlock_irqrestore(&priv->lock, flags);
 
-       hdr_len = ieee80211_get_hdrlen(le16_to_cpu(fc));
+       hdr_len = ieee80211_hdrlen(fc);
 
        /* Find (or create) index into station table for destination station */
        sta_id = iwl3945_get_sta_id(priv, hdr);
@@ -2590,7 +2590,7 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb)
 
        if (ieee80211_is_data_qos(fc)) {
                qc = ieee80211_get_qos_ctl(hdr);
-               tid = qc[0] & 0xf;
+               tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
                seq_number = priv->stations[sta_id].tid[tid].seq_number &
                                IEEE80211_SCTL_SEQ;
                hdr->seq_ctrl = cpu_to_le16(seq_number) |
@@ -2709,7 +2709,7 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb)
                           sizeof(out_cmd->cmd.tx));
 
        iwl3945_print_hex_dump(IWL_DL_TX, (u8 *)out_cmd->cmd.tx.hdr,
-                          ieee80211_get_hdrlen(le16_to_cpu(fc)));
+                          ieee80211_hdrlen(fc));
 
        /* Tell device the write index *just past* this latest filled TFD */
        q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd);
@@ -6650,8 +6650,6 @@ static int iwl3945_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *co
        mutex_lock(&priv->mutex);
        IWL_DEBUG_MAC80211("enter to channel %d\n", conf->channel->hw_value);
 
-       priv->add_radiotap = !!(conf->flags & IEEE80211_CONF_RADIOTAP);
-
        if (!iwl3945_is_ready(priv)) {
                IWL_DEBUG_MAC80211("leave - not ready\n");
                ret = -EIO;
index 75427e61898dfbecb84d7db4024e34ae254e723b..af5fd709887fddb59b246e8b3ebcc7c7546f343f 100644 (file)
@@ -1033,9 +1033,9 @@ int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,
        return ret;
 }
 
-int lbs_mesh_config_send(struct lbs_private *priv,
-                        struct cmd_ds_mesh_config *cmd,
-                        uint16_t action, uint16_t type)
+static int __lbs_mesh_config_send(struct lbs_private *priv,
+                                 struct cmd_ds_mesh_config *cmd,
+                                 uint16_t action, uint16_t type)
 {
        int ret;
 
@@ -1054,6 +1054,19 @@ int lbs_mesh_config_send(struct lbs_private *priv,
        return ret;
 }
 
+int lbs_mesh_config_send(struct lbs_private *priv,
+                        struct cmd_ds_mesh_config *cmd,
+                        uint16_t action, uint16_t type)
+{
+       int ret;
+
+       if (!(priv->fwcapinfo & FW_CAPINFO_PERSISTENT_CONFIG))
+               return -EOPNOTSUPP;
+
+       ret = __lbs_mesh_config_send(priv, cmd, action, type);
+       return ret;
+}
+
 /* This function is the CMD_MESH_CONFIG legacy function.  It only handles the
  * START and STOP actions.  The extended actions supported by CMD_MESH_CONFIG
  * are all handled by preparing a struct cmd_ds_mesh_config and passing it to
@@ -1095,7 +1108,7 @@ int lbs_mesh_config(struct lbs_private *priv, uint16_t action, uint16_t chan)
                    action, priv->mesh_tlv, chan,
                    escape_essid(priv->mesh_ssid, priv->mesh_ssid_len));
 
-       return lbs_mesh_config_send(priv, &cmd, action, priv->mesh_tlv);
+       return __lbs_mesh_config_send(priv, &cmd, action, priv->mesh_tlv);
 }
 
 static int lbs_cmd_bcn_ctrl(struct lbs_private * priv,
index 12e687550bcefd6b7be7f5d30a7bcc6ac75551fb..4b2428ac2223805843c498c186b10004633dc220 100644 (file)
@@ -243,6 +243,9 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
 
 #define        CMD_F_HOSTCMD           (1 << 0)
 #define FW_CAPINFO_WPA         (1 << 0)
+#define FW_CAPINFO_FIRMWARE_UPGRADE    (1 << 13)
+#define FW_CAPINFO_BOOT2_UPGRADE       (1<<14)
+#define FW_CAPINFO_PERSISTENT_CONFIG   (1<<15)
 
 #define KEY_LEN_WPA_AES                        16
 #define KEY_LEN_WPA_TKIP               32
@@ -316,7 +319,8 @@ enum PS_STATE {
 enum DNLD_STATE {
        DNLD_RES_RECEIVED,
        DNLD_DATA_SENT,
-       DNLD_CMD_SENT
+       DNLD_CMD_SENT,
+       DNLD_BOOTCMD_SENT,
 };
 
 /** LBS_MEDIA_STATE */
index 04d7a251e3f0c75a9c0084ca6cd401f7bbd980d0..92837a2dd6d5787516028ef558185513b7d159e8 100644 (file)
@@ -720,7 +720,7 @@ static int if_cs_host_to_card(struct lbs_private *priv,
                ret = if_cs_send_cmd(priv, buf, nb);
                break;
        default:
-               lbs_pr_err("%s: unsupported type %d\n", __FUNCTION__, type);
+               lbs_pr_err("%s: unsupported type %d\n", __func__, type);
        }
 
        lbs_deb_leave_args(LBS_DEB_CS, "ret %d", ret);
index 632c291404ab5ccbbe7a7a862f24ab600aca8fa8..7b02d612b0764d36ce0008377ea95bb31f2d0f22 100644 (file)
@@ -39,7 +39,10 @@ MODULE_DEVICE_TABLE(usb, if_usb_table);
 
 static void if_usb_receive(struct urb *urb);
 static void if_usb_receive_fwload(struct urb *urb);
-static int if_usb_prog_firmware(struct if_usb_card *cardp);
+static int __if_usb_prog_firmware(struct if_usb_card *cardp,
+                                       const char *fwname, int cmd);
+static int if_usb_prog_firmware(struct if_usb_card *cardp,
+                                       const char *fwname, int cmd);
 static int if_usb_host_to_card(struct lbs_private *priv, uint8_t type,
                               uint8_t *payload, uint16_t nb);
 static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload,
@@ -48,6 +51,62 @@ static void if_usb_free(struct if_usb_card *cardp);
 static int if_usb_submit_rx_urb(struct if_usb_card *cardp);
 static int if_usb_reset_device(struct if_usb_card *cardp);
 
+/* sysfs hooks */
+
+/**
+ *  Set function to write firmware to device's persistent memory
+ */
+static ssize_t if_usb_firmware_set(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t count)
+{
+       struct lbs_private *priv = to_net_dev(dev)->priv;
+       struct if_usb_card *cardp = priv->card;
+       char fwname[FIRMWARE_NAME_MAX];
+       int ret;
+
+       sscanf(buf, "%29s", fwname); /* FIRMWARE_NAME_MAX - 1 = 29 */
+       ret = if_usb_prog_firmware(cardp, fwname, BOOT_CMD_UPDATE_FW);
+       if (ret == 0)
+               return count;
+
+       return ret;
+}
+
+/**
+ * lbs_flash_fw attribute to be exported per ethX interface through sysfs
+ * (/sys/class/net/ethX/lbs_flash_fw).  Use this like so to write firmware to
+ * the device's persistent memory:
+ * echo usb8388-5.126.0.p5.bin > /sys/class/net/ethX/lbs_flash_fw
+ */
+static DEVICE_ATTR(lbs_flash_fw, 0200, NULL, if_usb_firmware_set);
+
+/**
+ *  Set function to write firmware to device's persistent memory
+ */
+static ssize_t if_usb_boot2_set(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t count)
+{
+       struct lbs_private *priv = to_net_dev(dev)->priv;
+       struct if_usb_card *cardp = priv->card;
+       char fwname[FIRMWARE_NAME_MAX];
+       int ret;
+
+       sscanf(buf, "%29s", fwname); /* FIRMWARE_NAME_MAX - 1 = 29 */
+       ret = if_usb_prog_firmware(cardp, fwname, BOOT_CMD_UPDATE_BOOT2);
+       if (ret == 0)
+               return count;
+
+       return ret;
+}
+
+/**
+ * lbs_flash_boot2 attribute to be exported per ethX interface through sysfs
+ * (/sys/class/net/ethX/lbs_flash_boot2).  Use this like so to write firmware
+ * to the device's persistent memory:
+ * echo usb8388-5.126.0.p5.bin > /sys/class/net/ethX/lbs_flash_boot2
+ */
+static DEVICE_ATTR(lbs_flash_boot2, 0200, NULL, if_usb_boot2_set);
+
 /**
  *  @brief  call back function to handle the status of the URB
  *  @param urb                 pointer to urb structure
@@ -66,10 +125,10 @@ static void if_usb_write_bulk_callback(struct urb *urb)
                lbs_deb_usb2(&urb->dev->dev, "Actual length transmitted %d\n",
                             urb->actual_length);
 
-               /* Used for both firmware TX and regular TX.  priv isn't
-                * valid at firmware load time.
+               /* Boot commands such as UPDATE_FW and UPDATE_BOOT2 are not
+                * passed up to the lbs level.
                 */
-               if (priv)
+               if (priv && priv->dnld_sent != DNLD_BOOTCMD_SENT)
                        lbs_host_to_card_done(priv);
        } else {
                /* print the failure status number for debug */
@@ -231,7 +290,7 @@ static int if_usb_probe(struct usb_interface *intf,
        }
 
        /* Upload firmware */
-       if (if_usb_prog_firmware(cardp)) {
+       if (__if_usb_prog_firmware(cardp, lbs_fw_name, BOOT_CMD_FW_BY_USB)) {
                lbs_deb_usbd(&udev->dev, "FW upload failed\n");
                goto err_prog_firmware;
        }
@@ -260,6 +319,12 @@ static int if_usb_probe(struct usb_interface *intf,
        usb_get_dev(udev);
        usb_set_intfdata(intf, cardp);
 
+       if (device_create_file(&priv->dev->dev, &dev_attr_lbs_flash_fw))
+               lbs_pr_err("cannot register lbs_flash_fw attribute\n");
+
+       if (device_create_file(&priv->dev->dev, &dev_attr_lbs_flash_boot2))
+               lbs_pr_err("cannot register lbs_flash_boot2 attribute\n");
+
        return 0;
 
 err_start_card:
@@ -285,6 +350,9 @@ static void if_usb_disconnect(struct usb_interface *intf)
 
        lbs_deb_enter(LBS_DEB_MAIN);
 
+       device_remove_file(&priv->dev->dev, &dev_attr_lbs_flash_boot2);
+       device_remove_file(&priv->dev->dev, &dev_attr_lbs_flash_fw);
+
        cardp->surprise_removed = 1;
 
        if (priv) {
@@ -510,7 +578,7 @@ static void if_usb_receive_fwload(struct urb *urb)
                if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
                        kfree_skb(skb);
                        if_usb_submit_rx_urb_fwload(cardp);
-                       cardp->bootcmdresp = 1;
+                       cardp->bootcmdresp = BOOT_CMD_RESP_OK;
                        lbs_deb_usbd(&cardp->udev->dev,
                                     "Received valid boot command response\n");
                        return;
@@ -526,7 +594,9 @@ static void if_usb_receive_fwload(struct urb *urb)
                                lbs_pr_info("boot cmd response wrong magic number (0x%x)\n",
                                            le32_to_cpu(bootcmdresp.magic));
                        }
-               } else if (bootcmdresp.cmd != BOOT_CMD_FW_BY_USB) {
+               } else if ((bootcmdresp.cmd != BOOT_CMD_FW_BY_USB) &&
+                          (bootcmdresp.cmd != BOOT_CMD_UPDATE_FW) &&
+                          (bootcmdresp.cmd != BOOT_CMD_UPDATE_BOOT2)) {
                        lbs_pr_info("boot cmd response cmd_tag error (%d)\n",
                                    bootcmdresp.cmd);
                } else if (bootcmdresp.result != BOOT_CMD_RESP_OK) {
@@ -564,8 +634,8 @@ static void if_usb_receive_fwload(struct urb *urb)
 
        kfree_skb(skb);
 
-       /* reschedule timer for 200ms hence */
-       mod_timer(&cardp->fw_timeout, jiffies + (HZ/5));
+       /* Give device 5s to either write firmware to its RAM or eeprom */
+       mod_timer(&cardp->fw_timeout, jiffies + (HZ*5));
 
        if (cardp->fwfinalblk) {
                cardp->fwdnldover = 1;
@@ -809,7 +879,54 @@ static int check_fwfile_format(const uint8_t *data, uint32_t totlen)
 }
 
 
-static int if_usb_prog_firmware(struct if_usb_card *cardp)
+/**
+*  @brief This function programs the firmware subject to cmd
+*
+*  @param cardp             the if_usb_card descriptor
+*         fwname            firmware or boot2 image file name
+*         cmd               either BOOT_CMD_FW_BY_USB, BOOT_CMD_UPDATE_FW,
+*                           or BOOT_CMD_UPDATE_BOOT2.
+*  @return     0 or error code
+*/
+static int if_usb_prog_firmware(struct if_usb_card *cardp,
+                               const char *fwname, int cmd)
+{
+       struct lbs_private *priv = cardp->priv;
+       unsigned long flags, caps;
+       int ret;
+
+       caps = priv->fwcapinfo;
+       if (((cmd == BOOT_CMD_UPDATE_FW) && !(caps & FW_CAPINFO_FIRMWARE_UPGRADE)) ||
+           ((cmd == BOOT_CMD_UPDATE_BOOT2) && !(caps & FW_CAPINFO_BOOT2_UPGRADE)))
+               return -EOPNOTSUPP;
+
+       /* Ensure main thread is idle. */
+       spin_lock_irqsave(&priv->driver_lock, flags);
+       while (priv->cur_cmd != NULL || priv->dnld_sent != DNLD_RES_RECEIVED) {
+               spin_unlock_irqrestore(&priv->driver_lock, flags);
+               if (wait_event_interruptible(priv->waitq,
+                               (priv->cur_cmd == NULL &&
+                               priv->dnld_sent == DNLD_RES_RECEIVED))) {
+                       return -ERESTARTSYS;
+               }
+               spin_lock_irqsave(&priv->driver_lock, flags);
+       }
+       priv->dnld_sent = DNLD_BOOTCMD_SENT;
+       spin_unlock_irqrestore(&priv->driver_lock, flags);
+
+       ret = __if_usb_prog_firmware(cardp, fwname, cmd);
+
+       spin_lock_irqsave(&priv->driver_lock, flags);
+       priv->dnld_sent = DNLD_RES_RECEIVED;
+       spin_unlock_irqrestore(&priv->driver_lock, flags);
+
+       wake_up_interruptible(&priv->waitq);
+
+       return ret;
+}
+
+static int __if_usb_prog_firmware(struct if_usb_card *cardp,
+                                       const char *fwname, int cmd)
 {
        int i = 0;
        static int reset_count = 10;
@@ -817,20 +934,32 @@ static int if_usb_prog_firmware(struct if_usb_card *cardp)
 
        lbs_deb_enter(LBS_DEB_USB);
 
-       if ((ret = request_firmware(&cardp->fw, lbs_fw_name,
-                                   &cardp->udev->dev)) < 0) {
+       ret = request_firmware(&cardp->fw, fwname, &cardp->udev->dev);
+       if (ret < 0) {
                lbs_pr_err("request_firmware() failed with %#x\n", ret);
-               lbs_pr_err("firmware %s not found\n", lbs_fw_name);
+               lbs_pr_err("firmware %s not found\n", fwname);
                goto done;
        }
 
-       if (check_fwfile_format(cardp->fw->data, cardp->fw->size))
+       if (check_fwfile_format(cardp->fw->data, cardp->fw->size)) {
+               ret = -EINVAL;
                goto release_fw;
+       }
+
+       /* Cancel any pending usb business */
+       usb_kill_urb(cardp->rx_urb);
+       usb_kill_urb(cardp->tx_urb);
+
+       cardp->fwlastblksent = 0;
+       cardp->fwdnldover = 0;
+       cardp->totalbytes = 0;
+       cardp->fwfinalblk = 0;
+       cardp->bootcmdresp = 0;
 
 restart:
        if (if_usb_submit_rx_urb_fwload(cardp) < 0) {
                lbs_deb_usbd(&cardp->udev->dev, "URB submission is failed\n");
-               ret = -1;
+               ret = -EIO;
                goto release_fw;
        }
 
@@ -838,8 +967,7 @@ restart:
        do {
                int j = 0;
                i++;
-               /* Issue Boot command = 1, Boot from Download-FW */
-               if_usb_issue_boot_command(cardp, BOOT_CMD_FW_BY_USB);
+               if_usb_issue_boot_command(cardp, cmd);
                /* wait for command response */
                do {
                        j++;
@@ -847,12 +975,21 @@ restart:
                } while (cardp->bootcmdresp == 0 && j < 10);
        } while (cardp->bootcmdresp == 0 && i < 5);
 
-       if (cardp->bootcmdresp <= 0) {
+       if (cardp->bootcmdresp == BOOT_CMD_RESP_NOT_SUPPORTED) {
+               /* Return to normal operation */
+               ret = -EOPNOTSUPP;
+               usb_kill_urb(cardp->rx_urb);
+               usb_kill_urb(cardp->tx_urb);
+               if (if_usb_submit_rx_urb(cardp) < 0)
+                       ret = -EIO;
+               goto release_fw;
+       } else if (cardp->bootcmdresp <= 0) {
                if (--reset_count >= 0) {
                        if_usb_reset_device(cardp);
                        goto restart;
                }
-               return -1;
+               ret = -EIO;
+               goto release_fw;
        }
 
        i = 0;
@@ -882,7 +1019,7 @@ restart:
                }
 
                lbs_pr_info("FW download failure, time = %d ms\n", i * 100);
-               ret = -1;
+               ret = -EIO;
                goto release_fw;
        }
 
index 5771a83a43f0abd14f6e9a49f8d87e4a5293fc09..5ba0aee0eb2f7e6eac289583a990f51fc1daf2f6 100644 (file)
@@ -30,6 +30,7 @@ struct bootcmd
 
 #define BOOT_CMD_RESP_OK               0x0001
 #define BOOT_CMD_RESP_FAIL             0x0000
+#define BOOT_CMD_RESP_NOT_SUPPORTED    0x0002
 
 struct bootcmdresp
 {
@@ -50,6 +51,10 @@ struct if_usb_card {
        uint8_t ep_in;
        uint8_t ep_out;
 
+       /* bootcmdresp == 0 means command is pending
+        * bootcmdresp < 0 means error
+        * bootcmdresp > 0 is a BOOT_CMD_RESP_* from firmware
+        */
        int8_t bootcmdresp;
 
        int ep_in_size;
diff --git a/drivers/net/wireless/libertas_tf/Makefile b/drivers/net/wireless/libertas_tf/Makefile
new file mode 100644 (file)
index 0000000..ff5544d
--- /dev/null
@@ -0,0 +1,6 @@
+libertas_tf-objs := main.o cmd.o
+
+libertas_tf_usb-objs += if_usb.o
+
+obj-$(CONFIG_LIBERTAS_THINFIRM) += libertas_tf.o
+obj-$(CONFIG_LIBERTAS_THINFIRM_USB) += libertas_tf_usb.o
diff --git a/drivers/net/wireless/libertas_tf/cmd.c b/drivers/net/wireless/libertas_tf/cmd.c
new file mode 100644 (file)
index 0000000..fdbcf8b
--- /dev/null
@@ -0,0 +1,669 @@
+/*
+ *  Copyright (C) 2008, cozybit Inc.
+ *  Copyright (C) 2003-2006, Marvell International Ltd.
+ *
+ *  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 "libertas_tf.h"
+
+static const struct channel_range channel_ranges[] = {
+       { LBTF_REGDOMAIN_US,            1, 12 },
+       { LBTF_REGDOMAIN_CA,            1, 12 },
+       { LBTF_REGDOMAIN_EU,            1, 14 },
+       { LBTF_REGDOMAIN_JP,            1, 14 },
+       { LBTF_REGDOMAIN_SP,            1, 14 },
+       { LBTF_REGDOMAIN_FR,            1, 14 },
+};
+
+static u16 lbtf_region_code_to_index[MRVDRV_MAX_REGION_CODE] =
+{
+       LBTF_REGDOMAIN_US, LBTF_REGDOMAIN_CA, LBTF_REGDOMAIN_EU,
+       LBTF_REGDOMAIN_SP, LBTF_REGDOMAIN_FR, LBTF_REGDOMAIN_JP,
+};
+
+static struct cmd_ctrl_node *lbtf_get_cmd_ctrl_node(struct lbtf_private *priv);
+
+
+/**
+ *  lbtf_cmd_copyback - Simple callback that copies response back into command
+ *
+ *  @priv      A pointer to struct lbtf_private structure
+ *  @extra     A pointer to the original command structure for which
+ *             'resp' is a response
+ *  @resp      A pointer to the command response
+ *
+ *  Returns: 0 on success, error on failure
+ */
+int lbtf_cmd_copyback(struct lbtf_private *priv, unsigned long extra,
+                    struct cmd_header *resp)
+{
+       struct cmd_header *buf = (void *)extra;
+       uint16_t copy_len;
+
+       copy_len = min(le16_to_cpu(buf->size), le16_to_cpu(resp->size));
+       memcpy(buf, resp, copy_len);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(lbtf_cmd_copyback);
+
+#define CHAN_TO_IDX(chan) ((chan) - 1)
+
+static void lbtf_geo_init(struct lbtf_private *priv)
+{
+       const struct channel_range *range = channel_ranges;
+       u8 ch;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(channel_ranges); i++)
+               if (channel_ranges[i].regdomain == priv->regioncode) {
+                       range = &channel_ranges[i];
+                       break;
+               }
+
+       for (ch = priv->range.start; ch < priv->range.end; ch++)
+               priv->channels[CHAN_TO_IDX(ch)].flags = 0;
+}
+
+/**
+ *  lbtf_update_hw_spec: Updates the hardware details.
+ *
+ *  @priv      A pointer to struct lbtf_private structure
+ *
+ *  Returns: 0 on success, error on failure
+ */
+int lbtf_update_hw_spec(struct lbtf_private *priv)
+{
+       struct cmd_ds_get_hw_spec cmd;
+       int ret = -1;
+       u32 i;
+       DECLARE_MAC_BUF(mac);
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       memcpy(cmd.permanentaddr, priv->current_addr, ETH_ALEN);
+       ret = lbtf_cmd_with_response(priv, CMD_GET_HW_SPEC, &cmd);
+       if (ret)
+               goto out;
+
+       priv->fwcapinfo = le32_to_cpu(cmd.fwcapinfo);
+
+       /* The firmware release is in an interesting format: the patch
+        * level is in the most significant nibble ... so fix that: */
+       priv->fwrelease = le32_to_cpu(cmd.fwrelease);
+       priv->fwrelease = (priv->fwrelease << 8) |
+               (priv->fwrelease >> 24 & 0xff);
+
+       printk(KERN_INFO "libertastf: %s, fw %u.%u.%up%u, cap 0x%08x\n",
+               print_mac(mac, cmd.permanentaddr),
+               priv->fwrelease >> 24 & 0xff,
+               priv->fwrelease >> 16 & 0xff,
+               priv->fwrelease >>  8 & 0xff,
+               priv->fwrelease       & 0xff,
+               priv->fwcapinfo);
+
+       /* Clamp region code to 8-bit since FW spec indicates that it should
+        * only ever be 8-bit, even though the field size is 16-bit.  Some
+        * firmware returns non-zero high 8 bits here.
+        */
+       priv->regioncode = le16_to_cpu(cmd.regioncode) & 0xFF;
+
+       for (i = 0; i < MRVDRV_MAX_REGION_CODE; i++) {
+               /* use the region code to search for the index */
+               if (priv->regioncode == lbtf_region_code_to_index[i])
+                       break;
+       }
+
+       /* if it's unidentified region code, use the default (USA) */
+       if (i >= MRVDRV_MAX_REGION_CODE)
+               priv->regioncode = 0x10;
+
+       if (priv->current_addr[0] == 0xff)
+               memmove(priv->current_addr, cmd.permanentaddr, ETH_ALEN);
+
+       SET_IEEE80211_PERM_ADDR(priv->hw, priv->current_addr);
+
+       lbtf_geo_init(priv);
+out:
+       return ret;
+}
+
+/**
+ *  lbtf_set_channel: Set the radio channel
+ *
+ *  @priv      A pointer to struct lbtf_private structure
+ *  @channel   The desired channel, or 0 to clear a locked channel
+ *
+ *  Returns: 0 on success, error on failure
+ */
+int lbtf_set_channel(struct lbtf_private *priv, u8 channel)
+{
+       struct cmd_ds_802_11_rf_channel cmd;
+
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       cmd.action = cpu_to_le16(CMD_OPT_802_11_RF_CHANNEL_SET);
+       cmd.channel = cpu_to_le16(channel);
+
+       return lbtf_cmd_with_response(priv, CMD_802_11_RF_CHANNEL, &cmd);
+}
+
+int lbtf_beacon_set(struct lbtf_private *priv, struct sk_buff *beacon)
+{
+       struct cmd_ds_802_11_beacon_set cmd;
+       int size;
+
+       if (beacon->len > MRVL_MAX_BCN_SIZE)
+               return -1;
+       size =  sizeof(cmd) - sizeof(cmd.beacon) + beacon->len;
+       cmd.hdr.size = cpu_to_le16(size);
+       cmd.len = cpu_to_le16(beacon->len);
+       memcpy(cmd.beacon, (u8 *) beacon->data, beacon->len);
+
+       lbtf_cmd_async(priv, CMD_802_11_BEACON_SET, &cmd.hdr, size);
+       return 0;
+}
+
+int lbtf_beacon_ctrl(struct lbtf_private *priv, bool beacon_enable,
+                    int beacon_int) {
+       struct cmd_ds_802_11_beacon_control cmd;
+
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       cmd.action = cpu_to_le16(CMD_ACT_SET);
+       cmd.beacon_enable = cpu_to_le16(beacon_enable);
+       cmd.beacon_period = cpu_to_le16(beacon_int);
+
+       lbtf_cmd_async(priv, CMD_802_11_BEACON_CTRL, &cmd.hdr, sizeof(cmd));
+       return 0;
+}
+
+static void lbtf_queue_cmd(struct lbtf_private *priv,
+                         struct cmd_ctrl_node *cmdnode)
+{
+       unsigned long flags;
+
+       if (!cmdnode)
+               return;
+
+       if (!cmdnode->cmdbuf->size)
+               return;
+
+       cmdnode->result = 0;
+       spin_lock_irqsave(&priv->driver_lock, flags);
+       list_add_tail(&cmdnode->list, &priv->cmdpendingq);
+       spin_unlock_irqrestore(&priv->driver_lock, flags);
+}
+
+static void lbtf_submit_command(struct lbtf_private *priv,
+                              struct cmd_ctrl_node *cmdnode)
+{
+       unsigned long flags;
+       struct cmd_header *cmd;
+       uint16_t cmdsize;
+       uint16_t command;
+       int timeo = 5 * HZ;
+       int ret;
+
+       cmd = cmdnode->cmdbuf;
+
+       spin_lock_irqsave(&priv->driver_lock, flags);
+       priv->cur_cmd = cmdnode;
+       cmdsize = le16_to_cpu(cmd->size);
+       command = le16_to_cpu(cmd->command);
+       ret = priv->hw_host_to_card(priv, MVMS_CMD, (u8 *) cmd, cmdsize);
+       spin_unlock_irqrestore(&priv->driver_lock, flags);
+
+       if (ret)
+               /* Let the timer kick in and retry, and potentially reset
+                  the whole thing if the condition persists */
+               timeo = HZ;
+
+       /* Setup the timer after transmit command */
+       mod_timer(&priv->command_timer, jiffies + timeo);
+}
+
+/**
+ *  This function inserts command node to cmdfreeq
+ *  after cleans it. Requires priv->driver_lock held.
+ */
+static void __lbtf_cleanup_and_insert_cmd(struct lbtf_private *priv,
+                                        struct cmd_ctrl_node *cmdnode)
+{
+       if (!cmdnode)
+               return;
+
+       cmdnode->callback = NULL;
+       cmdnode->callback_arg = 0;
+
+       memset(cmdnode->cmdbuf, 0, LBS_CMD_BUFFER_SIZE);
+
+       list_add_tail(&cmdnode->list, &priv->cmdfreeq);
+}
+
+static void lbtf_cleanup_and_insert_cmd(struct lbtf_private *priv,
+       struct cmd_ctrl_node *ptempcmd)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&priv->driver_lock, flags);
+       __lbtf_cleanup_and_insert_cmd(priv, ptempcmd);
+       spin_unlock_irqrestore(&priv->driver_lock, flags);
+}
+
+void lbtf_complete_command(struct lbtf_private *priv, struct cmd_ctrl_node *cmd,
+                         int result)
+{
+       cmd->result = result;
+       cmd->cmdwaitqwoken = 1;
+       wake_up_interruptible(&cmd->cmdwait_q);
+
+       if (!cmd->callback)
+               __lbtf_cleanup_and_insert_cmd(priv, cmd);
+       priv->cur_cmd = NULL;
+}
+
+int lbtf_cmd_set_mac_multicast_addr(struct lbtf_private *priv)
+{
+       struct cmd_ds_mac_multicast_addr cmd;
+
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       cmd.action = cpu_to_le16(CMD_ACT_SET);
+
+       cmd.nr_of_adrs = cpu_to_le16((u16) priv->nr_of_multicastmacaddr);
+       memcpy(cmd.maclist, priv->multicastlist,
+              priv->nr_of_multicastmacaddr * ETH_ALEN);
+
+       lbtf_cmd_async(priv, CMD_MAC_MULTICAST_ADR, &cmd.hdr, sizeof(cmd));
+       return 0;
+}
+
+void lbtf_set_mode(struct lbtf_private *priv, enum lbtf_mode mode)
+{
+       struct cmd_ds_set_mode cmd;
+
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       cmd.mode = cpu_to_le16(mode);
+       lbtf_cmd_async(priv, CMD_802_11_SET_MODE, &cmd.hdr, sizeof(cmd));
+}
+
+void lbtf_set_bssid(struct lbtf_private *priv, bool activate, u8 *bssid)
+{
+       struct cmd_ds_set_bssid cmd;
+
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       cmd.activate = activate ? 1 : 0;
+       if (activate)
+               memcpy(cmd.bssid, bssid, ETH_ALEN);
+
+       lbtf_cmd_async(priv, CMD_802_11_SET_BSSID, &cmd.hdr, sizeof(cmd));
+}
+
+int lbtf_set_mac_address(struct lbtf_private *priv, uint8_t *mac_addr)
+{
+       struct cmd_ds_802_11_mac_address cmd;
+
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       cmd.action = cpu_to_le16(CMD_ACT_SET);
+
+       memcpy(cmd.macadd, mac_addr, ETH_ALEN);
+
+       lbtf_cmd_async(priv, CMD_802_11_MAC_ADDRESS, &cmd.hdr, sizeof(cmd));
+       return 0;
+}
+
+int lbtf_set_radio_control(struct lbtf_private *priv)
+{
+       int ret = 0;
+       struct cmd_ds_802_11_radio_control cmd;
+
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       cmd.action = cpu_to_le16(CMD_ACT_SET);
+
+       switch (priv->preamble) {
+       case CMD_TYPE_SHORT_PREAMBLE:
+               cmd.control = cpu_to_le16(SET_SHORT_PREAMBLE);
+               break;
+
+       case CMD_TYPE_LONG_PREAMBLE:
+               cmd.control = cpu_to_le16(SET_LONG_PREAMBLE);
+               break;
+
+       case CMD_TYPE_AUTO_PREAMBLE:
+       default:
+               cmd.control = cpu_to_le16(SET_AUTO_PREAMBLE);
+               break;
+       }
+
+       if (priv->radioon)
+               cmd.control |= cpu_to_le16(TURN_ON_RF);
+       else
+               cmd.control &= cpu_to_le16(~TURN_ON_RF);
+
+       ret = lbtf_cmd_with_response(priv, CMD_802_11_RADIO_CONTROL, &cmd);
+       return ret;
+}
+
+void lbtf_set_mac_control(struct lbtf_private *priv)
+{
+       struct cmd_ds_mac_control cmd;
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       cmd.action = cpu_to_le16(priv->mac_control);
+       cmd.reserved = 0;
+
+       lbtf_cmd_async(priv, CMD_MAC_CONTROL,
+               &cmd.hdr, sizeof(cmd));
+}
+
+/**
+ *  lbtf_allocate_cmd_buffer - Allocates cmd buffer, links it to free cmd queue
+ *
+ *  @priv      A pointer to struct lbtf_private structure
+ *
+ *  Returns: 0 on success.
+ */
+int lbtf_allocate_cmd_buffer(struct lbtf_private *priv)
+{
+       u32 bufsize;
+       u32 i;
+       struct cmd_ctrl_node *cmdarray;
+
+       /* Allocate and initialize the command array */
+       bufsize = sizeof(struct cmd_ctrl_node) * LBS_NUM_CMD_BUFFERS;
+       cmdarray = kzalloc(bufsize, GFP_KERNEL);
+       if (!cmdarray)
+               return -1;
+       priv->cmd_array = cmdarray;
+
+       /* Allocate and initialize each command buffer in the command array */
+       for (i = 0; i < LBS_NUM_CMD_BUFFERS; i++) {
+               cmdarray[i].cmdbuf = kzalloc(LBS_CMD_BUFFER_SIZE, GFP_KERNEL);
+               if (!cmdarray[i].cmdbuf)
+                       return -1;
+       }
+
+       for (i = 0; i < LBS_NUM_CMD_BUFFERS; i++) {
+               init_waitqueue_head(&cmdarray[i].cmdwait_q);
+               lbtf_cleanup_and_insert_cmd(priv, &cmdarray[i]);
+       }
+       return 0;
+}
+
+/**
+ *  lbtf_free_cmd_buffer - Frees the cmd buffer.
+ *
+ *  @priv      A pointer to struct lbtf_private structure
+ *
+ *  Returns: 0
+ */
+int lbtf_free_cmd_buffer(struct lbtf_private *priv)
+{
+       struct cmd_ctrl_node *cmdarray;
+       unsigned int i;
+
+       /* need to check if cmd array is allocated or not */
+       if (priv->cmd_array == NULL)
+               return 0;
+
+       cmdarray = priv->cmd_array;
+
+       /* Release shared memory buffers */
+       for (i = 0; i < LBS_NUM_CMD_BUFFERS; i++) {
+               kfree(cmdarray[i].cmdbuf);
+               cmdarray[i].cmdbuf = NULL;
+       }
+
+       /* Release cmd_ctrl_node */
+       kfree(priv->cmd_array);
+       priv->cmd_array = NULL;
+
+       return 0;
+}
+
+/**
+ *  lbtf_get_cmd_ctrl_node - Gets free cmd node from free cmd queue.
+ *
+ *  @priv              A pointer to struct lbtf_private structure
+ *
+ *  Returns: pointer to a struct cmd_ctrl_node or NULL if none available.
+ */
+static struct cmd_ctrl_node *lbtf_get_cmd_ctrl_node(struct lbtf_private *priv)
+{
+       struct cmd_ctrl_node *tempnode;
+       unsigned long flags;
+
+       if (!priv)
+               return NULL;
+
+       spin_lock_irqsave(&priv->driver_lock, flags);
+
+       if (!list_empty(&priv->cmdfreeq)) {
+               tempnode = list_first_entry(&priv->cmdfreeq,
+                                           struct cmd_ctrl_node, list);
+               list_del(&tempnode->list);
+       } else
+               tempnode = NULL;
+
+       spin_unlock_irqrestore(&priv->driver_lock, flags);
+
+       return tempnode;
+}
+
+/**
+ *  lbtf_execute_next_command: execute next command in cmd pending queue.
+ *
+ *  @priv     A pointer to struct lbtf_private structure
+ *
+ *  Returns: 0 on success.
+ */
+int lbtf_execute_next_command(struct lbtf_private *priv)
+{
+       struct cmd_ctrl_node *cmdnode = NULL;
+       struct cmd_header *cmd;
+       unsigned long flags;
+
+       /* Debug group is LBS_DEB_THREAD and not LBS_DEB_HOST, because the
+        * only caller to us is lbtf_thread() and we get even when a
+        * data packet is received */
+
+       spin_lock_irqsave(&priv->driver_lock, flags);
+
+       if (priv->cur_cmd) {
+               spin_unlock_irqrestore(&priv->driver_lock, flags);
+               return -1;
+       }
+
+       if (!list_empty(&priv->cmdpendingq)) {
+               cmdnode = list_first_entry(&priv->cmdpendingq,
+                                          struct cmd_ctrl_node, list);
+       }
+
+       if (cmdnode) {
+               cmd = cmdnode->cmdbuf;
+
+               list_del(&cmdnode->list);
+               spin_unlock_irqrestore(&priv->driver_lock, flags);
+               lbtf_submit_command(priv, cmdnode);
+       } else
+               spin_unlock_irqrestore(&priv->driver_lock, flags);
+       return 0;
+}
+
+static struct cmd_ctrl_node *__lbtf_cmd_async(struct lbtf_private *priv,
+       uint16_t command, struct cmd_header *in_cmd, int in_cmd_size,
+       int (*callback)(struct lbtf_private *, unsigned long,
+                       struct cmd_header *),
+       unsigned long callback_arg)
+{
+       struct cmd_ctrl_node *cmdnode;
+
+       if (priv->surpriseremoved)
+               return ERR_PTR(-ENOENT);
+
+       cmdnode = lbtf_get_cmd_ctrl_node(priv);
+       if (cmdnode == NULL) {
+               /* Wake up main thread to execute next command */
+               queue_work(lbtf_wq, &priv->cmd_work);
+               return ERR_PTR(-ENOBUFS);
+       }
+
+       cmdnode->callback = callback;
+       cmdnode->callback_arg = callback_arg;
+
+       /* Copy the incoming command to the buffer */
+       memcpy(cmdnode->cmdbuf, in_cmd, in_cmd_size);
+
+       /* Set sequence number, clean result, move to buffer */
+       priv->seqnum++;
+       cmdnode->cmdbuf->command = cpu_to_le16(command);
+       cmdnode->cmdbuf->size    = cpu_to_le16(in_cmd_size);
+       cmdnode->cmdbuf->seqnum  = cpu_to_le16(priv->seqnum);
+       cmdnode->cmdbuf->result  = 0;
+       cmdnode->cmdwaitqwoken = 0;
+       lbtf_queue_cmd(priv, cmdnode);
+       queue_work(lbtf_wq, &priv->cmd_work);
+
+       return cmdnode;
+}
+
+void lbtf_cmd_async(struct lbtf_private *priv, uint16_t command,
+       struct cmd_header *in_cmd, int in_cmd_size)
+{
+       __lbtf_cmd_async(priv, command, in_cmd, in_cmd_size, NULL, 0);
+}
+
+int __lbtf_cmd(struct lbtf_private *priv, uint16_t command,
+             struct cmd_header *in_cmd, int in_cmd_size,
+             int (*callback)(struct lbtf_private *,
+                             unsigned long, struct cmd_header *),
+             unsigned long callback_arg)
+{
+       struct cmd_ctrl_node *cmdnode;
+       unsigned long flags;
+       int ret = 0;
+
+       cmdnode = __lbtf_cmd_async(priv, command, in_cmd, in_cmd_size,
+                                 callback, callback_arg);
+       if (IS_ERR(cmdnode))
+               return PTR_ERR(cmdnode);
+
+       might_sleep();
+       ret = wait_event_interruptible(cmdnode->cmdwait_q,
+                                      cmdnode->cmdwaitqwoken);
+       if (ret)        {
+               printk(KERN_DEBUG
+                      "libertastf: command 0x%04x interrupted by signal",
+                      command);
+               return ret;
+       }
+
+       spin_lock_irqsave(&priv->driver_lock, flags);
+       ret = cmdnode->result;
+       if (ret)
+               printk(KERN_DEBUG "libertastf: command 0x%04x failed: %d\n",
+                           command, ret);
+
+       __lbtf_cleanup_and_insert_cmd(priv, cmdnode);
+       spin_unlock_irqrestore(&priv->driver_lock, flags);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(__lbtf_cmd);
+
+/* Call holding driver_lock */
+void lbtf_cmd_response_rx(struct lbtf_private *priv)
+{
+       priv->cmd_response_rxed = 1;
+       queue_work(lbtf_wq, &priv->cmd_work);
+}
+EXPORT_SYMBOL_GPL(lbtf_cmd_response_rx);
+
+int lbtf_process_rx_command(struct lbtf_private *priv)
+{
+       uint16_t respcmd, curcmd;
+       struct cmd_header *resp;
+       int ret = 0;
+       unsigned long flags;
+       uint16_t result;
+
+       mutex_lock(&priv->lock);
+       spin_lock_irqsave(&priv->driver_lock, flags);
+
+       if (!priv->cur_cmd) {
+               ret = -1;
+               spin_unlock_irqrestore(&priv->driver_lock, flags);
+               goto done;
+       }
+
+       resp = (void *)priv->cmd_resp_buff;
+       curcmd = le16_to_cpu(priv->cur_cmd->cmdbuf->command);
+       respcmd = le16_to_cpu(resp->command);
+       result = le16_to_cpu(resp->result);
+
+       if (net_ratelimit())
+               printk(KERN_DEBUG "libertastf: cmd response 0x%04x, seq %d, size %d\n",
+                       respcmd, le16_to_cpu(resp->seqnum),
+                       le16_to_cpu(resp->size));
+
+       if (resp->seqnum != priv->cur_cmd->cmdbuf->seqnum) {
+               spin_unlock_irqrestore(&priv->driver_lock, flags);
+               ret = -1;
+               goto done;
+       }
+       if (respcmd != CMD_RET(curcmd)) {
+               spin_unlock_irqrestore(&priv->driver_lock, flags);
+               ret = -1;
+               goto done;
+       }
+
+       if (resp->result == cpu_to_le16(0x0004)) {
+               /* 0x0004 means -EAGAIN. Drop the response, let it time out
+                  and be resubmitted */
+               spin_unlock_irqrestore(&priv->driver_lock, flags);
+               ret = -1;
+               goto done;
+       }
+
+       /* Now we got response from FW, cancel the command timer */
+       del_timer(&priv->command_timer);
+       priv->cmd_timed_out = 0;
+       if (priv->nr_retries)
+               priv->nr_retries = 0;
+
+       /* If the command is not successful, cleanup and return failure */
+       if ((result != 0 || !(respcmd & 0x8000))) {
+               /*
+                * Handling errors here
+                */
+               switch (respcmd) {
+               case CMD_RET(CMD_GET_HW_SPEC):
+               case CMD_RET(CMD_802_11_RESET):
+                       printk(KERN_DEBUG "libertastf: reset failed\n");
+                       break;
+
+               }
+               lbtf_complete_command(priv, priv->cur_cmd, result);
+               spin_unlock_irqrestore(&priv->driver_lock, flags);
+
+               ret = -1;
+               goto done;
+       }
+
+       spin_unlock_irqrestore(&priv->driver_lock, flags);
+
+       if (priv->cur_cmd && priv->cur_cmd->callback) {
+               ret = priv->cur_cmd->callback(priv, priv->cur_cmd->callback_arg,
+                               resp);
+       }
+       spin_lock_irqsave(&priv->driver_lock, flags);
+
+       if (priv->cur_cmd) {
+               /* Clean up and Put current command back to cmdfreeq */
+               lbtf_complete_command(priv, priv->cur_cmd, result);
+       }
+       spin_unlock_irqrestore(&priv->driver_lock, flags);
+
+done:
+       mutex_unlock(&priv->lock);
+       return ret;
+}
diff --git a/drivers/net/wireless/libertas_tf/if_usb.c b/drivers/net/wireless/libertas_tf/if_usb.c
new file mode 100644 (file)
index 0000000..1cc03a8
--- /dev/null
@@ -0,0 +1,766 @@
+/*
+ *  Copyright (C) 2008, cozybit Inc.
+ *  Copyright (C) 2003-2006, Marvell International Ltd.
+ *
+ *  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/delay.h>
+#include <linux/moduleparam.h>
+#include <linux/firmware.h>
+#include <linux/netdevice.h>
+#include <linux/usb.h>
+
+#define DRV_NAME "lbtf_usb"
+
+#include "libertas_tf.h"
+#include "if_usb.h"
+
+#define MESSAGE_HEADER_LEN     4
+
+static char *lbtf_fw_name = "lbtf_usb.bin";
+module_param_named(fw_name, lbtf_fw_name, charp, 0644);
+
+static struct usb_device_id if_usb_table[] = {
+       /* Enter the device signature inside */
+       { USB_DEVICE(0x1286, 0x2001) },
+       { USB_DEVICE(0x05a3, 0x8388) },
+       {}      /* Terminating entry */
+};
+
+MODULE_DEVICE_TABLE(usb, if_usb_table);
+
+static void if_usb_receive(struct urb *urb);
+static void if_usb_receive_fwload(struct urb *urb);
+static int if_usb_prog_firmware(struct if_usb_card *cardp);
+static int if_usb_host_to_card(struct lbtf_private *priv, uint8_t type,
+                              uint8_t *payload, uint16_t nb);
+static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload,
+                       uint16_t nb, u8 data);
+static void if_usb_free(struct if_usb_card *cardp);
+static int if_usb_submit_rx_urb(struct if_usb_card *cardp);
+static int if_usb_reset_device(struct if_usb_card *cardp);
+
+/**
+ *  if_usb_wrike_bulk_callback -  call back to handle URB status
+ *
+ *  @param urb                 pointer to urb structure
+ */
+static void if_usb_write_bulk_callback(struct urb *urb)
+{
+       if (urb->status != 0)
+               printk(KERN_INFO "libertastf: URB in failure status: %d\n",
+                      urb->status);
+}
+
+/**
+ *  if_usb_free - free tx/rx urb, skb and rx buffer
+ *
+ *  @param cardp       pointer if_usb_card
+ */
+static void if_usb_free(struct if_usb_card *cardp)
+{
+       /* Unlink tx & rx urb */
+       usb_kill_urb(cardp->tx_urb);
+       usb_kill_urb(cardp->rx_urb);
+       usb_kill_urb(cardp->cmd_urb);
+
+       usb_free_urb(cardp->tx_urb);
+       cardp->tx_urb = NULL;
+
+       usb_free_urb(cardp->rx_urb);
+       cardp->rx_urb = NULL;
+
+       usb_free_urb(cardp->cmd_urb);
+       cardp->cmd_urb = NULL;
+
+       kfree(cardp->ep_out_buf);
+       cardp->ep_out_buf = NULL;
+}
+
+static void if_usb_setup_firmware(struct lbtf_private *priv)
+{
+       struct if_usb_card *cardp = priv->card;
+       struct cmd_ds_set_boot2_ver b2_cmd;
+
+       if_usb_submit_rx_urb(cardp);
+       b2_cmd.hdr.size = cpu_to_le16(sizeof(b2_cmd));
+       b2_cmd.action = 0;
+       b2_cmd.version = cardp->boot2_version;
+
+       if (lbtf_cmd_with_response(priv, CMD_SET_BOOT2_VER, &b2_cmd))
+               printk(KERN_INFO "libertastf: setting boot2 version failed\n");
+}
+
+static void if_usb_fw_timeo(unsigned long priv)
+{
+       struct if_usb_card *cardp = (void *)priv;
+
+       if (!cardp->fwdnldover)
+               /* Download timed out */
+               cardp->priv->surpriseremoved = 1;
+       wake_up(&cardp->fw_wq);
+}
+
+/**
+ *  if_usb_probe - sets the configuration values
+ *
+ *  @ifnum     interface number
+ *  @id                pointer to usb_device_id
+ *
+ *  Returns: 0 on success, error code on failure
+ */
+static int if_usb_probe(struct usb_interface *intf,
+                       const struct usb_device_id *id)
+{
+       struct usb_device *udev;
+       struct usb_host_interface *iface_desc;
+       struct usb_endpoint_descriptor *endpoint;
+       struct lbtf_private *priv;
+       struct if_usb_card *cardp;
+       int i;
+
+       udev = interface_to_usbdev(intf);
+
+       cardp = kzalloc(sizeof(struct if_usb_card), GFP_KERNEL);
+       if (!cardp)
+               goto error;
+
+       setup_timer(&cardp->fw_timeout, if_usb_fw_timeo, (unsigned long)cardp);
+       init_waitqueue_head(&cardp->fw_wq);
+
+       cardp->udev = udev;
+       iface_desc = intf->cur_altsetting;
+
+       for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
+               endpoint = &iface_desc->endpoint[i].desc;
+               if (usb_endpoint_is_bulk_in(endpoint)) {
+                       cardp->ep_in_size =
+                               le16_to_cpu(endpoint->wMaxPacketSize);
+                       cardp->ep_in = usb_endpoint_num(endpoint);
+               } else if (usb_endpoint_is_bulk_out(endpoint)) {
+                       cardp->ep_out_size =
+                               le16_to_cpu(endpoint->wMaxPacketSize);
+                       cardp->ep_out = usb_endpoint_num(endpoint);
+               }
+       }
+       if (!cardp->ep_out_size || !cardp->ep_in_size)
+               /* Endpoints not found */
+               goto dealloc;
+
+       cardp->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!cardp->rx_urb)
+               goto dealloc;
+
+       cardp->tx_urb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!cardp->tx_urb)
+               goto dealloc;
+
+       cardp->cmd_urb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!cardp->cmd_urb)
+               goto dealloc;
+
+       cardp->ep_out_buf = kmalloc(MRVDRV_ETH_TX_PACKET_BUFFER_SIZE,
+                                   GFP_KERNEL);
+       if (!cardp->ep_out_buf)
+               goto dealloc;
+
+       priv = lbtf_add_card(cardp, &udev->dev);
+       if (!priv)
+               goto dealloc;
+
+       cardp->priv = priv;
+
+       priv->hw_host_to_card = if_usb_host_to_card;
+       priv->hw_prog_firmware = if_usb_prog_firmware;
+       priv->hw_reset_device = if_usb_reset_device;
+       cardp->boot2_version = udev->descriptor.bcdDevice;
+
+       usb_get_dev(udev);
+       usb_set_intfdata(intf, cardp);
+
+       return 0;
+
+dealloc:
+       if_usb_free(cardp);
+error:
+       return -ENOMEM;
+}
+
+/**
+ *  if_usb_disconnect -  free resource and cleanup
+ *
+ *  @intf      USB interface structure
+ */
+static void if_usb_disconnect(struct usb_interface *intf)
+{
+       struct if_usb_card *cardp = usb_get_intfdata(intf);
+       struct lbtf_private *priv = (struct lbtf_private *) cardp->priv;
+
+       if_usb_reset_device(cardp);
+
+       if (priv)
+               lbtf_remove_card(priv);
+
+       /* Unlink and free urb */
+       if_usb_free(cardp);
+
+       usb_set_intfdata(intf, NULL);
+       usb_put_dev(interface_to_usbdev(intf));
+}
+
+/**
+ *  if_usb_send_fw_pkt -  This function downloads the FW
+ *
+ *  @priv      pointer to struct lbtf_private
+ *
+ *  Returns: 0
+ */
+static int if_usb_send_fw_pkt(struct if_usb_card *cardp)
+{
+       struct fwdata *fwdata = cardp->ep_out_buf;
+       u8 *firmware = (u8 *) cardp->fw->data;
+
+       /* If we got a CRC failure on the last block, back
+          up and retry it */
+       if (!cardp->CRC_OK) {
+               cardp->totalbytes = cardp->fwlastblksent;
+               cardp->fwseqnum--;
+       }
+
+       /* struct fwdata (which we sent to the card) has an
+          extra __le32 field in between the header and the data,
+          which is not in the struct fwheader in the actual
+          firmware binary. Insert the seqnum in the middle... */
+       memcpy(&fwdata->hdr, &firmware[cardp->totalbytes],
+              sizeof(struct fwheader));
+
+       cardp->fwlastblksent = cardp->totalbytes;
+       cardp->totalbytes += sizeof(struct fwheader);
+
+       memcpy(fwdata->data, &firmware[cardp->totalbytes],
+              le32_to_cpu(fwdata->hdr.datalength));
+
+       fwdata->seqnum = cpu_to_le32(++cardp->fwseqnum);
+       cardp->totalbytes += le32_to_cpu(fwdata->hdr.datalength);
+
+       usb_tx_block(cardp, cardp->ep_out_buf, sizeof(struct fwdata) +
+                    le32_to_cpu(fwdata->hdr.datalength), 0);
+
+       if (fwdata->hdr.dnldcmd == cpu_to_le32(FW_HAS_LAST_BLOCK))
+               /* Host has finished FW downloading
+                * Donwloading FW JUMP BLOCK
+                */
+               cardp->fwfinalblk = 1;
+
+       return 0;
+}
+
+static int if_usb_reset_device(struct if_usb_card *cardp)
+{
+       struct cmd_ds_802_11_reset *cmd = cardp->ep_out_buf + 4;
+       int ret;
+
+       *(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
+
+       cmd->hdr.command = cpu_to_le16(CMD_802_11_RESET);
+       cmd->hdr.size = cpu_to_le16(sizeof(struct cmd_ds_802_11_reset));
+       cmd->hdr.result = cpu_to_le16(0);
+       cmd->hdr.seqnum = cpu_to_le16(0x5a5a);
+       cmd->action = cpu_to_le16(CMD_ACT_HALT);
+       usb_tx_block(cardp, cardp->ep_out_buf,
+                    4 + sizeof(struct cmd_ds_802_11_reset), 0);
+
+       msleep(100);
+       ret = usb_reset_device(cardp->udev);
+       msleep(100);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(if_usb_reset_device);
+
+/**
+ *  usb_tx_block - transfer data to the device
+ *
+ *  @priv      pointer to struct lbtf_private
+ *  @payload   pointer to payload data
+ *  @nb                data length
+ *  @data      non-zero for data, zero for commands
+ *
+ *  Returns: 0 on success, nonzero otherwise.
+ */
+static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload,
+                       uint16_t nb, u8 data)
+{
+       struct urb *urb;
+
+       /* check if device is removed */
+       if (cardp->priv->surpriseremoved)
+               return -1;
+
+       if (data)
+               urb = cardp->tx_urb;
+       else
+               urb = cardp->cmd_urb;
+
+       usb_fill_bulk_urb(urb, cardp->udev,
+                         usb_sndbulkpipe(cardp->udev,
+                                         cardp->ep_out),
+                         payload, nb, if_usb_write_bulk_callback, cardp);
+
+       urb->transfer_flags |= URB_ZERO_PACKET;
+
+       if (usb_submit_urb(urb, GFP_ATOMIC))
+               return -1;
+       return 0;
+}
+
+static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
+                                 void (*callbackfn)(struct urb *urb))
+{
+       struct sk_buff *skb;
+
+       skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE);
+       if (!skb)
+               return -1;
+
+       cardp->rx_skb = skb;
+
+       /* Fill the receive configuration URB and initialise the Rx call back */
+       usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
+                         usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
+                         (void *) (skb->tail),
+                         MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp);
+
+       cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;
+
+       if (usb_submit_urb(cardp->rx_urb, GFP_ATOMIC)) {
+               kfree_skb(skb);
+               cardp->rx_skb = NULL;
+               return -1;
+       } else
+               return 0;
+}
+
+static int if_usb_submit_rx_urb_fwload(struct if_usb_card *cardp)
+{
+       return __if_usb_submit_rx_urb(cardp, &if_usb_receive_fwload);
+}
+
+static int if_usb_submit_rx_urb(struct if_usb_card *cardp)
+{
+       return __if_usb_submit_rx_urb(cardp, &if_usb_receive);
+}
+
+static void if_usb_receive_fwload(struct urb *urb)
+{
+       struct if_usb_card *cardp = urb->context;
+       struct sk_buff *skb = cardp->rx_skb;
+       struct fwsyncheader *syncfwheader;
+       struct bootcmdresp bcmdresp;
+
+       if (urb->status) {
+               kfree_skb(skb);
+               return;
+       }
+
+       if (cardp->fwdnldover) {
+               __le32 *tmp = (__le32 *)(skb->data);
+
+               if (tmp[0] == cpu_to_le32(CMD_TYPE_INDICATION) &&
+                   tmp[1] == cpu_to_le32(MACREG_INT_CODE_FIRMWARE_READY))
+                       /* Firmware ready event received */
+                       wake_up(&cardp->fw_wq);
+               else
+                       if_usb_submit_rx_urb_fwload(cardp);
+               kfree_skb(skb);
+               return;
+       }
+       if (cardp->bootcmdresp <= 0) {
+               memcpy(&bcmdresp, skb->data, sizeof(bcmdresp));
+
+               if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
+                       kfree_skb(skb);
+                       if_usb_submit_rx_urb_fwload(cardp);
+                       cardp->bootcmdresp = 1;
+                       /* Received valid boot command response */
+                       return;
+               }
+               if (bcmdresp.magic != cpu_to_le32(BOOT_CMD_MAGIC_NUMBER)) {
+                       if (bcmdresp.magic == cpu_to_le32(CMD_TYPE_REQUEST) ||
+                           bcmdresp.magic == cpu_to_le32(CMD_TYPE_DATA) ||
+                           bcmdresp.magic == cpu_to_le32(CMD_TYPE_INDICATION))
+                               cardp->bootcmdresp = -1;
+               } else if (bcmdresp.cmd == BOOT_CMD_FW_BY_USB &&
+                          bcmdresp.result == BOOT_CMD_RESP_OK)
+                       cardp->bootcmdresp = 1;
+
+               kfree_skb(skb);
+               if_usb_submit_rx_urb_fwload(cardp);
+               return;
+       }
+
+       syncfwheader = kmalloc(sizeof(struct fwsyncheader), GFP_ATOMIC);
+       if (!syncfwheader) {
+               kfree_skb(skb);
+               return;
+       }
+
+       memcpy(syncfwheader, skb->data, sizeof(struct fwsyncheader));
+
+       if (!syncfwheader->cmd)
+               cardp->CRC_OK = 1;
+       else
+               cardp->CRC_OK = 0;
+       kfree_skb(skb);
+
+       /* reschedule timer for 200ms hence */
+       mod_timer(&cardp->fw_timeout, jiffies + (HZ/5));
+
+       if (cardp->fwfinalblk) {
+               cardp->fwdnldover = 1;
+               goto exit;
+       }
+
+       if_usb_send_fw_pkt(cardp);
+
+ exit:
+       if_usb_submit_rx_urb_fwload(cardp);
+
+       kfree(syncfwheader);
+
+       return;
+}
+
+#define MRVDRV_MIN_PKT_LEN     30
+
+static inline void process_cmdtypedata(int recvlength, struct sk_buff *skb,
+                                      struct if_usb_card *cardp,
+                                      struct lbtf_private *priv)
+{
+       if (recvlength > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE + MESSAGE_HEADER_LEN
+           || recvlength < MRVDRV_MIN_PKT_LEN) {
+               kfree_skb(skb);
+               return;
+       }
+
+       skb_put(skb, recvlength);
+       skb_pull(skb, MESSAGE_HEADER_LEN);
+       lbtf_rx(priv, skb);
+}
+
+static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
+                                     struct sk_buff *skb,
+                                     struct if_usb_card *cardp,
+                                     struct lbtf_private *priv)
+{
+       if (recvlength > LBS_CMD_BUFFER_SIZE) {
+               kfree_skb(skb);
+               return;
+       }
+
+       if (!in_interrupt())
+               BUG();
+
+       spin_lock(&priv->driver_lock);
+       memcpy(priv->cmd_resp_buff, recvbuff + MESSAGE_HEADER_LEN,
+              recvlength - MESSAGE_HEADER_LEN);
+       kfree_skb(skb);
+       lbtf_cmd_response_rx(priv);
+       spin_unlock(&priv->driver_lock);
+}
+
+/**
+ *  if_usb_receive - read data received from the device.
+ *
+ *  @urb               pointer to struct urb
+ */
+static void if_usb_receive(struct urb *urb)
+{
+       struct if_usb_card *cardp = urb->context;
+       struct sk_buff *skb = cardp->rx_skb;
+       struct lbtf_private *priv = cardp->priv;
+       int recvlength = urb->actual_length;
+       uint8_t *recvbuff = NULL;
+       uint32_t recvtype = 0;
+       __le32 *pkt = (__le32 *) skb->data;
+
+       if (recvlength) {
+               if (urb->status) {
+                       kfree_skb(skb);
+                       goto setup_for_next;
+               }
+
+               recvbuff = skb->data;
+               recvtype = le32_to_cpu(pkt[0]);
+       } else if (urb->status) {
+               kfree_skb(skb);
+               return;
+       }
+
+       switch (recvtype) {
+       case CMD_TYPE_DATA:
+               process_cmdtypedata(recvlength, skb, cardp, priv);
+               break;
+
+       case CMD_TYPE_REQUEST:
+               process_cmdrequest(recvlength, recvbuff, skb, cardp, priv);
+               break;
+
+       case CMD_TYPE_INDICATION:
+       {
+               /* Event cause handling */
+               u32 event_cause = le32_to_cpu(pkt[1]);
+
+               /* Icky undocumented magic special case */
+               if (event_cause & 0xffff0000) {
+                       u16 tmp;
+                       u8 retrycnt;
+                       u8 failure;
+
+                       tmp = event_cause >> 16;
+                       retrycnt = tmp & 0x00ff;
+                       failure = (tmp & 0xff00) >> 8;
+                       lbtf_send_tx_feedback(priv, retrycnt, failure);
+               } else if (event_cause == LBTF_EVENT_BCN_SENT)
+                       lbtf_bcn_sent(priv);
+               else
+                       printk(KERN_DEBUG
+                              "Unsupported notification %d received\n",
+                              event_cause);
+               kfree_skb(skb);
+               break;
+       }
+       default:
+               printk(KERN_DEBUG "libertastf: unknown command type 0x%X\n",
+                            recvtype);
+               kfree_skb(skb);
+               break;
+       }
+
+setup_for_next:
+       if_usb_submit_rx_urb(cardp);
+}
+
+/**
+ *  if_usb_host_to_card -  Download data to the device
+ *
+ *  @priv              pointer to struct lbtf_private structure
+ *  @type              type of data
+ *  @buf               pointer to data buffer
+ *  @len               number of bytes
+ *
+ *  Returns: 0 on success, nonzero otherwise
+ */
+static int if_usb_host_to_card(struct lbtf_private *priv, uint8_t type,
+                              uint8_t *payload, uint16_t nb)
+{
+       struct if_usb_card *cardp = priv->card;
+       u8 data = 0;
+
+       if (type == MVMS_CMD) {
+               *(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
+       } else {
+               *(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_DATA);
+               data = 1;
+       }
+
+       memcpy((cardp->ep_out_buf + MESSAGE_HEADER_LEN), payload, nb);
+
+       return usb_tx_block(cardp, cardp->ep_out_buf, nb + MESSAGE_HEADER_LEN,
+                           data);
+}
+
+/**
+ *  if_usb_issue_boot_command - Issue boot command to Boot2.
+ *
+ *  @ivalue   1 boots from FW by USB-Download, 2 boots from FW in EEPROM.
+ *
+ *  Returns: 0
+ */
+static int if_usb_issue_boot_command(struct if_usb_card *cardp, int ivalue)
+{
+       struct bootcmd *bootcmd = cardp->ep_out_buf;
+
+       /* Prepare command */
+       bootcmd->magic = cpu_to_le32(BOOT_CMD_MAGIC_NUMBER);
+       bootcmd->cmd = ivalue;
+       memset(bootcmd->pad, 0, sizeof(bootcmd->pad));
+
+       /* Issue command */
+       usb_tx_block(cardp, cardp->ep_out_buf, sizeof(*bootcmd), 0);
+
+       return 0;
+}
+
+
+/**
+ *  check_fwfile_format - Check the validity of Boot2/FW image.
+ *
+ *  @data      pointer to image
+ *  @totlen    image length
+ *
+ *  Returns: 0 if the image is valid, nonzero otherwise.
+ */
+static int check_fwfile_format(const u8 *data, u32 totlen)
+{
+       u32 bincmd, exit;
+       u32 blksize, offset, len;
+       int ret;
+
+       ret = 1;
+       exit = len = 0;
+
+       do {
+               struct fwheader *fwh = (void *) data;
+
+               bincmd = le32_to_cpu(fwh->dnldcmd);
+               blksize = le32_to_cpu(fwh->datalength);
+               switch (bincmd) {
+               case FW_HAS_DATA_TO_RECV:
+                       offset = sizeof(struct fwheader) + blksize;
+                       data += offset;
+                       len += offset;
+                       if (len >= totlen)
+                               exit = 1;
+                       break;
+               case FW_HAS_LAST_BLOCK:
+                       exit = 1;
+                       ret = 0;
+                       break;
+               default:
+                       exit = 1;
+                       break;
+               }
+       } while (!exit);
+
+       if (ret)
+               printk(KERN_INFO
+                      "libertastf: firmware file format check failed\n");
+       return ret;
+}
+
+
+static int if_usb_prog_firmware(struct if_usb_card *cardp)
+{
+       int i = 0;
+       static int reset_count = 10;
+       int ret = 0;
+
+       ret = request_firmware(&cardp->fw, lbtf_fw_name, &cardp->udev->dev);
+       if (ret < 0) {
+               printk(KERN_INFO "libertastf: firmware %s not found\n",
+                      lbtf_fw_name);
+               goto done;
+       }
+
+       if (check_fwfile_format(cardp->fw->data, cardp->fw->size))
+               goto release_fw;
+
+restart:
+       if (if_usb_submit_rx_urb_fwload(cardp) < 0) {
+               ret = -1;
+               goto release_fw;
+       }
+
+       cardp->bootcmdresp = 0;
+       do {
+               int j = 0;
+               i++;
+               /* Issue Boot command = 1, Boot from Download-FW */
+               if_usb_issue_boot_command(cardp, BOOT_CMD_FW_BY_USB);
+               /* wait for command response */
+               do {
+                       j++;
+                       msleep_interruptible(100);
+               } while (cardp->bootcmdresp == 0 && j < 10);
+       } while (cardp->bootcmdresp == 0 && i < 5);
+
+       if (cardp->bootcmdresp <= 0) {
+               if (--reset_count >= 0) {
+                       if_usb_reset_device(cardp);
+                       goto restart;
+               }
+               return -1;
+       }
+
+       i = 0;
+
+       cardp->totalbytes = 0;
+       cardp->fwlastblksent = 0;
+       cardp->CRC_OK = 1;
+       cardp->fwdnldover = 0;
+       cardp->fwseqnum = -1;
+       cardp->totalbytes = 0;
+       cardp->fwfinalblk = 0;
+
+       /* Send the first firmware packet... */
+       if_usb_send_fw_pkt(cardp);
+
+       /* ... and wait for the process to complete */
+       wait_event_interruptible(cardp->fw_wq, cardp->priv->surpriseremoved ||
+                                              cardp->fwdnldover);
+
+       del_timer_sync(&cardp->fw_timeout);
+       usb_kill_urb(cardp->rx_urb);
+
+       if (!cardp->fwdnldover) {
+               printk(KERN_INFO "libertastf: failed to load fw,"
+                                " resetting device!\n");
+               if (--reset_count >= 0) {
+                       if_usb_reset_device(cardp);
+                       goto restart;
+               }
+
+               printk(KERN_INFO "libertastf: fw download failure\n");
+               ret = -1;
+               goto release_fw;
+       }
+
+       cardp->priv->fw_ready = 1;
+
+ release_fw:
+       release_firmware(cardp->fw);
+       cardp->fw = NULL;
+
+       if_usb_setup_firmware(cardp->priv);
+
+ done:
+       return ret;
+}
+EXPORT_SYMBOL_GPL(if_usb_prog_firmware);
+
+
+#define if_usb_suspend NULL
+#define if_usb_resume NULL
+
+static struct usb_driver if_usb_driver = {
+       .name = DRV_NAME,
+       .probe = if_usb_probe,
+       .disconnect = if_usb_disconnect,
+       .id_table = if_usb_table,
+       .suspend = if_usb_suspend,
+       .resume = if_usb_resume,
+};
+
+static int __init if_usb_init_module(void)
+{
+       int ret = 0;
+
+       ret = usb_register(&if_usb_driver);
+       return ret;
+}
+
+static void __exit if_usb_exit_module(void)
+{
+       usb_deregister(&if_usb_driver);
+}
+
+module_init(if_usb_init_module);
+module_exit(if_usb_exit_module);
+
+MODULE_DESCRIPTION("8388 USB WLAN Thinfirm Driver");
+MODULE_AUTHOR("Cozybit Inc.");
+MODULE_LICENSE("GPL");
diff --git a/drivers/net/wireless/libertas_tf/if_usb.h b/drivers/net/wireless/libertas_tf/if_usb.h
new file mode 100644 (file)
index 0000000..6fa5b3f
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ *  Copyright (C) 2008, cozybit Inc.
+ *  Copyright (C) 2003-2006, Marvell International Ltd.
+ *
+ *  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/wait.h>
+#include <linux/timer.h>
+
+struct lbtf_private;
+
+/**
+  * This file contains definition for USB interface.
+  */
+#define CMD_TYPE_REQUEST               0xF00DFACE
+#define CMD_TYPE_DATA                  0xBEADC0DE
+#define CMD_TYPE_INDICATION            0xBEEFFACE
+
+#define BOOT_CMD_FW_BY_USB             0x01
+#define BOOT_CMD_FW_IN_EEPROM          0x02
+#define BOOT_CMD_UPDATE_BOOT2          0x03
+#define BOOT_CMD_UPDATE_FW             0x04
+#define BOOT_CMD_MAGIC_NUMBER          0x4C56524D   /* LVRM */
+
+struct bootcmd {
+       __le32  magic;
+       uint8_t cmd;
+       uint8_t pad[11];
+};
+
+#define BOOT_CMD_RESP_OK               0x0001
+#define BOOT_CMD_RESP_FAIL             0x0000
+
+struct bootcmdresp {
+       __le32  magic;
+       uint8_t cmd;
+       uint8_t result;
+       uint8_t pad[2];
+};
+
+/** USB card description structure*/
+struct if_usb_card {
+       struct usb_device *udev;
+       struct urb *rx_urb, *tx_urb, *cmd_urb;
+       struct lbtf_private *priv;
+
+       struct sk_buff *rx_skb;
+
+       uint8_t ep_in;
+       uint8_t ep_out;
+
+       int8_t bootcmdresp;
+
+       int ep_in_size;
+
+       void *ep_out_buf;
+       int ep_out_size;
+
+       const struct firmware *fw;
+       struct timer_list fw_timeout;
+       wait_queue_head_t fw_wq;
+       uint32_t fwseqnum;
+       uint32_t totalbytes;
+       uint32_t fwlastblksent;
+       uint8_t CRC_OK;
+       uint8_t fwdnldover;
+       uint8_t fwfinalblk;
+
+       __le16 boot2_version;
+};
+
+/** fwheader */
+struct fwheader {
+       __le32 dnldcmd;
+       __le32 baseaddr;
+       __le32 datalength;
+       __le32 CRC;
+};
+
+#define FW_MAX_DATA_BLK_SIZE   600
+/** FWData */
+struct fwdata {
+       struct fwheader hdr;
+       __le32 seqnum;
+       uint8_t data[0];
+};
+
+/** fwsyncheader */
+struct fwsyncheader {
+       __le32 cmd;
+       __le32 seqnum;
+};
+
+#define FW_HAS_DATA_TO_RECV            0x00000001
+#define FW_HAS_LAST_BLOCK              0x00000004
diff --git a/drivers/net/wireless/libertas_tf/libertas_tf.h b/drivers/net/wireless/libertas_tf/libertas_tf.h
new file mode 100644 (file)
index 0000000..8995cd7
--- /dev/null
@@ -0,0 +1,514 @@
+/*
+ *  Copyright (C) 2008, cozybit Inc.
+ *  Copyright (C) 2007, Red Hat, Inc.
+ *  Copyright (C) 2003-2006, Marvell International Ltd.
+ *
+ *  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/spinlock.h>
+#include <linux/device.h>
+#include <linux/kthread.h>
+#include <net/mac80211.h>
+
+#ifndef DRV_NAME
+#define DRV_NAME "libertas_tf"
+#endif
+
+#define        MRVL_DEFAULT_RETRIES                    9
+#define MRVL_PER_PACKET_RATE                   0x10
+#define MRVL_MAX_BCN_SIZE                      440
+#define CMD_OPTION_WAITFORRSP                  0x0002
+
+/* Return command are almost always the same as the host command, but with
+ * bit 15 set high.  There are a few exceptions, though...
+ */
+#define CMD_RET(cmd)                   (0x8000 | cmd)
+
+/* Command codes */
+#define CMD_GET_HW_SPEC                                0x0003
+#define CMD_802_11_RESET                       0x0005
+#define CMD_MAC_MULTICAST_ADR                  0x0010
+#define CMD_802_11_RADIO_CONTROL               0x001c
+#define CMD_802_11_RF_CHANNEL                  0x001d
+#define CMD_802_11_RF_TX_POWER                 0x001e
+#define CMD_MAC_CONTROL                                0x0028
+#define CMD_802_11_MAC_ADDRESS                 0x004d
+#define        CMD_SET_BOOT2_VER                       0x00a5
+#define CMD_802_11_BEACON_CTRL                 0x00b0
+#define CMD_802_11_BEACON_SET                  0x00cb
+#define CMD_802_11_SET_MODE                    0x00cc
+#define CMD_802_11_SET_BSSID                   0x00cd
+
+#define CMD_ACT_GET                    0x0000
+#define CMD_ACT_SET                    0x0001
+
+/* Define action or option for CMD_802_11_RESET */
+#define CMD_ACT_HALT                   0x0003
+
+/* Define action or option for CMD_MAC_CONTROL */
+#define CMD_ACT_MAC_RX_ON                      0x0001
+#define CMD_ACT_MAC_TX_ON                      0x0002
+#define CMD_ACT_MAC_MULTICAST_ENABLE           0x0020
+#define CMD_ACT_MAC_BROADCAST_ENABLE           0x0040
+#define CMD_ACT_MAC_PROMISCUOUS_ENABLE         0x0080
+#define CMD_ACT_MAC_ALL_MULTICAST_ENABLE       0x0100
+
+/* Define action or option for CMD_802_11_RADIO_CONTROL */
+#define CMD_TYPE_AUTO_PREAMBLE         0x0001
+#define CMD_TYPE_SHORT_PREAMBLE                0x0002
+#define CMD_TYPE_LONG_PREAMBLE         0x0003
+
+#define TURN_ON_RF                     0x01
+#define RADIO_ON                       0x01
+#define RADIO_OFF                      0x00
+
+#define SET_AUTO_PREAMBLE              0x05
+#define SET_SHORT_PREAMBLE             0x03
+#define SET_LONG_PREAMBLE              0x01
+
+/* Define action or option for CMD_802_11_RF_CHANNEL */
+#define CMD_OPT_802_11_RF_CHANNEL_GET  0x00
+#define CMD_OPT_802_11_RF_CHANNEL_SET  0x01
+
+/* Codes for CMD_802_11_SET_MODE */
+enum lbtf_mode {
+       LBTF_PASSIVE_MODE,
+       LBTF_STA_MODE,
+       LBTF_AP_MODE,
+};
+
+/** Card Event definition */
+#define MACREG_INT_CODE_FIRMWARE_READY         48
+/** Buffer Constants */
+
+/*     The size of SQ memory PPA, DPA are 8 DWORDs, that keep the physical
+*      addresses of TxPD buffers. Station has only 8 TxPD available, Whereas
+*      driver has more local TxPDs. Each TxPD on the host memory is associated
+*      with a Tx control node. The driver maintains 8 RxPD descriptors for
+*      station firmware to store Rx packet information.
+*
+*      Current version of MAC has a 32x6 multicast address buffer.
+*
+*      802.11b can have up to  14 channels, the driver keeps the
+*      BSSID(MAC address) of each APs or Ad hoc stations it has sensed.
+*/
+
+#define MRVDRV_MAX_MULTICAST_LIST_SIZE 32
+#define LBS_NUM_CMD_BUFFERS             10
+#define LBS_CMD_BUFFER_SIZE             (2 * 1024)
+#define MRVDRV_MAX_CHANNEL_SIZE                14
+#define MRVDRV_SNAP_HEADER_LEN          8
+
+#define        LBS_UPLD_SIZE                   2312
+#define DEV_NAME_LEN                   32
+
+/** Misc constants */
+/* This section defines 802.11 specific contants */
+
+#define MRVDRV_MAX_REGION_CODE                 6
+/**
+ * the table to keep region code
+ */
+#define LBTF_REGDOMAIN_US      0x10
+#define LBTF_REGDOMAIN_CA      0x20
+#define LBTF_REGDOMAIN_EU      0x30
+#define LBTF_REGDOMAIN_SP      0x31
+#define LBTF_REGDOMAIN_FR      0x32
+#define LBTF_REGDOMAIN_JP      0x40
+
+#define SBI_EVENT_CAUSE_SHIFT          3
+
+/** RxPD status */
+
+#define MRVDRV_RXPD_STATUS_OK                0x0001
+
+
+/* This is for firmware specific length */
+#define EXTRA_LEN      36
+
+#define MRVDRV_ETH_TX_PACKET_BUFFER_SIZE \
+       (ETH_FRAME_LEN + sizeof(struct txpd) + EXTRA_LEN)
+
+#define MRVDRV_ETH_RX_PACKET_BUFFER_SIZE \
+       (ETH_FRAME_LEN + sizeof(struct rxpd) \
+        + MRVDRV_SNAP_HEADER_LEN + EXTRA_LEN)
+
+#define        CMD_F_HOSTCMD           (1 << 0)
+#define FW_CAPINFO_WPA         (1 << 0)
+
+#define RF_ANTENNA_1           0x1
+#define RF_ANTENNA_2           0x2
+#define RF_ANTENNA_AUTO                0xFFFF
+
+#define LBTF_EVENT_BCN_SENT    55
+
+/** Global Variable Declaration */
+/** mv_ms_type */
+enum mv_ms_type {
+       MVMS_DAT = 0,
+       MVMS_CMD = 1,
+       MVMS_TXDONE = 2,
+       MVMS_EVENT
+};
+
+extern struct workqueue_struct *lbtf_wq;
+
+struct lbtf_private;
+
+struct lbtf_offset_value {
+       u32 offset;
+       u32 value;
+};
+
+struct channel_range {
+       u8 regdomain;
+       u8 start;
+       u8 end; /* exclusive (channel must be less than end) */
+};
+
+struct if_usb_card;
+
+/** Private structure for the MV device */
+struct lbtf_private {
+       void *card;
+       struct ieee80211_hw *hw;
+
+       /* Command response buffer */
+       u8 cmd_resp_buff[LBS_UPLD_SIZE];
+       /* Download sent:
+          bit0 1/0=data_sent/data_tx_done,
+          bit1 1/0=cmd_sent/cmd_tx_done,
+          all other bits reserved 0 */
+       struct ieee80211_vif *vif;
+
+       struct work_struct cmd_work;
+       struct work_struct tx_work;
+       /** Hardware access */
+       int (*hw_host_to_card) (struct lbtf_private *priv, u8 type, u8 *payload, u16 nb);
+       int (*hw_prog_firmware) (struct if_usb_card *cardp);
+       int (*hw_reset_device) (struct if_usb_card *cardp);
+
+
+       /** Wlan adapter data structure*/
+       /** STATUS variables */
+       u32 fwrelease;
+       u32 fwcapinfo;
+       /* protected with big lock */
+
+       struct mutex lock;
+
+       /** command-related variables */
+       u16 seqnum;
+       /* protected by big lock */
+
+       struct cmd_ctrl_node *cmd_array;
+       /** Current command */
+       struct cmd_ctrl_node *cur_cmd;
+       /** command Queues */
+       /** Free command buffers */
+       struct list_head cmdfreeq;
+       /** Pending command buffers */
+       struct list_head cmdpendingq;
+
+       /** spin locks */
+       spinlock_t driver_lock;
+
+       /** Timers */
+       struct timer_list command_timer;
+       int nr_retries;
+       int cmd_timed_out;
+
+       u8 cmd_response_rxed;
+
+       /** capability Info used in Association, start, join */
+       u16 capability;
+
+       /** MAC address information */
+       u8 current_addr[ETH_ALEN];
+       u8 multicastlist[MRVDRV_MAX_MULTICAST_LIST_SIZE][ETH_ALEN];
+       u32 nr_of_multicastmacaddr;
+       int cur_freq;
+
+       struct sk_buff *skb_to_tx;
+       struct sk_buff *tx_skb;
+
+       /** NIC Operation characteristics */
+       u16 mac_control;
+       u16 regioncode;
+       struct channel_range range;
+
+       u8 radioon;
+       u32 preamble;
+
+       struct ieee80211_channel channels[14];
+       struct ieee80211_rate rates[12];
+       struct ieee80211_supported_band band;
+       struct lbtf_offset_value offsetvalue;
+
+       u8 fw_ready;
+       u8 surpriseremoved;
+       struct sk_buff_head bc_ps_buf;
+};
+
+/* 802.11-related definitions */
+
+/* TxPD descriptor */
+struct txpd {
+       /* Current Tx packet status */
+       __le32 tx_status;
+       /* Tx control */
+       __le32 tx_control;
+       __le32 tx_packet_location;
+       /* Tx packet length */
+       __le16 tx_packet_length;
+       /* First 2 byte of destination MAC address */
+       u8 tx_dest_addr_high[2];
+       /* Last 4 byte of destination MAC address */
+       u8 tx_dest_addr_low[4];
+       /* Pkt Priority */
+       u8 priority;
+       /* Pkt Trasnit Power control */
+       u8 powermgmt;
+       /* Time the packet has been queued in the driver (units = 2ms) */
+       u8 pktdelay_2ms;
+       /* reserved */
+       u8 reserved1;
+};
+
+/* RxPD Descriptor */
+struct rxpd {
+       /* Current Rx packet status */
+       __le16 status;
+
+       /* SNR */
+       u8 snr;
+
+       /* Tx control */
+       u8 rx_control;
+
+       /* Pkt length */
+       __le16 pkt_len;
+
+       /* Noise Floor */
+       u8 nf;
+
+       /* Rx Packet Rate */
+       u8 rx_rate;
+
+       /* Pkt addr */
+       __le32 pkt_ptr;
+
+       /* Next Rx RxPD addr */
+       __le32 next_rxpd_ptr;
+
+       /* Pkt Priority */
+       u8 priority;
+       u8 reserved[3];
+};
+
+struct cmd_header {
+       __le16 command;
+       __le16 size;
+       __le16 seqnum;
+       __le16 result;
+} __attribute__ ((packed));
+
+struct cmd_ctrl_node {
+       struct list_head list;
+       int result;
+       /* command response */
+       int (*callback)(struct lbtf_private *,
+                       unsigned long, struct cmd_header *);
+       unsigned long callback_arg;
+       /* command data */
+       struct cmd_header *cmdbuf;
+       /* wait queue */
+       u16 cmdwaitqwoken;
+       wait_queue_head_t cmdwait_q;
+};
+
+/*
+ * Define data structure for CMD_GET_HW_SPEC
+ * This structure defines the response for the GET_HW_SPEC command
+ */
+struct cmd_ds_get_hw_spec {
+       struct cmd_header hdr;
+
+       /* HW Interface version number */
+       __le16 hwifversion;
+       /* HW version number */
+       __le16 version;
+       /* Max number of TxPD FW can handle */
+       __le16 nr_txpd;
+       /* Max no of Multicast address */
+       __le16 nr_mcast_adr;
+       /* MAC address */
+       u8 permanentaddr[6];
+
+       /* region Code */
+       __le16 regioncode;
+
+       /* Number of antenna used */
+       __le16 nr_antenna;
+
+       /* FW release number, example 0x01030304 = 2.3.4p1 */
+       __le32 fwrelease;
+
+       /* Base Address of TxPD queue */
+       __le32 wcb_base;
+       /* Read Pointer of RxPd queue */
+       __le32 rxpd_rdptr;
+
+       /* Write Pointer of RxPd queue */
+       __le32 rxpd_wrptr;
+
+       /*FW/HW capability */
+       __le32 fwcapinfo;
+} __attribute__ ((packed));
+
+struct cmd_ds_mac_control {
+       struct cmd_header hdr;
+       __le16 action;
+       u16 reserved;
+};
+
+struct cmd_ds_802_11_mac_address {
+       struct cmd_header hdr;
+
+       __le16 action;
+       uint8_t macadd[ETH_ALEN];
+};
+
+struct cmd_ds_mac_multicast_addr {
+       struct cmd_header hdr;
+
+       __le16 action;
+       __le16 nr_of_adrs;
+       u8 maclist[ETH_ALEN * MRVDRV_MAX_MULTICAST_LIST_SIZE];
+};
+
+struct cmd_ds_set_mode {
+       struct cmd_header hdr;
+
+       __le16 mode;
+};
+
+struct cmd_ds_set_bssid {
+       struct cmd_header hdr;
+
+       u8 bssid[6];
+       u8 activate;
+};
+
+struct cmd_ds_802_11_radio_control {
+       struct cmd_header hdr;
+
+       __le16 action;
+       __le16 control;
+};
+
+
+struct cmd_ds_802_11_rf_channel {
+       struct cmd_header hdr;
+
+       __le16 action;
+       __le16 channel;
+       __le16 rftype;      /* unused */
+       __le16 reserved;    /* unused */
+       u8 channellist[32]; /* unused */
+};
+
+struct cmd_ds_set_boot2_ver {
+       struct cmd_header hdr;
+
+       __le16 action;
+       __le16 version;
+};
+
+struct cmd_ds_802_11_reset {
+       struct cmd_header hdr;
+
+       __le16 action;
+};
+
+struct cmd_ds_802_11_beacon_control {
+       struct cmd_header hdr;
+
+       __le16 action;
+       __le16 beacon_enable;
+       __le16 beacon_period;
+};
+
+struct cmd_ds_802_11_beacon_set {
+       struct cmd_header hdr;
+
+       __le16 len;
+       u8 beacon[MRVL_MAX_BCN_SIZE];
+};
+
+struct lbtf_private;
+struct cmd_ctrl_node;
+
+/** Function Prototype Declaration */
+void lbtf_set_mac_control(struct lbtf_private *priv);
+
+int lbtf_free_cmd_buffer(struct lbtf_private *priv);
+
+int lbtf_allocate_cmd_buffer(struct lbtf_private *priv);
+int lbtf_execute_next_command(struct lbtf_private *priv);
+int lbtf_set_radio_control(struct lbtf_private *priv);
+int lbtf_update_hw_spec(struct lbtf_private *priv);
+int lbtf_cmd_set_mac_multicast_addr(struct lbtf_private *priv);
+void lbtf_set_mode(struct lbtf_private *priv, enum lbtf_mode mode);
+void lbtf_set_bssid(struct lbtf_private *priv, bool activate, u8 *bssid);
+int lbtf_set_mac_address(struct lbtf_private *priv, uint8_t *mac_addr);
+
+int lbtf_set_channel(struct lbtf_private *priv, u8 channel);
+
+int lbtf_beacon_set(struct lbtf_private *priv, struct sk_buff *beacon);
+int lbtf_beacon_ctrl(struct lbtf_private *priv, bool beacon_enable,
+                    int beacon_int);
+
+
+int lbtf_process_rx_command(struct lbtf_private *priv);
+void lbtf_complete_command(struct lbtf_private *priv, struct cmd_ctrl_node *cmd,
+                         int result);
+void lbtf_cmd_response_rx(struct lbtf_private *priv);
+
+/* main.c */
+struct chan_freq_power *lbtf_get_region_cfp_table(u8 region,
+       int *cfp_no);
+struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev);
+int lbtf_remove_card(struct lbtf_private *priv);
+int lbtf_start_card(struct lbtf_private *priv);
+int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb);
+void lbtf_send_tx_feedback(struct lbtf_private *priv, u8 retrycnt, u8 fail);
+void lbtf_bcn_sent(struct lbtf_private *priv);
+
+/* support functions for cmd.c */
+/* lbtf_cmd() infers the size of the buffer to copy data back into, from
+   the size of the target of the pointer. Since the command to be sent
+   may often be smaller, that size is set in cmd->size by the caller.*/
+#define lbtf_cmd(priv, cmdnr, cmd, cb, cb_arg) ({              \
+       uint16_t __sz = le16_to_cpu((cmd)->hdr.size);           \
+       (cmd)->hdr.size = cpu_to_le16(sizeof(*(cmd)));          \
+       __lbtf_cmd(priv, cmdnr, &(cmd)->hdr, __sz, cb, cb_arg); \
+})
+
+#define lbtf_cmd_with_response(priv, cmdnr, cmd)       \
+       lbtf_cmd(priv, cmdnr, cmd, lbtf_cmd_copyback, (unsigned long) (cmd))
+
+void lbtf_cmd_async(struct lbtf_private *priv, uint16_t command,
+       struct cmd_header *in_cmd, int in_cmd_size);
+
+int __lbtf_cmd(struct lbtf_private *priv, uint16_t command,
+             struct cmd_header *in_cmd, int in_cmd_size,
+             int (*callback)(struct lbtf_private *, unsigned long,
+                             struct cmd_header *),
+             unsigned long callback_arg);
+
+int lbtf_cmd_copyback(struct lbtf_private *priv, unsigned long extra,
+                    struct cmd_header *resp);
diff --git a/drivers/net/wireless/libertas_tf/main.c b/drivers/net/wireless/libertas_tf/main.c
new file mode 100644 (file)
index 0000000..2c1d680
--- /dev/null
@@ -0,0 +1,666 @@
+/*
+ *  Copyright (C) 2008, cozybit Inc.
+ *  Copyright (C) 2003-2006, Marvell International Ltd.
+ *
+ *  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 "libertas_tf.h"
+#include "linux/etherdevice.h"
+
+#define DRIVER_RELEASE_VERSION "004.p0"
+/* thinfirm version: 5.132.X.pX */
+#define LBTF_FW_VER_MIN                0x05840300
+#define LBTF_FW_VER_MAX                0x0584ffff
+#define QOS_CONTROL_LEN                2
+
+static const char lbtf_driver_version[] = "THINFIRM-USB8388-" DRIVER_RELEASE_VERSION;
+struct workqueue_struct *lbtf_wq;
+
+static const struct ieee80211_channel lbtf_channels[] = {
+       { .center_freq = 2412, .hw_value = 1 },
+       { .center_freq = 2417, .hw_value = 2 },
+       { .center_freq = 2422, .hw_value = 3 },
+       { .center_freq = 2427, .hw_value = 4 },
+       { .center_freq = 2432, .hw_value = 5 },
+       { .center_freq = 2437, .hw_value = 6 },
+       { .center_freq = 2442, .hw_value = 7 },
+       { .center_freq = 2447, .hw_value = 8 },
+       { .center_freq = 2452, .hw_value = 9 },
+       { .center_freq = 2457, .hw_value = 10 },
+       { .center_freq = 2462, .hw_value = 11 },
+       { .center_freq = 2467, .hw_value = 12 },
+       { .center_freq = 2472, .hw_value = 13 },
+       { .center_freq = 2484, .hw_value = 14 },
+};
+
+/* This table contains the hardware specific values for the modulation rates. */
+static const struct ieee80211_rate lbtf_rates[] = {
+       { .bitrate = 10,
+         .hw_value = 0, },
+       { .bitrate = 20,
+         .hw_value = 1,
+         .flags = IEEE80211_RATE_SHORT_PREAMBLE },
+       { .bitrate = 55,
+         .hw_value = 2,
+         .flags = IEEE80211_RATE_SHORT_PREAMBLE },
+       { .bitrate = 110,
+         .hw_value = 3,
+         .flags = IEEE80211_RATE_SHORT_PREAMBLE },
+       { .bitrate = 60,
+         .hw_value = 5,
+         .flags = 0 },
+       { .bitrate = 90,
+         .hw_value = 6,
+         .flags = 0 },
+       { .bitrate = 120,
+         .hw_value = 7,
+         .flags = 0 },
+       { .bitrate = 180,
+         .hw_value = 8,
+         .flags = 0 },
+       { .bitrate = 240,
+         .hw_value = 9,
+         .flags = 0 },
+       { .bitrate = 360,
+         .hw_value = 10,
+         .flags = 0 },
+       { .bitrate = 480,
+         .hw_value = 11,
+         .flags = 0 },
+       { .bitrate = 540,
+         .hw_value = 12,
+         .flags = 0 },
+};
+
+static void lbtf_cmd_work(struct work_struct *work)
+{
+       struct lbtf_private *priv = container_of(work, struct lbtf_private,
+                                        cmd_work);
+       spin_lock_irq(&priv->driver_lock);
+       /* command response? */
+       if (priv->cmd_response_rxed) {
+               priv->cmd_response_rxed = 0;
+               spin_unlock_irq(&priv->driver_lock);
+               lbtf_process_rx_command(priv);
+               spin_lock_irq(&priv->driver_lock);
+       }
+
+       if (priv->cmd_timed_out && priv->cur_cmd) {
+               struct cmd_ctrl_node *cmdnode = priv->cur_cmd;
+
+               if (++priv->nr_retries > 10) {
+                       lbtf_complete_command(priv, cmdnode,
+                                             -ETIMEDOUT);
+                       priv->nr_retries = 0;
+               } else {
+                       priv->cur_cmd = NULL;
+
+                       /* Stick it back at the _top_ of the pending
+                        * queue for immediate resubmission */
+                       list_add(&cmdnode->list, &priv->cmdpendingq);
+               }
+       }
+       priv->cmd_timed_out = 0;
+       spin_unlock_irq(&priv->driver_lock);
+
+       if (!priv->fw_ready)
+               return;
+       /* Execute the next command */
+       if (!priv->cur_cmd)
+               lbtf_execute_next_command(priv);
+}
+
+/**
+ *  lbtf_setup_firmware: initialize firmware.
+ *
+ *  @priv    A pointer to struct lbtf_private structure
+ *
+ *  Returns: 0 on success.
+ */
+static int lbtf_setup_firmware(struct lbtf_private *priv)
+{
+       int ret = -1;
+
+       /*
+        * Read priv address from HW
+        */
+       memset(priv->current_addr, 0xff, ETH_ALEN);
+       ret = lbtf_update_hw_spec(priv);
+       if (ret) {
+               ret = -1;
+               goto done;
+       }
+
+       lbtf_set_mac_control(priv);
+       lbtf_set_radio_control(priv);
+
+       ret = 0;
+done:
+       return ret;
+}
+
+/**
+ *  This function handles the timeout of command sending.
+ *  It will re-send the same command again.
+ */
+static void command_timer_fn(unsigned long data)
+{
+       struct lbtf_private *priv = (struct lbtf_private *)data;
+       unsigned long flags;
+
+       spin_lock_irqsave(&priv->driver_lock, flags);
+
+       if (!priv->cur_cmd) {
+               printk(KERN_DEBUG "libertastf: command timer expired; "
+                                 "no pending command\n");
+               goto out;
+       }
+
+       printk(KERN_DEBUG "libertas: command %x timed out\n",
+               le16_to_cpu(priv->cur_cmd->cmdbuf->command));
+
+       priv->cmd_timed_out = 1;
+       queue_work(lbtf_wq, &priv->cmd_work);
+out:
+       spin_unlock_irqrestore(&priv->driver_lock, flags);
+}
+
+static int lbtf_init_adapter(struct lbtf_private *priv)
+{
+       memset(priv->current_addr, 0xff, ETH_ALEN);
+       mutex_init(&priv->lock);
+
+       priv->vif = NULL;
+       setup_timer(&priv->command_timer, command_timer_fn,
+               (unsigned long)priv);
+
+       INIT_LIST_HEAD(&priv->cmdfreeq);
+       INIT_LIST_HEAD(&priv->cmdpendingq);
+
+       spin_lock_init(&priv->driver_lock);
+
+       /* Allocate the command buffers */
+       if (lbtf_allocate_cmd_buffer(priv))
+               return -1;
+
+       return 0;
+}
+
+static void lbtf_free_adapter(struct lbtf_private *priv)
+{
+       lbtf_free_cmd_buffer(priv);
+       del_timer(&priv->command_timer);
+}
+
+static int lbtf_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
+{
+       struct lbtf_private *priv = hw->priv;
+
+       priv->skb_to_tx = skb;
+       queue_work(lbtf_wq, &priv->tx_work);
+       /*
+        * queue will be restarted when we receive transmission feedback if
+        * there are no buffered multicast frames to send
+        */
+       ieee80211_stop_queues(priv->hw);
+       return 0;
+}
+
+static void lbtf_tx_work(struct work_struct *work)
+{
+       struct lbtf_private *priv = container_of(work, struct lbtf_private,
+                                        tx_work);
+       unsigned int len;
+       struct ieee80211_tx_info *info;
+       struct txpd *txpd;
+       struct sk_buff *skb = NULL;
+       int err;
+
+       if ((priv->vif->type == IEEE80211_IF_TYPE_AP) &&
+           (!skb_queue_empty(&priv->bc_ps_buf)))
+               skb = skb_dequeue(&priv->bc_ps_buf);
+       else if (priv->skb_to_tx) {
+               skb = priv->skb_to_tx;
+               priv->skb_to_tx = NULL;
+       } else
+               return;
+
+       len = skb->len;
+       info  = IEEE80211_SKB_CB(skb);
+       txpd = (struct txpd *)  skb_push(skb, sizeof(struct txpd));
+
+       if (priv->surpriseremoved) {
+               dev_kfree_skb_any(skb);
+               return;
+       }
+
+       memset(txpd, 0, sizeof(struct txpd));
+       /* Activate per-packet rate selection */
+       txpd->tx_control |= cpu_to_le32(MRVL_PER_PACKET_RATE |
+                            ieee80211_get_tx_rate(priv->hw, info)->hw_value);
+
+       /* copy destination address from 802.11 header */
+       memcpy(txpd->tx_dest_addr_high, skb->data + sizeof(struct txpd) + 4,
+               ETH_ALEN);
+       txpd->tx_packet_length = cpu_to_le16(len);
+       txpd->tx_packet_location = cpu_to_le32(sizeof(struct txpd));
+       BUG_ON(priv->tx_skb);
+       spin_lock_irq(&priv->driver_lock);
+       priv->tx_skb = skb;
+       err = priv->hw_host_to_card(priv, MVMS_DAT, skb->data, skb->len);
+       spin_unlock_irq(&priv->driver_lock);
+       if (err) {
+               dev_kfree_skb_any(skb);
+               priv->tx_skb = NULL;
+       }
+}
+
+static int lbtf_op_start(struct ieee80211_hw *hw)
+{
+       struct lbtf_private *priv = hw->priv;
+       void *card = priv->card;
+       int ret = -1;
+
+       if (!priv->fw_ready)
+               /* Upload firmware */
+               if (priv->hw_prog_firmware(card))
+                       goto err_prog_firmware;
+
+       /* poke the firmware */
+       priv->capability = WLAN_CAPABILITY_SHORT_PREAMBLE;
+       priv->radioon = RADIO_ON;
+       priv->mac_control = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON;
+       ret = lbtf_setup_firmware(priv);
+       if (ret)
+               goto err_prog_firmware;
+
+       if ((priv->fwrelease < LBTF_FW_VER_MIN) ||
+           (priv->fwrelease > LBTF_FW_VER_MAX)) {
+               ret = -1;
+               goto err_prog_firmware;
+       }
+
+       printk(KERN_INFO "libertastf: Marvell WLAN 802.11 thinfirm adapter\n");
+       return 0;
+
+err_prog_firmware:
+       priv->hw_reset_device(card);
+       return ret;
+}
+
+static void lbtf_op_stop(struct ieee80211_hw *hw)
+{
+       struct lbtf_private *priv = hw->priv;
+       unsigned long flags;
+       struct sk_buff *skb;
+
+       struct cmd_ctrl_node *cmdnode;
+       /* Flush pending command nodes */
+       spin_lock_irqsave(&priv->driver_lock, flags);
+       list_for_each_entry(cmdnode, &priv->cmdpendingq, list) {
+               cmdnode->result = -ENOENT;
+               cmdnode->cmdwaitqwoken = 1;
+               wake_up_interruptible(&cmdnode->cmdwait_q);
+       }
+
+       spin_unlock_irqrestore(&priv->driver_lock, flags);
+       cancel_work_sync(&priv->cmd_work);
+       cancel_work_sync(&priv->tx_work);
+       while ((skb = skb_dequeue(&priv->bc_ps_buf)))
+               dev_kfree_skb_any(skb);
+       priv->radioon = RADIO_OFF;
+       lbtf_set_radio_control(priv);
+
+       return;
+}
+
+static int lbtf_op_add_interface(struct ieee80211_hw *hw,
+                       struct ieee80211_if_init_conf *conf)
+{
+       struct lbtf_private *priv = hw->priv;
+       if (priv->vif != NULL)
+               return -EOPNOTSUPP;
+
+       priv->vif = conf->vif;
+       switch (conf->type) {
+       case IEEE80211_IF_TYPE_MESH_POINT:
+       case IEEE80211_IF_TYPE_AP:
+               lbtf_set_mode(priv, LBTF_AP_MODE);
+               break;
+       case IEEE80211_IF_TYPE_STA:
+               lbtf_set_mode(priv, LBTF_STA_MODE);
+               break;
+       default:
+               priv->vif = NULL;
+               return -EOPNOTSUPP;
+       }
+       lbtf_set_mac_address(priv, (u8 *) conf->mac_addr);
+       return 0;
+}
+
+static void lbtf_op_remove_interface(struct ieee80211_hw *hw,
+                       struct ieee80211_if_init_conf *conf)
+{
+       struct lbtf_private *priv = hw->priv;
+
+       if (priv->vif->type == IEEE80211_IF_TYPE_AP ||
+           priv->vif->type == IEEE80211_IF_TYPE_MESH_POINT)
+               lbtf_beacon_ctrl(priv, 0, 0);
+       lbtf_set_mode(priv, LBTF_PASSIVE_MODE);
+       lbtf_set_bssid(priv, 0, NULL);
+       priv->vif = NULL;
+}
+
+static int lbtf_op_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf)
+{
+       struct lbtf_private *priv = hw->priv;
+       if (conf->channel->center_freq != priv->cur_freq) {
+               priv->cur_freq = conf->channel->center_freq;
+               lbtf_set_channel(priv, conf->channel->hw_value);
+       }
+       return 0;
+}
+
+static int lbtf_op_config_interface(struct ieee80211_hw *hw,
+                       struct ieee80211_vif *vif,
+                       struct ieee80211_if_conf *conf)
+{
+       struct lbtf_private *priv = hw->priv;
+       struct sk_buff *beacon;
+
+       switch (priv->vif->type) {
+       case IEEE80211_IF_TYPE_AP:
+       case IEEE80211_IF_TYPE_MESH_POINT:
+               beacon = ieee80211_beacon_get(hw, vif);
+               if (beacon) {
+                       lbtf_beacon_set(priv, beacon);
+                       kfree_skb(beacon);
+                       lbtf_beacon_ctrl(priv, 1, hw->conf.beacon_int);
+               }
+               break;
+       default:
+               break;
+       }
+
+       if (conf->bssid) {
+               u8 null_bssid[ETH_ALEN] = {0};
+               bool activate = compare_ether_addr(conf->bssid, null_bssid);
+               lbtf_set_bssid(priv, activate, conf->bssid);
+       }
+
+       return 0;
+}
+
+#define SUPPORTED_FIF_FLAGS  (FIF_PROMISC_IN_BSS | FIF_ALLMULTI)
+static void lbtf_op_configure_filter(struct ieee80211_hw *hw,
+                       unsigned int changed_flags,
+                       unsigned int *new_flags,
+                       int mc_count, struct dev_mc_list *mclist)
+{
+       struct lbtf_private *priv = hw->priv;
+       int old_mac_control = priv->mac_control;
+       int i;
+       changed_flags &= SUPPORTED_FIF_FLAGS;
+       *new_flags &= SUPPORTED_FIF_FLAGS;
+
+       if (!changed_flags)
+               return;
+
+       if (*new_flags & (FIF_PROMISC_IN_BSS))
+               priv->mac_control |= CMD_ACT_MAC_PROMISCUOUS_ENABLE;
+       else
+               priv->mac_control &= ~CMD_ACT_MAC_PROMISCUOUS_ENABLE;
+       if (*new_flags & (FIF_ALLMULTI) ||
+           mc_count > MRVDRV_MAX_MULTICAST_LIST_SIZE) {
+               priv->mac_control |= CMD_ACT_MAC_ALL_MULTICAST_ENABLE;
+               priv->mac_control &= ~CMD_ACT_MAC_MULTICAST_ENABLE;
+       } else if (mc_count) {
+               priv->mac_control |= CMD_ACT_MAC_MULTICAST_ENABLE;
+               priv->mac_control &= ~CMD_ACT_MAC_ALL_MULTICAST_ENABLE;
+               priv->nr_of_multicastmacaddr = mc_count;
+               for (i = 0; i < mc_count; i++) {
+                       if (!mclist)
+                               break;
+                       memcpy(&priv->multicastlist[i], mclist->da_addr,
+                                       ETH_ALEN);
+                       mclist = mclist->next;
+               }
+               lbtf_cmd_set_mac_multicast_addr(priv);
+       } else {
+               priv->mac_control &= ~(CMD_ACT_MAC_MULTICAST_ENABLE |
+                                      CMD_ACT_MAC_ALL_MULTICAST_ENABLE);
+               if (priv->nr_of_multicastmacaddr) {
+                       priv->nr_of_multicastmacaddr = 0;
+                       lbtf_cmd_set_mac_multicast_addr(priv);
+               }
+       }
+
+
+       if (priv->mac_control != old_mac_control)
+               lbtf_set_mac_control(priv);
+}
+
+static void lbtf_op_bss_info_changed(struct ieee80211_hw *hw,
+                       struct ieee80211_vif *vif,
+                       struct ieee80211_bss_conf *bss_conf,
+                       u32 changes)
+{
+       struct lbtf_private *priv = hw->priv;
+
+       if (changes & BSS_CHANGED_ERP_PREAMBLE) {
+               if (bss_conf->use_short_preamble)
+                       priv->preamble = CMD_TYPE_SHORT_PREAMBLE;
+               else
+                       priv->preamble = CMD_TYPE_LONG_PREAMBLE;
+               lbtf_set_radio_control(priv);
+       }
+
+       return;
+}
+
+static const struct ieee80211_ops lbtf_ops = {
+       .tx                     = lbtf_op_tx,
+       .start                  = lbtf_op_start,
+       .stop                   = lbtf_op_stop,
+       .add_interface          = lbtf_op_add_interface,
+       .remove_interface       = lbtf_op_remove_interface,
+       .config                 = lbtf_op_config,
+       .config_interface       = lbtf_op_config_interface,
+       .configure_filter       = lbtf_op_configure_filter,
+       .bss_info_changed       = lbtf_op_bss_info_changed,
+};
+
+int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb)
+{
+       struct ieee80211_rx_status stats;
+       struct rxpd *prxpd;
+       bool is_qos, is_4addr, is_amsdu, need_padding;
+       unsigned int flags;
+       u16 fc, fc_le;
+
+       prxpd = (struct rxpd *) skb->data;
+
+       stats.flag = 0;
+       if (!(prxpd->status & cpu_to_le16(MRVDRV_RXPD_STATUS_OK)))
+               stats.flag |= RX_FLAG_FAILED_FCS_CRC;
+       stats.freq = priv->cur_freq;
+       stats.band = IEEE80211_BAND_2GHZ;
+       stats.signal = prxpd->snr;
+       stats.noise = prxpd->nf;
+       stats.qual = prxpd->snr - prxpd->nf;
+       /* Marvell rate index has a hole at value 4 */
+       if (prxpd->rx_rate > 4)
+               --prxpd->rx_rate;
+       stats.rate_idx = prxpd->rx_rate;
+       skb_pull(skb, sizeof(struct rxpd));
+
+       fc_le = *((__le16 *) skb->data);
+       fc = le16_to_cpu(fc_le);
+       flags = le32_to_cpu(*(__le32 *)(skb->data + 4));
+
+       is_qos = ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) &&
+                (fc & IEEE80211_STYPE_QOS_DATA);
+       is_4addr = (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
+                  (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS);
+       is_amsdu =  ((fc & 0x8C) == 0x88) &&
+                   (*(skb->data + ieee80211_hdrlen(fc_le) - QOS_CONTROL_LEN)
+                    & IEEE80211_QOS_CONTROL_A_MSDU_PRESENT);
+
+       need_padding = is_qos ^ is_4addr ^ is_amsdu;
+       if (need_padding) {
+               memmove(skb->data + 2, skb->data, skb->len);
+               skb_reserve(skb, 2);
+       }
+
+       ieee80211_rx_irqsafe(priv->hw, skb, &stats);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(lbtf_rx);
+
+/**
+ * lbtf_add_card: Add and initialize the card, no fw upload yet.
+ *
+ *  @card    A pointer to card
+ *
+ *  Returns: pointer to struct lbtf_priv.
+ */
+struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev)
+{
+       struct ieee80211_hw *hw;
+       struct lbtf_private *priv = NULL;
+
+       hw = ieee80211_alloc_hw(sizeof(struct lbtf_private), &lbtf_ops);
+       if (!hw)
+               goto done;
+
+       priv = hw->priv;
+       if (lbtf_init_adapter(priv))
+               goto err_init_adapter;
+
+       priv->hw = hw;
+       priv->card = card;
+       priv->tx_skb = NULL;
+
+       hw->queues = 1;
+       hw->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING;
+       hw->extra_tx_headroom = sizeof(struct txpd);
+       memcpy(priv->channels, lbtf_channels, sizeof(lbtf_channels));
+       memcpy(priv->rates, lbtf_rates, sizeof(lbtf_rates));
+       priv->band.n_bitrates = ARRAY_SIZE(lbtf_rates);
+       priv->band.bitrates = priv->rates;
+       priv->band.n_channels = ARRAY_SIZE(lbtf_channels);
+       priv->band.channels = priv->channels;
+       hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &priv->band;
+       skb_queue_head_init(&priv->bc_ps_buf);
+
+       SET_IEEE80211_DEV(hw, dmdev);
+
+       INIT_WORK(&priv->cmd_work, lbtf_cmd_work);
+       INIT_WORK(&priv->tx_work, lbtf_tx_work);
+       if (ieee80211_register_hw(hw))
+               goto err_init_adapter;
+
+       goto done;
+
+err_init_adapter:
+       lbtf_free_adapter(priv);
+       ieee80211_free_hw(hw);
+       priv = NULL;
+
+done:
+       return priv;
+}
+EXPORT_SYMBOL_GPL(lbtf_add_card);
+
+
+int lbtf_remove_card(struct lbtf_private *priv)
+{
+       struct ieee80211_hw *hw = priv->hw;
+
+       priv->surpriseremoved = 1;
+       del_timer(&priv->command_timer);
+       lbtf_free_adapter(priv);
+       priv->hw = NULL;
+       ieee80211_unregister_hw(hw);
+       ieee80211_free_hw(hw);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(lbtf_remove_card);
+
+void lbtf_send_tx_feedback(struct lbtf_private *priv, u8 retrycnt, u8 fail)
+{
+       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(priv->tx_skb);
+       memset(&info->status, 0, sizeof(info->status));
+       /*
+        * Commented out, otherwise we never go beyond 1Mbit/s using mac80211
+        * default pid rc algorithm.
+        *
+        * info->status.retry_count = MRVL_DEFAULT_RETRIES - retrycnt;
+        */
+       info->status.excessive_retries = fail ? 1 : 0;
+       if (!(info->flags & IEEE80211_TX_CTL_NO_ACK) && !fail)
+               info->flags |= IEEE80211_TX_STAT_ACK;
+       skb_pull(priv->tx_skb, sizeof(struct txpd));
+       ieee80211_tx_status_irqsafe(priv->hw, priv->tx_skb);
+       priv->tx_skb = NULL;
+       if (!priv->skb_to_tx && skb_queue_empty(&priv->bc_ps_buf))
+               ieee80211_wake_queues(priv->hw);
+       else
+               queue_work(lbtf_wq, &priv->tx_work);
+}
+EXPORT_SYMBOL_GPL(lbtf_send_tx_feedback);
+
+void lbtf_bcn_sent(struct lbtf_private *priv)
+{
+       struct sk_buff *skb = NULL;
+
+       if (priv->vif->type != IEEE80211_IF_TYPE_AP)
+               return;
+
+       if (skb_queue_empty(&priv->bc_ps_buf)) {
+               bool tx_buff_bc = 0;
+
+               while ((skb = ieee80211_get_buffered_bc(priv->hw, priv->vif))) {
+                       skb_queue_tail(&priv->bc_ps_buf, skb);
+                       tx_buff_bc = 1;
+               }
+               if (tx_buff_bc) {
+                       ieee80211_stop_queues(priv->hw);
+                       queue_work(lbtf_wq, &priv->tx_work);
+               }
+       }
+
+       skb = ieee80211_beacon_get(priv->hw, priv->vif);
+
+       if (skb) {
+               lbtf_beacon_set(priv, skb);
+               kfree_skb(skb);
+       }
+}
+EXPORT_SYMBOL_GPL(lbtf_bcn_sent);
+
+static int __init lbtf_init_module(void)
+{
+       lbtf_wq = create_workqueue("libertastf");
+       if (lbtf_wq == NULL) {
+               printk(KERN_ERR "libertastf: couldn't create workqueue\n");
+               return -ENOMEM;
+       }
+       return 0;
+}
+
+static void __exit lbtf_exit_module(void)
+{
+       destroy_workqueue(lbtf_wq);
+}
+
+module_init(lbtf_init_module);
+module_exit(lbtf_exit_module);
+
+MODULE_DESCRIPTION("Libertas WLAN Thinfirm Driver Library");
+MODULE_AUTHOR("Cozybit Inc.");
+MODULE_LICENSE("GPL");
index 1ebcafe7ca5fd7aa90421385ee864c0459a8d17f..6a196c31de433aa05dc37df4754f43ff06c96f7d 100644 (file)
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/delay.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/ethtool.h>
+#include <linux/firmware.h>
 #include <linux/if_arp.h>
 #include <linux/wireless.h>
 #include <net/iw_handler.h>
 #include <net/ieee80211.h>
 
+#include <linux/scatterlist.h>
+#include <linux/crypto.h>
+
 #include "hermes_rid.h"
+#include "hermes_dld.h"
 #include "orinoco.h"
 
 /********************************************************************/
@@ -240,6 +246,74 @@ struct hermes_rx_descriptor {
 static int __orinoco_program_rids(struct net_device *dev);
 static void __orinoco_set_multicast_list(struct net_device *dev);
 
+/********************************************************************/
+/* Michael MIC crypto setup                                         */
+/********************************************************************/
+#define MICHAEL_MIC_LEN 8
+static int orinoco_mic_init(struct orinoco_private *priv)
+{
+       priv->tx_tfm_mic = crypto_alloc_hash("michael_mic", 0, 0);
+       if (IS_ERR(priv->tx_tfm_mic)) {
+               printk(KERN_DEBUG "orinoco_mic_init: could not allocate "
+                      "crypto API michael_mic\n");
+               priv->tx_tfm_mic = NULL;
+               return -ENOMEM;
+       }
+
+       priv->rx_tfm_mic = crypto_alloc_hash("michael_mic", 0, 0);
+       if (IS_ERR(priv->rx_tfm_mic)) {
+               printk(KERN_DEBUG "orinoco_mic_init: could not allocate "
+                      "crypto API michael_mic\n");
+               priv->rx_tfm_mic = NULL;
+               return -ENOMEM;
+       }
+
+       return 0;
+}
+
+static void orinoco_mic_free(struct orinoco_private *priv)
+{
+       if (priv->tx_tfm_mic)
+               crypto_free_hash(priv->tx_tfm_mic);
+       if (priv->rx_tfm_mic)
+               crypto_free_hash(priv->rx_tfm_mic);
+}
+
+static int michael_mic(struct crypto_hash *tfm_michael, u8 *key,
+                      u8 *da, u8 *sa, u8 priority,
+                      u8 *data, size_t data_len, u8 *mic)
+{
+       struct hash_desc desc;
+       struct scatterlist sg[2];
+       u8 hdr[ETH_HLEN + 2]; /* size of header + padding */
+
+       if (tfm_michael == NULL) {
+               printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n");
+               return -1;
+       }
+
+       /* Copy header into buffer. We need the padding on the end zeroed */
+       memcpy(&hdr[0], da, ETH_ALEN);
+       memcpy(&hdr[ETH_ALEN], sa, ETH_ALEN);
+       hdr[ETH_ALEN*2] = priority;
+       hdr[ETH_ALEN*2+1] = 0;
+       hdr[ETH_ALEN*2+2] = 0;
+       hdr[ETH_ALEN*2+3] = 0;
+
+       /* Use scatter gather to MIC header and data in one go */
+       sg_init_table(sg, 2);
+       sg_set_buf(&sg[0], hdr, sizeof(hdr));
+       sg_set_buf(&sg[1], data, data_len);
+
+       if (crypto_hash_setkey(tfm_michael, key, MIC_KEYLEN))
+               return -1;
+
+       desc.tfm = tfm_michael;
+       desc.flags = 0;
+       return crypto_hash_digest(&desc, sg, data_len + sizeof(hdr),
+                                 mic);
+}
+
 /********************************************************************/
 /* Internal helper functions                                        */
 /********************************************************************/
@@ -273,12 +347,19 @@ static inline void set_port_type(struct orinoco_private *priv)
 #define ORINOCO_MAX_BSS_COUNT  64
 static int orinoco_bss_data_allocate(struct orinoco_private *priv)
 {
-       if (priv->bss_data)
+       if (priv->bss_xbss_data)
                return 0;
 
-       priv->bss_data =
-           kzalloc(ORINOCO_MAX_BSS_COUNT * sizeof(bss_element), GFP_KERNEL);
-       if (!priv->bss_data) {
+       if (priv->has_ext_scan)
+               priv->bss_xbss_data = kzalloc(ORINOCO_MAX_BSS_COUNT *
+                                             sizeof(struct xbss_element),
+                                             GFP_KERNEL);
+       else
+               priv->bss_xbss_data = kzalloc(ORINOCO_MAX_BSS_COUNT *
+                                             sizeof(struct bss_element),
+                                             GFP_KERNEL);
+
+       if (!priv->bss_xbss_data) {
                printk(KERN_WARNING "Out of memory allocating beacons");
                return -ENOMEM;
        }
@@ -287,18 +368,319 @@ static int orinoco_bss_data_allocate(struct orinoco_private *priv)
 
 static void orinoco_bss_data_free(struct orinoco_private *priv)
 {
-       kfree(priv->bss_data);
-       priv->bss_data = NULL;
+       kfree(priv->bss_xbss_data);
+       priv->bss_xbss_data = NULL;
 }
 
+#define PRIV_BSS       ((struct bss_element *)priv->bss_xbss_data)
+#define PRIV_XBSS      ((struct xbss_element *)priv->bss_xbss_data)
 static void orinoco_bss_data_init(struct orinoco_private *priv)
 {
        int i;
 
        INIT_LIST_HEAD(&priv->bss_free_list);
        INIT_LIST_HEAD(&priv->bss_list);
-       for (i = 0; i < ORINOCO_MAX_BSS_COUNT; i++)
-               list_add_tail(&priv->bss_data[i].list, &priv->bss_free_list);
+       if (priv->has_ext_scan)
+               for (i = 0; i < ORINOCO_MAX_BSS_COUNT; i++)
+                       list_add_tail(&(PRIV_XBSS[i].list),
+                                     &priv->bss_free_list);
+       else
+               for (i = 0; i < ORINOCO_MAX_BSS_COUNT; i++)
+                       list_add_tail(&(PRIV_BSS[i].list),
+                                     &priv->bss_free_list);
+
+}
+
+static inline u8 *orinoco_get_ie(u8 *data, size_t len,
+                                enum ieee80211_mfie eid)
+{
+       u8 *p = data;
+       while ((p + 2) < (data + len)) {
+               if (p[0] == eid)
+                       return p;
+               p += p[1] + 2;
+       }
+       return NULL;
+}
+
+#define WPA_OUI_TYPE   "\x00\x50\xF2\x01"
+#define WPA_SELECTOR_LEN 4
+static inline u8 *orinoco_get_wpa_ie(u8 *data, size_t len)
+{
+       u8 *p = data;
+       while ((p + 2 + WPA_SELECTOR_LEN) < (data + len)) {
+               if ((p[0] == MFIE_TYPE_GENERIC) &&
+                   (memcmp(&p[2], WPA_OUI_TYPE, WPA_SELECTOR_LEN) == 0))
+                       return p;
+               p += p[1] + 2;
+       }
+       return NULL;
+}
+
+
+/********************************************************************/
+/* Download functionality                                           */
+/********************************************************************/
+
+struct fw_info {
+       char *pri_fw;
+       char *sta_fw;
+       char *ap_fw;
+       u32 pda_addr;
+       u16 pda_size;
+};
+
+const static struct fw_info orinoco_fw[] = {
+       { "", "agere_sta_fw.bin", "agere_ap_fw.bin", 0x00390000, 1000 },
+       { "", "prism_sta_fw.bin", "prism_ap_fw.bin", 0, 1024 },
+       { "symbol_sp24t_prim_fw", "symbol_sp24t_sec_fw", "", 0x00003100, 0x100 }
+};
+
+/* Structure used to access fields in FW
+ * Make sure LE decoding macros are used
+ */
+struct orinoco_fw_header {
+       char hdr_vers[6];       /* ASCII string for header version */
+       __le16 headersize;      /* Total length of header */
+       __le32 entry_point;     /* NIC entry point */
+       __le32 blocks;          /* Number of blocks to program */
+       __le32 block_offset;    /* Offset of block data from eof header */
+       __le32 pdr_offset;      /* Offset to PDR data from eof header */
+       __le32 pri_offset;      /* Offset to primary plug data */
+       __le32 compat_offset;   /* Offset to compatibility data*/
+       char signature[0];      /* FW signature length headersize-20 */
+} __attribute__ ((packed));
+
+/* Download either STA or AP firmware into the card. */
+static int
+orinoco_dl_firmware(struct orinoco_private *priv,
+                   const struct fw_info *fw,
+                   int ap)
+{
+       /* Plug Data Area (PDA) */
+       __le16 pda[512] = { 0 };
+
+       hermes_t *hw = &priv->hw;
+       const struct firmware *fw_entry;
+       const struct orinoco_fw_header *hdr;
+       const unsigned char *first_block;
+       const unsigned char *end;
+       const char *firmware;
+       struct net_device *dev = priv->ndev;
+       int err;
+
+       if (ap)
+               firmware = fw->ap_fw;
+       else
+               firmware = fw->sta_fw;
+
+       printk(KERN_DEBUG "%s: Attempting to download firmware %s\n",
+              dev->name, firmware);
+
+       /* Read current plug data */
+       err = hermes_read_pda(hw, pda, fw->pda_addr,
+                             min_t(u16, fw->pda_size, sizeof(pda)), 0);
+       printk(KERN_DEBUG "%s: Read PDA returned %d\n", dev->name, err);
+       if (err)
+               return err;
+
+       err = request_firmware(&fw_entry, firmware, priv->dev);
+       if (err) {
+               printk(KERN_ERR "%s: Cannot find firmware %s\n",
+                      dev->name, firmware);
+               return -ENOENT;
+       }
+
+       hdr = (const struct orinoco_fw_header *) fw_entry->data;
+
+       /* Enable aux port to allow programming */
+       err = hermesi_program_init(hw, le32_to_cpu(hdr->entry_point));
+       printk(KERN_DEBUG "%s: Program init returned %d\n", dev->name, err);
+       if (err != 0)
+               goto abort;
+
+       /* Program data */
+       first_block = (fw_entry->data +
+                      le16_to_cpu(hdr->headersize) +
+                      le32_to_cpu(hdr->block_offset));
+       end = fw_entry->data + fw_entry->size;
+
+       err = hermes_program(hw, first_block, end);
+       printk(KERN_DEBUG "%s: Program returned %d\n", dev->name, err);
+       if (err != 0)
+               goto abort;
+
+       /* Update production data */
+       first_block = (fw_entry->data +
+                      le16_to_cpu(hdr->headersize) +
+                      le32_to_cpu(hdr->pdr_offset));
+
+       err = hermes_apply_pda_with_defaults(hw, first_block, pda);
+       printk(KERN_DEBUG "%s: Apply PDA returned %d\n", dev->name, err);
+       if (err)
+               goto abort;
+
+       /* Tell card we've finished */
+       err = hermesi_program_end(hw);
+       printk(KERN_DEBUG "%s: Program end returned %d\n", dev->name, err);
+       if (err != 0)
+               goto abort;
+
+       /* Check if we're running */
+       printk(KERN_DEBUG "%s: hermes_present returned %d\n",
+              dev->name, hermes_present(hw));
+
+abort:
+       release_firmware(fw_entry);
+       return err;
+}
+
+/* End markers */
+#define TEXT_END       0x1A            /* End of text header */
+
+/*
+ * Process a firmware image - stop the card, load the firmware, reset
+ * the card and make sure it responds.  For the secondary firmware take
+ * care of the PDA - read it and then write it on top of the firmware.
+ */
+static int
+symbol_dl_image(struct orinoco_private *priv, const struct fw_info *fw,
+               const unsigned char *image, const unsigned char *end,
+               int secondary)
+{
+       hermes_t *hw = &priv->hw;
+       int ret;
+       const unsigned char *ptr;
+       const unsigned char *first_block;
+
+       /* Plug Data Area (PDA) */
+       __le16 pda[256];
+
+       /* Binary block begins after the 0x1A marker */
+       ptr = image;
+       while (*ptr++ != TEXT_END);
+       first_block = ptr;
+
+       /* Read the PDA from EEPROM */
+       if (secondary) {
+               ret = hermes_read_pda(hw, pda, fw->pda_addr, sizeof(pda), 1);
+               if (ret)
+                       return ret;
+       }
+
+       /* Stop the firmware, so that it can be safely rewritten */
+       if (priv->stop_fw) {
+               ret = priv->stop_fw(priv, 1);
+               if (ret)
+                       return ret;
+       }
+
+       /* Program the adapter with new firmware */
+       ret = hermes_program(hw, first_block, end);
+       if (ret)
+               return ret;
+
+       /* Write the PDA to the adapter */
+       if (secondary) {
+               size_t len = hermes_blocks_length(first_block);
+               ptr = first_block + len;
+               ret = hermes_apply_pda(hw, ptr, pda);
+               if (ret)
+                       return ret;
+       }
+
+       /* Run the firmware */
+       if (priv->stop_fw) {
+               ret = priv->stop_fw(priv, 0);
+               if (ret)
+                       return ret;
+       }
+
+       /* Reset hermes chip and make sure it responds */
+       ret = hermes_init(hw);
+
+       /* hermes_reset() should return 0 with the secondary firmware */
+       if (secondary && ret != 0)
+               return -ENODEV;
+
+       /* And this should work with any firmware */
+       if (!hermes_present(hw))
+               return -ENODEV;
+
+       return 0;
+}
+
+
+/*
+ * Download the firmware into the card, this also does a PCMCIA soft
+ * reset on the card, to make sure it's in a sane state.
+ */
+static int
+symbol_dl_firmware(struct orinoco_private *priv,
+                  const struct fw_info *fw)
+{
+       struct net_device *dev = priv->ndev;
+       int ret;
+       const struct firmware *fw_entry;
+
+       if (request_firmware(&fw_entry, fw->pri_fw,
+                            priv->dev) != 0) {
+               printk(KERN_ERR "%s: Cannot find firmware: %s\n",
+                      dev->name, fw->pri_fw);
+               return -ENOENT;
+       }
+
+       /* Load primary firmware */
+       ret = symbol_dl_image(priv, fw, fw_entry->data,
+                             fw_entry->data + fw_entry->size, 0);
+       release_firmware(fw_entry);
+       if (ret) {
+               printk(KERN_ERR "%s: Primary firmware download failed\n",
+                      dev->name);
+               return ret;
+       }
+
+       if (request_firmware(&fw_entry, fw->sta_fw,
+                            priv->dev) != 0) {
+               printk(KERN_ERR "%s: Cannot find firmware: %s\n",
+                      dev->name, fw->sta_fw);
+               return -ENOENT;
+       }
+
+       /* Load secondary firmware */
+       ret = symbol_dl_image(priv, fw, fw_entry->data,
+                             fw_entry->data + fw_entry->size, 1);
+       release_firmware(fw_entry);
+       if (ret) {
+               printk(KERN_ERR "%s: Secondary firmware download failed\n",
+                      dev->name);
+       }
+
+       return ret;
+}
+
+static int orinoco_download(struct orinoco_private *priv)
+{
+       int err = 0;
+       /* Reload firmware */
+       switch (priv->firmware_type) {
+       case FIRMWARE_TYPE_AGERE:
+               /* case FIRMWARE_TYPE_INTERSIL: */
+               err = orinoco_dl_firmware(priv,
+                                         &orinoco_fw[priv->firmware_type], 0);
+               break;
+
+       case FIRMWARE_TYPE_SYMBOL:
+               err = symbol_dl_firmware(priv,
+                                        &orinoco_fw[priv->firmware_type]);
+               break;
+       case FIRMWARE_TYPE_INTERSIL:
+               break;
+       }
+       /* TODO: if we fail we probably need to reinitialise
+        * the driver */
+
+       return err;
 }
 
 /********************************************************************/
@@ -453,8 +835,7 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev)
        int err = 0;
        u16 txfid = priv->txfid;
        struct ethhdr *eh;
-       int data_off;
-       struct hermes_tx_descriptor desc;
+       int tx_control;
        unsigned long flags;
 
        if (! netif_running(dev)) {
@@ -486,23 +867,54 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev)
        if (skb->len < ETH_HLEN)
                goto drop;
 
-       eh = (struct ethhdr *)skb->data;
+       tx_control = HERMES_TXCTRL_TX_OK | HERMES_TXCTRL_TX_EX;
 
-       memset(&desc, 0, sizeof(desc));
-       desc.tx_control = cpu_to_le16(HERMES_TXCTRL_TX_OK | HERMES_TXCTRL_TX_EX);
-       err = hermes_bap_pwrite(hw, USER_BAP, &desc, sizeof(desc), txfid, 0);
-       if (err) {
-               if (net_ratelimit())
-                       printk(KERN_ERR "%s: Error %d writing Tx descriptor "
-                              "to BAP\n", dev->name, err);
-               goto busy;
+       if (priv->encode_alg == IW_ENCODE_ALG_TKIP)
+               tx_control |= (priv->tx_key << HERMES_MIC_KEY_ID_SHIFT) |
+                       HERMES_TXCTRL_MIC;
+
+       if (priv->has_alt_txcntl) {
+               /* WPA enabled firmwares have tx_cntl at the end of
+                * the 802.11 header.  So write zeroed descriptor and
+                * 802.11 header at the same time
+                */
+               char desc[HERMES_802_3_OFFSET];
+               __le16 *txcntl = (__le16 *) &desc[HERMES_TXCNTL2_OFFSET];
+
+               memset(&desc, 0, sizeof(desc));
+
+               *txcntl = cpu_to_le16(tx_control);
+               err = hermes_bap_pwrite(hw, USER_BAP, &desc, sizeof(desc),
+                                       txfid, 0);
+               if (err) {
+                       if (net_ratelimit())
+                               printk(KERN_ERR "%s: Error %d writing Tx "
+                                      "descriptor to BAP\n", dev->name, err);
+                       goto busy;
+               }
+       } else {
+               struct hermes_tx_descriptor desc;
+
+               memset(&desc, 0, sizeof(desc));
+
+               desc.tx_control = cpu_to_le16(tx_control);
+               err = hermes_bap_pwrite(hw, USER_BAP, &desc, sizeof(desc),
+                                       txfid, 0);
+               if (err) {
+                       if (net_ratelimit())
+                               printk(KERN_ERR "%s: Error %d writing Tx "
+                                      "descriptor to BAP\n", dev->name, err);
+                       goto busy;
+               }
+
+               /* Clear the 802.11 header and data length fields - some
+                * firmwares (e.g. Lucent/Agere 8.xx) appear to get confused
+                * if this isn't done. */
+               hermes_clear_words(hw, HERMES_DATA0,
+                                  HERMES_802_3_OFFSET - HERMES_802_11_OFFSET);
        }
 
-       /* Clear the 802.11 header and data length fields - some
-        * firmwares (e.g. Lucent/Agere 8.xx) appear to get confused
-        * if this isn't done. */
-       hermes_clear_words(hw, HERMES_DATA0,
-                          HERMES_802_3_OFFSET - HERMES_802_11_OFFSET);
+       eh = (struct ethhdr *)skb->data;
 
        /* Encapsulate Ethernet-II frames */
        if (ntohs(eh->h_proto) > ETH_DATA_LEN) { /* Ethernet-II frame */
@@ -513,33 +925,65 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev)
 
                /* Strip destination and source from the data */
                skb_pull(skb, 2 * ETH_ALEN);
-               data_off = HERMES_802_2_OFFSET + sizeof(encaps_hdr);
 
                /* And move them to a separate header */
                memcpy(&hdr.eth, eh, 2 * ETH_ALEN);
                hdr.eth.h_proto = htons(sizeof(encaps_hdr) + skb->len);
                memcpy(hdr.encap, encaps_hdr, sizeof(encaps_hdr));
 
-               err = hermes_bap_pwrite(hw, USER_BAP, &hdr, sizeof(hdr),
-                                       txfid, HERMES_802_3_OFFSET);
-               if (err) {
-                       if (net_ratelimit())
-                               printk(KERN_ERR "%s: Error %d writing packet "
-                                      "header to BAP\n", dev->name, err);
-                       goto busy;
+               /* Insert the SNAP header */
+               if (skb_headroom(skb) < sizeof(hdr)) {
+                       printk(KERN_ERR
+                              "%s: Not enough headroom for 802.2 headers %d\n",
+                              dev->name, skb_headroom(skb));
+                       goto drop;
                }
-       } else { /* IEEE 802.3 frame */
-               data_off = HERMES_802_3_OFFSET;
+               eh = (struct ethhdr *) skb_push(skb, sizeof(hdr));
+               memcpy(eh, &hdr, sizeof(hdr));
        }
 
        err = hermes_bap_pwrite(hw, USER_BAP, skb->data, skb->len,
-                               txfid, data_off);
+                               txfid, HERMES_802_3_OFFSET);
        if (err) {
                printk(KERN_ERR "%s: Error %d writing packet to BAP\n",
                       dev->name, err);
                goto busy;
        }
 
+       /* Calculate Michael MIC */
+       if (priv->encode_alg == IW_ENCODE_ALG_TKIP) {
+               u8 mic_buf[MICHAEL_MIC_LEN + 1];
+               u8 *mic;
+               size_t offset;
+               size_t len;
+
+               if (skb->len % 2) {
+                       /* MIC start is on an odd boundary */
+                       mic_buf[0] = skb->data[skb->len - 1];
+                       mic = &mic_buf[1];
+                       offset = skb->len - 1;
+                       len = MICHAEL_MIC_LEN + 1;
+               } else {
+                       mic = &mic_buf[0];
+                       offset = skb->len;
+                       len = MICHAEL_MIC_LEN;
+               }
+
+               michael_mic(priv->tx_tfm_mic,
+                           priv->tkip_key[priv->tx_key].tx_mic,
+                           eh->h_dest, eh->h_source, 0 /* priority */,
+                           skb->data + ETH_HLEN, skb->len - ETH_HLEN, mic);
+
+               /* Write the MIC */
+               err = hermes_bap_pwrite(hw, USER_BAP, &mic_buf[0], len,
+                                       txfid, HERMES_802_3_OFFSET + offset);
+               if (err) {
+                       printk(KERN_ERR "%s: Error %d writing MIC to BAP\n",
+                              dev->name, err);
+                       goto busy;
+               }
+       }
+
        /* Finally, we actually initiate the send */
        netif_stop_queue(dev);
 
@@ -554,7 +998,7 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev)
        }
 
        dev->trans_start = jiffies;
-       stats->tx_bytes += data_off + skb->len;
+       stats->tx_bytes += HERMES_802_3_OFFSET + skb->len;
        goto ok;
 
  drop:
@@ -834,21 +1278,48 @@ static void orinoco_rx_monitor(struct net_device *dev, u16 rxfid,
        stats->rx_dropped++;
 }
 
+/* Get tsc from the firmware */
+static int orinoco_hw_get_tkip_iv(struct orinoco_private *priv, int key,
+                                 u8 *tsc)
+{
+       hermes_t *hw = &priv->hw;
+       int err = 0;
+       u8 tsc_arr[4][IW_ENCODE_SEQ_MAX_SIZE];
+
+       if ((key < 0) || (key > 4))
+               return -EINVAL;
+
+       err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_TKIP_IV,
+                             sizeof(tsc_arr), NULL, &tsc_arr);
+       if (!err)
+               memcpy(tsc, &tsc_arr[key][0], sizeof(tsc_arr[0]));
+
+       return err;
+}
+
 static void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw)
 {
        struct orinoco_private *priv = netdev_priv(dev);
        struct net_device_stats *stats = &priv->stats;
        struct iw_statistics *wstats = &priv->wstats;
        struct sk_buff *skb = NULL;
-       u16 rxfid, status, fc;
+       u16 rxfid, status;
        int length;
-       struct hermes_rx_descriptor desc;
-       struct ethhdr *hdr;
+       struct hermes_rx_descriptor *desc;
+       struct orinoco_rx_data *rx_data;
        int err;
 
+       desc = kmalloc(sizeof(*desc), GFP_ATOMIC);
+       if (!desc) {
+               printk(KERN_WARNING
+                      "%s: Can't allocate space for RX descriptor\n",
+                      dev->name);
+               goto update_stats;
+       }
+
        rxfid = hermes_read_regn(hw, RXFID);
 
-       err = hermes_bap_pread(hw, IRQ_BAP, &desc, sizeof(desc),
+       err = hermes_bap_pread(hw, IRQ_BAP, desc, sizeof(*desc),
                               rxfid, 0);
        if (err) {
                printk(KERN_ERR "%s: error %d reading Rx descriptor. "
@@ -856,7 +1327,7 @@ static void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw)
                goto update_stats;
        }
 
-       status = le16_to_cpu(desc.status);
+       status = le16_to_cpu(desc->status);
 
        if (status & HERMES_RXSTAT_BADCRC) {
                DEBUG(1, "%s: Bad CRC on Rx. Frame dropped.\n",
@@ -867,8 +1338,8 @@ static void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw)
 
        /* Handle frames in monitor mode */
        if (priv->iw_mode == IW_MODE_MONITOR) {
-               orinoco_rx_monitor(dev, rxfid, &desc);
-               return;
+               orinoco_rx_monitor(dev, rxfid, desc);
+               goto out;
        }
 
        if (status & HERMES_RXSTAT_UNDECRYPTABLE) {
@@ -878,15 +1349,14 @@ static void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw)
                goto update_stats;
        }
 
-       length = le16_to_cpu(desc.data_len);
-       fc = le16_to_cpu(desc.frame_ctl);
+       length = le16_to_cpu(desc->data_len);
 
        /* Sanity checks */
        if (length < 3) { /* No for even an 802.2 LLC header */
                /* At least on Symbol firmware with PCF we get quite a
                    lot of these legitimately - Poll frames with no
                    data. */
-               return;
+               goto out;
        }
        if (length > IEEE80211_DATA_LEN) {
                printk(KERN_WARNING "%s: Oversized frame received (%d bytes)\n",
@@ -895,6 +1365,11 @@ static void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw)
                goto update_stats;
        }
 
+       /* Payload size does not include Michael MIC. Increase payload
+        * size to read it together with the data. */
+       if (status & HERMES_RXSTAT_MIC)
+               length += MICHAEL_MIC_LEN;
+
        /* We need space for the packet data itself, plus an ethernet
           header, plus 2 bytes so we can align the IP header on a
           32bit boundary, plus 1 byte so we can read in odd length
@@ -921,6 +1396,100 @@ static void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw)
                goto drop;
        }
 
+       /* Add desc and skb to rx queue */
+       rx_data = kzalloc(sizeof(*rx_data), GFP_ATOMIC);
+       if (!rx_data) {
+               printk(KERN_WARNING "%s: Can't allocate RX packet\n",
+                       dev->name);
+               goto drop;
+       }
+       rx_data->desc = desc;
+       rx_data->skb = skb;
+       list_add_tail(&rx_data->list, &priv->rx_list);
+       tasklet_schedule(&priv->rx_tasklet);
+
+       return;
+
+drop:
+       dev_kfree_skb_irq(skb);
+update_stats:
+       stats->rx_errors++;
+       stats->rx_dropped++;
+out:
+       kfree(desc);
+}
+
+static void orinoco_rx(struct net_device *dev,
+                      struct hermes_rx_descriptor *desc,
+                      struct sk_buff *skb)
+{
+       struct orinoco_private *priv = netdev_priv(dev);
+       struct net_device_stats *stats = &priv->stats;
+       u16 status, fc;
+       int length;
+       struct ethhdr *hdr;
+
+       status = le16_to_cpu(desc->status);
+       length = le16_to_cpu(desc->data_len);
+       fc = le16_to_cpu(desc->frame_ctl);
+
+       /* Calculate and check MIC */
+       if (status & HERMES_RXSTAT_MIC) {
+               int key_id = ((status & HERMES_RXSTAT_MIC_KEY_ID) >>
+                             HERMES_MIC_KEY_ID_SHIFT);
+               u8 mic[MICHAEL_MIC_LEN];
+               u8 *rxmic;
+               u8 *src = (fc & IEEE80211_FCTL_FROMDS) ?
+                       desc->addr3 : desc->addr2;
+
+               /* Extract Michael MIC from payload */
+               rxmic = skb->data + skb->len - MICHAEL_MIC_LEN;
+
+               skb_trim(skb, skb->len - MICHAEL_MIC_LEN);
+               length -= MICHAEL_MIC_LEN;
+
+               michael_mic(priv->rx_tfm_mic,
+                           priv->tkip_key[key_id].rx_mic,
+                           desc->addr1,
+                           src,
+                           0, /* priority or QoS? */
+                           skb->data,
+                           skb->len,
+                           &mic[0]);
+
+               if (memcmp(mic, rxmic,
+                          MICHAEL_MIC_LEN)) {
+                       union iwreq_data wrqu;
+                       struct iw_michaelmicfailure wxmic;
+                       DECLARE_MAC_BUF(mac);
+
+                       printk(KERN_WARNING "%s: "
+                              "Invalid Michael MIC in data frame from %s, "
+                              "using key %i\n",
+                              dev->name, print_mac(mac, src), key_id);
+
+                       /* TODO: update stats */
+
+                       /* Notify userspace */
+                       memset(&wxmic, 0, sizeof(wxmic));
+                       wxmic.flags = key_id & IW_MICFAILURE_KEY_ID;
+                       wxmic.flags |= (desc->addr1[0] & 1) ?
+                               IW_MICFAILURE_GROUP : IW_MICFAILURE_PAIRWISE;
+                       wxmic.src_addr.sa_family = ARPHRD_ETHER;
+                       memcpy(wxmic.src_addr.sa_data, src, ETH_ALEN);
+
+                       (void) orinoco_hw_get_tkip_iv(priv, key_id,
+                                                     &wxmic.tsc[0]);
+
+                       memset(&wrqu, 0, sizeof(wrqu));
+                       wrqu.data.length = sizeof(wxmic);
+                       wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu,
+                                           (char *) &wxmic);
+
+                       goto drop;
+               }
+       }
+
        /* Handle decapsulation
         * In most cases, the firmware tell us about SNAP frames.
         * For some reason, the SNAP frames sent by LinkSys APs
@@ -939,11 +1508,11 @@ static void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw)
                hdr = (struct ethhdr *)skb_push(skb, ETH_HLEN);
                hdr->h_proto = htons(length);
        }
-       memcpy(hdr->h_dest, desc.addr1, ETH_ALEN);
+       memcpy(hdr->h_dest, desc->addr1, ETH_ALEN);
        if (fc & IEEE80211_FCTL_FROMDS)
-               memcpy(hdr->h_source, desc.addr3, ETH_ALEN);
+               memcpy(hdr->h_source, desc->addr3, ETH_ALEN);
        else
-               memcpy(hdr->h_source, desc.addr2, ETH_ALEN);
+               memcpy(hdr->h_source, desc->addr2, ETH_ALEN);
 
        dev->last_rx = jiffies;
        skb->protocol = eth_type_trans(skb, dev);
@@ -952,7 +1521,7 @@ static void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw)
                skb->pkt_type = PACKET_OTHERHOST;
        
        /* Process the wireless stats if needed */
-       orinoco_stat_gather(dev, skb, &desc);
+       orinoco_stat_gather(dev, skb, desc);
 
        /* Pass the packet to the networking stack */
        netif_rx(skb);
@@ -961,13 +1530,33 @@ static void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw)
 
        return;
 
- drop: 
-       dev_kfree_skb_irq(skb);
- update_stats:
+ drop:
+       dev_kfree_skb(skb);
        stats->rx_errors++;
        stats->rx_dropped++;
 }
 
+static void orinoco_rx_isr_tasklet(unsigned long data)
+{
+       struct net_device *dev = (struct net_device *) data;
+       struct orinoco_private *priv = netdev_priv(dev);
+       struct orinoco_rx_data *rx_data, *temp;
+       struct hermes_rx_descriptor *desc;
+       struct sk_buff *skb;
+
+       /* extract desc and skb from queue */
+       list_for_each_entry_safe(rx_data, temp, &priv->rx_list, list) {
+               desc = rx_data->desc;
+               skb = rx_data->skb;
+               list_del(&rx_data->list);
+               kfree(rx_data);
+
+               orinoco_rx(dev, desc, skb);
+
+               kfree(desc);
+       }
+}
+
 /********************************************************************/
 /* Rx path (info frames)                                            */
 /********************************************************************/
@@ -1087,59 +1676,179 @@ static void orinoco_join_ap(struct work_struct *work)
 }
 
 /* Send new BSSID to userspace */
-static void orinoco_send_wevents(struct work_struct *work)
+static void orinoco_send_bssid_wevent(struct orinoco_private *priv)
 {
-       struct orinoco_private *priv =
-               container_of(work, struct orinoco_private, wevent_work);
        struct net_device *dev = priv->ndev;
        struct hermes *hw = &priv->hw;
        union iwreq_data wrqu;
        int err;
-       unsigned long flags;
-
-       if (orinoco_lock(priv, &flags) != 0)
-               return;
 
        err = hermes_read_ltv(hw, IRQ_BAP, HERMES_RID_CURRENTBSSID,
                              ETH_ALEN, NULL, wrqu.ap_addr.sa_data);
        if (err != 0)
-               goto out;
+               return;
 
        wrqu.ap_addr.sa_family = ARPHRD_ETHER;
 
        /* Send event to user space */
        wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
-
- out:
-       orinoco_unlock(priv, &flags);
 }
 
-
-static inline void orinoco_clear_scan_results(struct orinoco_private *priv,
-                                             unsigned long scan_age)
+static void orinoco_send_assocreqie_wevent(struct orinoco_private *priv)
 {
-       bss_element *bss;
-       bss_element *tmp_bss;
-
-       /* Blow away current list of scan results */
-       list_for_each_entry_safe(bss, tmp_bss, &priv->bss_list, list) {
-               if (!scan_age ||
-                   time_after(jiffies, bss->last_scanned + scan_age)) {
-                       list_move_tail(&bss->list, &priv->bss_free_list);
-                       /* Don't blow away ->list, just BSS data */
-                       memset(bss, 0, sizeof(bss->bss));
-                       bss->last_scanned = 0;
-               }
+       struct net_device *dev = priv->ndev;
+       struct hermes *hw = &priv->hw;
+       union iwreq_data wrqu;
+       int err;
+       u8 buf[88];
+       u8 *ie;
+
+       if (!priv->has_wpa)
+               return;
+
+       err = hermes_read_ltv(hw, IRQ_BAP, HERMES_RID_CURRENT_ASSOC_REQ_INFO,
+                             sizeof(buf), NULL, &buf);
+       if (err != 0)
+               return;
+
+       ie = orinoco_get_wpa_ie(buf, sizeof(buf));
+       if (ie) {
+               int rem = sizeof(buf) - (ie - &buf[0]);
+               wrqu.data.length = ie[1] + 2;
+               if (wrqu.data.length > rem)
+                       wrqu.data.length = rem;
+
+               if (wrqu.data.length)
+                       /* Send event to user space */
+                       wireless_send_event(dev, IWEVASSOCREQIE, &wrqu, ie);
        }
 }
 
-static int orinoco_process_scan_results(struct net_device *dev,
-                                       unsigned char *buf,
-                                       int len)
+static void orinoco_send_assocrespie_wevent(struct orinoco_private *priv)
 {
-       struct orinoco_private *priv = netdev_priv(dev);
-       int                     offset;         /* In the scan data */
-       union hermes_scan_info *atom;
+       struct net_device *dev = priv->ndev;
+       struct hermes *hw = &priv->hw;
+       union iwreq_data wrqu;
+       int err;
+       u8 buf[88]; /* TODO: verify max size or IW_GENERIC_IE_MAX */
+       u8 *ie;
+
+       if (!priv->has_wpa)
+               return;
+
+       err = hermes_read_ltv(hw, IRQ_BAP, HERMES_RID_CURRENT_ASSOC_RESP_INFO,
+                             sizeof(buf), NULL, &buf);
+       if (err != 0)
+               return;
+
+       ie = orinoco_get_wpa_ie(buf, sizeof(buf));
+       if (ie) {
+               int rem = sizeof(buf) - (ie - &buf[0]);
+               wrqu.data.length = ie[1] + 2;
+               if (wrqu.data.length > rem)
+                       wrqu.data.length = rem;
+
+               if (wrqu.data.length)
+                       /* Send event to user space */
+                       wireless_send_event(dev, IWEVASSOCRESPIE, &wrqu, ie);
+       }
+}
+
+static void orinoco_send_wevents(struct work_struct *work)
+{
+       struct orinoco_private *priv =
+               container_of(work, struct orinoco_private, wevent_work);
+       unsigned long flags;
+
+       if (orinoco_lock(priv, &flags) != 0)
+               return;
+
+       orinoco_send_assocreqie_wevent(priv);
+       orinoco_send_assocrespie_wevent(priv);
+       orinoco_send_bssid_wevent(priv);
+
+       orinoco_unlock(priv, &flags);
+}
+
+static inline void orinoco_clear_scan_results(struct orinoco_private *priv,
+                                             unsigned long scan_age)
+{
+       if (priv->has_ext_scan) {
+               struct xbss_element *bss;
+               struct xbss_element *tmp_bss;
+
+               /* Blow away current list of scan results */
+               list_for_each_entry_safe(bss, tmp_bss, &priv->bss_list, list) {
+                       if (!scan_age ||
+                           time_after(jiffies, bss->last_scanned + scan_age)) {
+                               list_move_tail(&bss->list,
+                                              &priv->bss_free_list);
+                               /* Don't blow away ->list, just BSS data */
+                               memset(&bss->bss, 0, sizeof(bss->bss));
+                               bss->last_scanned = 0;
+                       }
+               }
+       } else {
+               struct bss_element *bss;
+               struct bss_element *tmp_bss;
+
+               /* Blow away current list of scan results */
+               list_for_each_entry_safe(bss, tmp_bss, &priv->bss_list, list) {
+                       if (!scan_age ||
+                           time_after(jiffies, bss->last_scanned + scan_age)) {
+                               list_move_tail(&bss->list,
+                                              &priv->bss_free_list);
+                               /* Don't blow away ->list, just BSS data */
+                               memset(&bss->bss, 0, sizeof(bss->bss));
+                               bss->last_scanned = 0;
+                       }
+               }
+       }
+}
+
+static void orinoco_add_ext_scan_result(struct orinoco_private *priv,
+                                       struct agere_ext_scan_info *atom)
+{
+       struct xbss_element *bss = NULL;
+       int found = 0;
+
+       /* Try to update an existing bss first */
+       list_for_each_entry(bss, &priv->bss_list, list) {
+               if (compare_ether_addr(bss->bss.bssid, atom->bssid))
+                       continue;
+               /* ESSID lengths */
+               if (bss->bss.data[1] != atom->data[1])
+                       continue;
+               if (memcmp(&bss->bss.data[2], &atom->data[2],
+                          atom->data[1]))
+                       continue;
+               found = 1;
+               break;
+       }
+
+       /* Grab a bss off the free list */
+       if (!found && !list_empty(&priv->bss_free_list)) {
+               bss = list_entry(priv->bss_free_list.next,
+                                struct xbss_element, list);
+               list_del(priv->bss_free_list.next);
+
+               list_add_tail(&bss->list, &priv->bss_list);
+       }
+
+       if (bss) {
+               /* Always update the BSS to get latest beacon info */
+               memcpy(&bss->bss, atom, sizeof(bss->bss));
+               bss->last_scanned = jiffies;
+       }
+}
+
+static int orinoco_process_scan_results(struct net_device *dev,
+                                       unsigned char *buf,
+                                       int len)
+{
+       struct orinoco_private *priv = netdev_priv(dev);
+       int                     offset;         /* In the scan data */
+       union hermes_scan_info *atom;
        int                     atom_len;
 
        switch (priv->firmware_type) {
@@ -1194,7 +1903,7 @@ static int orinoco_process_scan_results(struct net_device *dev,
        /* Read the entries one by one */
        for (; offset + atom_len <= len; offset += atom_len) {
                int found = 0;
-               bss_element *bss = NULL;
+               struct bss_element *bss = NULL;
 
                /* Get next atom */
                atom = (union hermes_scan_info *) (buf + offset);
@@ -1216,7 +1925,7 @@ static int orinoco_process_scan_results(struct net_device *dev,
                /* Grab a bss off the free list */
                if (!found && !list_empty(&priv->bss_free_list)) {
                        bss = list_entry(priv->bss_free_list.next,
-                                        bss_element, list);
+                                        struct bss_element, list);
                        list_del(priv->bss_free_list.next);
 
                        list_add_tail(&bss->list, &priv->bss_list);
@@ -1404,6 +2113,63 @@ static void __orinoco_ev_info(struct net_device *dev, hermes_t *hw)
                kfree(buf);
        }
        break;
+       case HERMES_INQ_CHANNELINFO:
+       {
+               struct agere_ext_scan_info *bss;
+
+               if (!priv->scan_inprogress) {
+                       printk(KERN_DEBUG "%s: Got chaninfo without scan, "
+                              "len=%d\n", dev->name, len);
+                       break;
+               }
+
+               /* An empty result indicates that the scan is complete */
+               if (len == 0) {
+                       union iwreq_data        wrqu;
+
+                       /* Scan is no longer in progress */
+                       priv->scan_inprogress = 0;
+
+                       wrqu.data.length = 0;
+                       wrqu.data.flags = 0;
+                       wireless_send_event(dev, SIOCGIWSCAN, &wrqu, NULL);
+                       break;
+               }
+
+               /* Sanity check */
+               else if (len > sizeof(*bss)) {
+                       printk(KERN_WARNING
+                              "%s: Ext scan results too large (%d bytes). "
+                              "Truncating results to %zd bytes.\n",
+                              dev->name, len, sizeof(*bss));
+                       len = sizeof(*bss);
+               } else if (len < (offsetof(struct agere_ext_scan_info,
+                                          data) + 2)) {
+                       /* Drop this result now so we don't have to
+                        * keep checking later */
+                       printk(KERN_WARNING
+                              "%s: Ext scan results too short (%d bytes)\n",
+                              dev->name, len);
+                       break;
+               }
+
+               bss = kmalloc(sizeof(*bss), GFP_ATOMIC);
+               if (bss == NULL)
+                       break;
+
+               /* Read scan data */
+               err = hermes_bap_pread(hw, IRQ_BAP, (void *) bss, len,
+                                      infofid, sizeof(info));
+               if (err) {
+                       kfree(bss);
+                       break;
+               }
+
+               orinoco_add_ext_scan_result(priv, bss);
+
+               kfree(bss);
+               break;
+       }
        case HERMES_INQ_SEC_STAT_AGERE:
                /* Security status (Agere specific) */
                /* Ignore this frame for now */
@@ -1586,7 +2352,7 @@ static int __orinoco_hw_set_wap(struct orinoco_private *priv)
 }
 
 /* Change the WEP keys and/or the current keys.  Can be called
- * either from __orinoco_hw_setup_wep() or directly from
+ * either from __orinoco_hw_setup_enc() or directly from
  * orinoco_ioctl_setiwencode().  In the later case the association
  * with the AP is not broken (if the firmware can handle it),
  * which is needed for 802.1x implementations. */
@@ -1646,14 +2412,16 @@ static int __orinoco_hw_setup_wepkeys(struct orinoco_private *priv)
        return 0;
 }
 
-static int __orinoco_hw_setup_wep(struct orinoco_private *priv)
+static int __orinoco_hw_setup_enc(struct orinoco_private *priv)
 {
        hermes_t *hw = &priv->hw;
        int err = 0;
        int master_wep_flag;
        int auth_flag;
+       int enc_flag;
 
-       if (priv->wep_on)
+       /* Setup WEP keys for WEP and WPA */
+       if (priv->encode_alg)
                __orinoco_hw_setup_wepkeys(priv);
 
        if (priv->wep_restrict)
@@ -1661,9 +2429,16 @@ static int __orinoco_hw_setup_wep(struct orinoco_private *priv)
        else
                auth_flag = HERMES_AUTH_OPEN;
 
+       if (priv->wpa_enabled)
+               enc_flag = 2;
+       else if (priv->encode_alg == IW_ENCODE_ALG_WEP)
+               enc_flag = 1;
+       else
+               enc_flag = 0;
+
        switch (priv->firmware_type) {
        case FIRMWARE_TYPE_AGERE: /* Agere style WEP */
-               if (priv->wep_on) {
+               if (priv->encode_alg == IW_ENCODE_ALG_WEP) {
                        /* Enable the shared-key authentication. */
                        err = hermes_write_wordrec(hw, USER_BAP,
                                                   HERMES_RID_CNFAUTHENTICATION_AGERE,
@@ -1671,14 +2446,24 @@ static int __orinoco_hw_setup_wep(struct orinoco_private *priv)
                }
                err = hermes_write_wordrec(hw, USER_BAP,
                                           HERMES_RID_CNFWEPENABLED_AGERE,
-                                          priv->wep_on);
+                                          enc_flag);
                if (err)
                        return err;
+
+               if (priv->has_wpa) {
+                       /* Set WPA key management */
+                       err = hermes_write_wordrec(hw, USER_BAP,
+                                 HERMES_RID_CNFSETWPAAUTHMGMTSUITE_AGERE,
+                                 priv->key_mgmt);
+                       if (err)
+                               return err;
+               }
+
                break;
 
        case FIRMWARE_TYPE_INTERSIL: /* Intersil style WEP */
        case FIRMWARE_TYPE_SYMBOL: /* Symbol style WEP */
-               if (priv->wep_on) {
+               if (priv->encode_alg == IW_ENCODE_ALG_WEP) {
                        if (priv->wep_restrict ||
                            (priv->firmware_type == FIRMWARE_TYPE_SYMBOL))
                                master_wep_flag = HERMES_WEP_PRIVACY_INVOKED |
@@ -1710,6 +2495,84 @@ static int __orinoco_hw_setup_wep(struct orinoco_private *priv)
        return 0;
 }
 
+/* key must be 32 bytes, including the tx and rx MIC keys.
+ * rsc must be 8 bytes
+ * tsc must be 8 bytes or NULL
+ */
+static int __orinoco_hw_set_tkip_key(hermes_t *hw, int key_idx, int set_tx,
+                                    u8 *key, u8 *rsc, u8 *tsc)
+{
+       struct {
+               __le16 idx;
+               u8 rsc[IW_ENCODE_SEQ_MAX_SIZE];
+               u8 key[TKIP_KEYLEN];
+               u8 tx_mic[MIC_KEYLEN];
+               u8 rx_mic[MIC_KEYLEN];
+               u8 tsc[IW_ENCODE_SEQ_MAX_SIZE];
+       } __attribute__ ((packed)) buf;
+       int ret;
+       int err;
+       int k;
+       u16 xmitting;
+
+       key_idx &= 0x3;
+
+       if (set_tx)
+               key_idx |= 0x8000;
+
+       buf.idx = cpu_to_le16(key_idx);
+       memcpy(buf.key, key,
+              sizeof(buf.key) + sizeof(buf.tx_mic) + sizeof(buf.rx_mic));
+
+       if (rsc == NULL)
+               memset(buf.rsc, 0, sizeof(buf.rsc));
+       else
+               memcpy(buf.rsc, rsc, sizeof(buf.rsc));
+
+       if (tsc == NULL) {
+               memset(buf.tsc, 0, sizeof(buf.tsc));
+               buf.tsc[4] = 0x10;
+       } else {
+               memcpy(buf.tsc, tsc, sizeof(buf.tsc));
+       }
+
+       /* Wait upto 100ms for tx queue to empty */
+       k = 100;
+       do {
+               k--;
+               udelay(1000);
+               ret = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_TXQUEUEEMPTY,
+                                         &xmitting);
+               if (ret)
+                       break;
+       } while ((k > 0) && xmitting);
+
+       if (k == 0)
+               ret = -ETIMEDOUT;
+
+       err = HERMES_WRITE_RECORD(hw, USER_BAP,
+                                 HERMES_RID_CNFADDDEFAULTTKIPKEY_AGERE,
+                                 &buf);
+
+       return ret ? ret : err;
+}
+
+static int orinoco_clear_tkip_key(struct orinoco_private *priv,
+                                 int key_idx)
+{
+       hermes_t *hw = &priv->hw;
+       int err;
+
+       memset(&priv->tkip_key[key_idx], 0, sizeof(priv->tkip_key[key_idx]));
+       err = hermes_write_wordrec(hw, USER_BAP,
+                                  HERMES_RID_CNFREMDEFAULTTKIPKEY_AGERE,
+                                  key_idx);
+       if (err)
+               printk(KERN_WARNING "%s: Error %d clearing TKIP key %d\n",
+                      priv->ndev->name, err, key_idx);
+       return err;
+}
+
 static int __orinoco_program_rids(struct net_device *dev)
 {
        struct orinoco_private *priv = netdev_priv(dev);
@@ -1906,10 +2769,10 @@ static int __orinoco_program_rids(struct net_device *dev)
        }
 
        /* Set up encryption */
-       if (priv->has_wep) {
-               err = __orinoco_hw_setup_wep(priv);
+       if (priv->has_wep || priv->has_wpa) {
+               err = __orinoco_hw_setup_enc(priv);
                if (err) {
-                       printk(KERN_ERR "%s: Error %d activating WEP\n",
+                       printk(KERN_ERR "%s: Error %d activating encryption\n",
                               dev->name, err);
                        return err;
                }
@@ -2043,6 +2906,12 @@ static void orinoco_reset(struct work_struct *work)
                }
        }
 
+       if (priv->do_fw_download) {
+               err = orinoco_download(priv);
+               if (err)
+                       priv->do_fw_download = 0;
+       }
+
        err = orinoco_reinit_firmware(dev);
        if (err) {
                printk(KERN_ERR "%s: orinoco_reset: Error %d re-initializing firmware\n",
@@ -2254,6 +3123,10 @@ static int determine_firmware(struct net_device *dev)
        priv->has_ibss = 1;
        priv->has_wep = 0;
        priv->has_big_wep = 0;
+       priv->has_alt_txcntl = 0;
+       priv->has_ext_scan = 0;
+       priv->has_wpa = 0;
+       priv->do_fw_download = 0;
 
        /* Determine capabilities from the firmware version */
        switch (priv->firmware_type) {
@@ -2273,8 +3146,11 @@ static int determine_firmware(struct net_device *dev)
                priv->has_pm = (firmver >= 0x40020); /* Don't work in 7.52 ? */
                priv->ibss_port = 1;
                priv->has_hostscan = (firmver >= 0x8000a);
+               priv->do_fw_download = 1;
                priv->broken_monitor = (firmver >= 0x80000);
-
+               priv->has_alt_txcntl = (firmver >= 0x90000); /* All 9.x ? */
+               priv->has_ext_scan = (firmver >= 0x90000); /* All 9.x ? */
+               priv->has_wpa = (firmver >= 0x9002a);
                /* Tested with Agere firmware :
                 *      1.16 ; 4.08 ; 4.52 ; 6.04 ; 6.16 ; 7.28 => Jean II
                 * Tested CableTron firmware : 4.32 => Anton */
@@ -2317,6 +3193,21 @@ static int determine_firmware(struct net_device *dev)
                               firmver >= 0x31000;
                priv->has_preamble = (firmver >= 0x20000);
                priv->ibss_port = 4;
+
+               /* Symbol firmware is found on various cards, but
+                * there has been no attempt to check firmware
+                * download on non-spectrum_cs based cards.
+                *
+                * Given that the Agere firmware download works
+                * differently, we should avoid doing a firmware
+                * download with the Symbol algorithm on non-spectrum
+                * cards.
+                *
+                * For now we can identify a spectrum_cs based card
+                * because it has a firmware reset function.
+                */
+               priv->do_fw_download = (priv->stop_fw != NULL);
+
                priv->broken_disableport = (firmver == 0x25013) ||
                                           (firmver >= 0x30000 && firmver <= 0x31000);
                priv->has_hostscan = (firmver >= 0x31001) ||
@@ -2387,6 +3278,20 @@ static int orinoco_init(struct net_device *dev)
                goto out;
        }
 
+       if (priv->do_fw_download) {
+               err = orinoco_download(priv);
+               if (err)
+                       priv->do_fw_download = 0;
+
+               /* Check firmware version again */
+               err = determine_firmware(dev);
+               if (err != 0) {
+                       printk(KERN_ERR "%s: Incompatible firmware, aborting\n",
+                              dev->name);
+                       goto out;
+               }
+       }
+
        if (priv->has_port3)
                printk(KERN_DEBUG "%s: Ad-hoc demo mode supported\n", dev->name);
        if (priv->has_ibss)
@@ -2399,6 +3304,20 @@ static int orinoco_init(struct net_device *dev)
                else
                        printk("40-bit key\n");
        }
+       if (priv->has_wpa) {
+               printk(KERN_DEBUG "%s: WPA-PSK supported\n", dev->name);
+               if (orinoco_mic_init(priv)) {
+                       printk(KERN_ERR "%s: Failed to setup MIC crypto "
+                              "algorithm. Disabling WPA support\n", dev->name);
+                       priv->has_wpa = 0;
+               }
+       }
+
+       /* Now we have the firmware capabilities, allocate appropiate
+        * sized scan buffers */
+       if (orinoco_bss_data_allocate(priv))
+               goto out;
+       orinoco_bss_data_init(priv);
 
        /* Get the MAC address */
        err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CNFOWNMACADDR,
@@ -2514,8 +3433,13 @@ static int orinoco_init(struct net_device *dev)
        priv->channel = 0; /* use firmware default */
 
        priv->promiscuous = 0;
-       priv->wep_on = 0;
+       priv->encode_alg = IW_ENCODE_ALG_NONE;
        priv->tx_key = 0;
+       priv->wpa_enabled = 0;
+       priv->tkip_cm_active = 0;
+       priv->key_mgmt = 0;
+       priv->wpa_ie_len = 0;
+       priv->wpa_ie = NULL;
 
        /* Make the hardware available, as long as it hasn't been
         * removed elsewhere (e.g. by PCMCIA hot unplug) */
@@ -2529,8 +3453,11 @@ static int orinoco_init(struct net_device *dev)
        return err;
 }
 
-struct net_device *alloc_orinocodev(int sizeof_card,
-                                   int (*hard_reset)(struct orinoco_private *))
+struct net_device
+*alloc_orinocodev(int sizeof_card,
+                 struct device *device,
+                 int (*hard_reset)(struct orinoco_private *),
+                 int (*stop_fw)(struct orinoco_private *, int))
 {
        struct net_device *dev;
        struct orinoco_private *priv;
@@ -2545,10 +3472,7 @@ struct net_device *alloc_orinocodev(int sizeof_card,
                                      + sizeof(struct orinoco_private));
        else
                priv->card = NULL;
-
-       if (orinoco_bss_data_allocate(priv))
-               goto err_out_free;
-       orinoco_bss_data_init(priv);
+       priv->dev = device;
 
        /* Setup / override net_device fields */
        dev->init = orinoco_init;
@@ -2566,10 +3490,14 @@ struct net_device *alloc_orinocodev(int sizeof_card,
        dev->set_multicast_list = orinoco_set_multicast_list;
        /* we use the default eth_mac_addr for setting the MAC addr */
 
+       /* Reserve space in skb for the SNAP header */
+       dev->hard_header_len += ENCAPS_OVERHEAD;
+
        /* Set up default callbacks */
        dev->open = orinoco_open;
        dev->stop = orinoco_stop;
        priv->hard_reset = hard_reset;
+       priv->stop_fw = stop_fw;
 
        spin_lock_init(&priv->lock);
        priv->open = 0;
@@ -2580,20 +3508,27 @@ struct net_device *alloc_orinocodev(int sizeof_card,
        INIT_WORK(&priv->join_work, orinoco_join_ap);
        INIT_WORK(&priv->wevent_work, orinoco_send_wevents);
 
+       INIT_LIST_HEAD(&priv->rx_list);
+       tasklet_init(&priv->rx_tasklet, orinoco_rx_isr_tasklet,
+                    (unsigned long) dev);
+
        netif_carrier_off(dev);
        priv->last_linkstatus = 0xffff;
 
        return dev;
-
-err_out_free:
-       free_netdev(dev);
-       return NULL;
 }
 
 void free_orinocodev(struct net_device *dev)
 {
        struct orinoco_private *priv = netdev_priv(dev);
 
+       /* No need to empty priv->rx_list: if the tasklet is scheduled
+        * when we call tasklet_kill it will run one final time,
+        * emptying the list */
+       tasklet_kill(&priv->rx_tasklet);
+       priv->wpa_ie_len = 0;
+       kfree(priv->wpa_ie);
+       orinoco_mic_free(priv);
        orinoco_bss_data_free(priv);
        free_netdev(dev);
 }
@@ -2905,7 +3840,7 @@ static int orinoco_ioctl_getiwrange(struct net_device *dev,
        memset(range, 0, sizeof(struct iw_range));
 
        range->we_version_compiled = WIRELESS_EXT;
-       range->we_version_source = 14;
+       range->we_version_source = 22;
 
        /* Set available channels/frequencies */
        range->num_channels = NUM_CHANNELS;
@@ -2935,6 +3870,9 @@ static int orinoco_ioctl_getiwrange(struct net_device *dev,
                }
        }
 
+       if (priv->has_wpa)
+               range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_CIPHER_TKIP;
+
        if ((priv->iw_mode == IW_MODE_ADHOC) && (!SPY_NUMBER(priv))){
                /* Quality stats meaningless in ad-hoc mode */
        } else {
@@ -2982,6 +3920,11 @@ static int orinoco_ioctl_getiwrange(struct net_device *dev,
        range->min_r_time = 0;
        range->max_r_time = 65535 * 1000;       /* ??? */
 
+       if (priv->firmware_type == FIRMWARE_TYPE_AGERE)
+               range->scan_capa = IW_SCAN_CAPA_ESSID;
+       else
+               range->scan_capa = IW_SCAN_CAPA_NONE;
+
        /* Event capability (kernel) */
        IW_EVENT_CAPA_SET_KERNEL(range->event_capa);
        /* Event capability (driver) */
@@ -3001,7 +3944,7 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev,
        struct orinoco_private *priv = netdev_priv(dev);
        int index = (erq->flags & IW_ENCODE_INDEX) - 1;
        int setindex = priv->tx_key;
-       int enable = priv->wep_on;
+       int encode_alg = priv->encode_alg;
        int restricted = priv->wep_restrict;
        u16 xlen = 0;
        int err = -EINPROGRESS;         /* Call commit handler */
@@ -3022,6 +3965,10 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev,
        if (orinoco_lock(priv, &flags) != 0)
                return -EBUSY;
 
+       /* Clear any TKIP key we have */
+       if ((priv->has_wpa) && (priv->encode_alg == IW_ENCODE_ALG_TKIP))
+               (void) orinoco_clear_tkip_key(priv, setindex);
+
        if (erq->length > 0) {
                if ((index < 0) || (index >= ORINOCO_MAX_KEYS))
                        index = priv->tx_key;
@@ -3035,9 +3982,9 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev,
                        xlen = 0;
 
                /* Switch on WEP if off */
-               if ((!enable) && (xlen > 0)) {
+               if ((encode_alg != IW_ENCODE_ALG_WEP) && (xlen > 0)) {
                        setindex = index;
-                       enable = 1;
+                       encode_alg = IW_ENCODE_ALG_WEP;
                }
        } else {
                /* Important note : if the user do "iwconfig eth0 enc off",
@@ -3059,7 +4006,7 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev,
        }
 
        if (erq->flags & IW_ENCODE_DISABLED)
-               enable = 0;
+               encode_alg = IW_ENCODE_ALG_NONE;
        if (erq->flags & IW_ENCODE_OPEN)
                restricted = 0;
        if (erq->flags & IW_ENCODE_RESTRICTED)
@@ -3074,14 +4021,15 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev,
        priv->tx_key = setindex;
 
        /* Try fast key change if connected and only keys are changed */
-       if (priv->wep_on && enable && (priv->wep_restrict == restricted) &&
+       if ((priv->encode_alg == encode_alg) &&
+           (priv->wep_restrict == restricted) &&
            netif_carrier_ok(dev)) {
                err = __orinoco_hw_setup_wepkeys(priv);
                /* No need to commit if successful */
                goto out;
        }
 
-       priv->wep_on = enable;
+       priv->encode_alg = encode_alg;
        priv->wep_restrict = restricted;
 
  out:
@@ -3110,7 +4058,7 @@ static int orinoco_ioctl_getiwencode(struct net_device *dev,
                index = priv->tx_key;
 
        erq->flags = 0;
-       if (! priv->wep_on)
+       if (!priv->encode_alg)
                erq->flags |= IW_ENCODE_DISABLED;
        erq->flags |= index + 1;
 
@@ -3685,6 +4633,399 @@ static int orinoco_ioctl_getpower(struct net_device *dev,
        return err;
 }
 
+static int orinoco_ioctl_set_encodeext(struct net_device *dev,
+                                      struct iw_request_info *info,
+                                      union iwreq_data *wrqu,
+                                      char *extra)
+{
+       struct orinoco_private *priv = netdev_priv(dev);
+       struct iw_point *encoding = &wrqu->encoding;
+       struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
+       int idx, alg = ext->alg, set_key = 1;
+       unsigned long flags;
+       int err = -EINVAL;
+       u16 key_len;
+
+       if (orinoco_lock(priv, &flags) != 0)
+               return -EBUSY;
+
+       /* Determine and validate the key index */
+       idx = encoding->flags & IW_ENCODE_INDEX;
+       if (idx) {
+               if ((idx < 1) || (idx > WEP_KEYS))
+                       goto out;
+               idx--;
+       } else
+               idx = priv->tx_key;
+
+       if (encoding->flags & IW_ENCODE_DISABLED)
+           alg = IW_ENCODE_ALG_NONE;
+
+       if (priv->has_wpa && (alg != IW_ENCODE_ALG_TKIP)) {
+               /* Clear any TKIP TX key we had */
+               (void) orinoco_clear_tkip_key(priv, priv->tx_key);
+       }
+
+       if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
+               priv->tx_key = idx;
+               set_key = ((alg == IW_ENCODE_ALG_TKIP) ||
+                          (ext->key_len > 0)) ? 1 : 0;
+       }
+
+       if (set_key) {
+               /* Set the requested key first */
+               switch (alg) {
+               case IW_ENCODE_ALG_NONE:
+                       priv->encode_alg = alg;
+                       priv->keys[idx].len = 0;
+                       break;
+
+               case IW_ENCODE_ALG_WEP:
+                       if (ext->key_len > SMALL_KEY_SIZE)
+                               key_len = LARGE_KEY_SIZE;
+                       else if (ext->key_len > 0)
+                               key_len = SMALL_KEY_SIZE;
+                       else
+                               goto out;
+
+                       priv->encode_alg = alg;
+                       priv->keys[idx].len = cpu_to_le16(key_len);
+
+                       key_len = min(ext->key_len, key_len);
+
+                       memset(priv->keys[idx].data, 0, ORINOCO_MAX_KEY_SIZE);
+                       memcpy(priv->keys[idx].data, ext->key, key_len);
+                       break;
+
+               case IW_ENCODE_ALG_TKIP:
+               {
+                       hermes_t *hw = &priv->hw;
+                       u8 *tkip_iv = NULL;
+
+                       if (!priv->has_wpa ||
+                           (ext->key_len > sizeof(priv->tkip_key[0])))
+                               goto out;
+
+                       priv->encode_alg = alg;
+                       memset(&priv->tkip_key[idx], 0,
+                              sizeof(priv->tkip_key[idx]));
+                       memcpy(&priv->tkip_key[idx], ext->key, ext->key_len);
+
+                       if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID)
+                               tkip_iv = &ext->rx_seq[0];
+
+                       err = __orinoco_hw_set_tkip_key(hw, idx,
+                                ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY,
+                                (u8 *) &priv->tkip_key[idx],
+                                tkip_iv, NULL);
+                       if (err)
+                               printk(KERN_ERR "%s: Error %d setting TKIP key"
+                                      "\n", dev->name, err);
+
+                       goto out;
+               }
+               default:
+                       goto out;
+               }
+       }
+       err = -EINPROGRESS;
+ out:
+       orinoco_unlock(priv, &flags);
+
+       return err;
+}
+
+static int orinoco_ioctl_get_encodeext(struct net_device *dev,
+                                      struct iw_request_info *info,
+                                      union iwreq_data *wrqu,
+                                      char *extra)
+{
+       struct orinoco_private *priv = netdev_priv(dev);
+       struct iw_point *encoding = &wrqu->encoding;
+       struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
+       int idx, max_key_len;
+       unsigned long flags;
+       int err;
+
+       if (orinoco_lock(priv, &flags) != 0)
+               return -EBUSY;
+
+       err = -EINVAL;
+       max_key_len = encoding->length - sizeof(*ext);
+       if (max_key_len < 0)
+               goto out;
+
+       idx = encoding->flags & IW_ENCODE_INDEX;
+       if (idx) {
+               if ((idx < 1) || (idx > WEP_KEYS))
+                       goto out;
+               idx--;
+       } else
+               idx = priv->tx_key;
+
+       encoding->flags = idx + 1;
+       memset(ext, 0, sizeof(*ext));
+
+       ext->alg = priv->encode_alg;
+       switch (priv->encode_alg) {
+       case IW_ENCODE_ALG_NONE:
+               ext->key_len = 0;
+               encoding->flags |= IW_ENCODE_DISABLED;
+               break;
+       case IW_ENCODE_ALG_WEP:
+               ext->key_len = min(le16_to_cpu(priv->keys[idx].len),
+                                  (u16) max_key_len);
+               memcpy(ext->key, priv->keys[idx].data, ext->key_len);
+               encoding->flags |= IW_ENCODE_ENABLED;
+               break;
+       case IW_ENCODE_ALG_TKIP:
+               ext->key_len = min((u16) sizeof(struct orinoco_tkip_key),
+                                  (u16) max_key_len);
+               memcpy(ext->key, &priv->tkip_key[idx], ext->key_len);
+               encoding->flags |= IW_ENCODE_ENABLED;
+               break;
+       }
+
+       err = 0;
+ out:
+       orinoco_unlock(priv, &flags);
+
+       return err;
+}
+
+static int orinoco_ioctl_set_auth(struct net_device *dev,
+                                 struct iw_request_info *info,
+                                 union iwreq_data *wrqu, char *extra)
+{
+       struct orinoco_private *priv = netdev_priv(dev);
+       hermes_t *hw = &priv->hw;
+       struct iw_param *param = &wrqu->param;
+       unsigned long flags;
+       int ret = -EINPROGRESS;
+
+       if (orinoco_lock(priv, &flags) != 0)
+               return -EBUSY;
+
+       switch (param->flags & IW_AUTH_INDEX) {
+       case IW_AUTH_WPA_VERSION:
+       case IW_AUTH_CIPHER_PAIRWISE:
+       case IW_AUTH_CIPHER_GROUP:
+       case IW_AUTH_RX_UNENCRYPTED_EAPOL:
+       case IW_AUTH_PRIVACY_INVOKED:
+       case IW_AUTH_DROP_UNENCRYPTED:
+               /*
+                * orinoco does not use these parameters
+                */
+               break;
+
+       case IW_AUTH_KEY_MGMT:
+               /* wl_lkm implies value 2 == PSK for Hermes I
+                * which ties in with WEXT
+                * no other hints tho :(
+                */
+               priv->key_mgmt = param->value;
+               break;
+
+       case IW_AUTH_TKIP_COUNTERMEASURES:
+               /* When countermeasures are enabled, shut down the
+                * card; when disabled, re-enable the card. This must
+                * take effect immediately.
+                *
+                * TODO: Make sure that the EAPOL message is getting
+                *       out before card disabled
+                */
+               if (param->value) {
+                       priv->tkip_cm_active = 1;
+                       ret = hermes_enable_port(hw, 0);
+               } else {
+                       priv->tkip_cm_active = 0;
+                       ret = hermes_disable_port(hw, 0);
+               }
+               break;
+
+       case IW_AUTH_80211_AUTH_ALG:
+               if (param->value & IW_AUTH_ALG_SHARED_KEY)
+                       priv->wep_restrict = 1;
+               else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM)
+                       priv->wep_restrict = 0;
+               else
+                       ret = -EINVAL;
+               break;
+
+       case IW_AUTH_WPA_ENABLED:
+               if (priv->has_wpa) {
+                       priv->wpa_enabled = param->value ? 1 : 0;
+               } else {
+                       if (param->value)
+                               ret = -EOPNOTSUPP;
+                       /* else silently accept disable of WPA */
+                       priv->wpa_enabled = 0;
+               }
+               break;
+
+       default:
+               ret = -EOPNOTSUPP;
+       }
+
+       orinoco_unlock(priv, &flags);
+       return ret;
+}
+
+static int orinoco_ioctl_get_auth(struct net_device *dev,
+                                 struct iw_request_info *info,
+                                 union iwreq_data *wrqu, char *extra)
+{
+       struct orinoco_private *priv = netdev_priv(dev);
+       struct iw_param *param = &wrqu->param;
+       unsigned long flags;
+       int ret = 0;
+
+       if (orinoco_lock(priv, &flags) != 0)
+               return -EBUSY;
+
+       switch (param->flags & IW_AUTH_INDEX) {
+       case IW_AUTH_KEY_MGMT:
+               param->value = priv->key_mgmt;
+               break;
+
+       case IW_AUTH_TKIP_COUNTERMEASURES:
+               param->value = priv->tkip_cm_active;
+               break;
+
+       case IW_AUTH_80211_AUTH_ALG:
+               if (priv->wep_restrict)
+                       param->value = IW_AUTH_ALG_SHARED_KEY;
+               else
+                       param->value = IW_AUTH_ALG_OPEN_SYSTEM;
+               break;
+
+       case IW_AUTH_WPA_ENABLED:
+               param->value = priv->wpa_enabled;
+               break;
+
+       default:
+               ret = -EOPNOTSUPP;
+       }
+
+       orinoco_unlock(priv, &flags);
+       return ret;
+}
+
+static int orinoco_ioctl_set_genie(struct net_device *dev,
+                                  struct iw_request_info *info,
+                                  union iwreq_data *wrqu, char *extra)
+{
+       struct orinoco_private *priv = netdev_priv(dev);
+       u8 *buf;
+       unsigned long flags;
+       int err = 0;
+
+       if ((wrqu->data.length > MAX_WPA_IE_LEN) ||
+           (wrqu->data.length && (extra == NULL)))
+               return -EINVAL;
+
+       if (orinoco_lock(priv, &flags) != 0)
+               return -EBUSY;
+
+       if (wrqu->data.length) {
+               buf = kmalloc(wrqu->data.length, GFP_KERNEL);
+               if (buf == NULL) {
+                       err = -ENOMEM;
+                       goto out;
+               }
+
+               memcpy(buf, extra, wrqu->data.length);
+               kfree(priv->wpa_ie);
+               priv->wpa_ie = buf;
+               priv->wpa_ie_len = wrqu->data.length;
+       } else {
+               kfree(priv->wpa_ie);
+               priv->wpa_ie = NULL;
+               priv->wpa_ie_len = 0;
+       }
+
+       if (priv->wpa_ie) {
+               /* Looks like wl_lkm wants to check the auth alg, and
+                * somehow pass it to the firmware.
+                * Instead it just calls the key mgmt rid
+                *   - we do this in set auth.
+                */
+       }
+
+out:
+       orinoco_unlock(priv, &flags);
+       return err;
+}
+
+static int orinoco_ioctl_get_genie(struct net_device *dev,
+                                  struct iw_request_info *info,
+                                  union iwreq_data *wrqu, char *extra)
+{
+       struct orinoco_private *priv = netdev_priv(dev);
+       unsigned long flags;
+       int err = 0;
+
+       if (orinoco_lock(priv, &flags) != 0)
+               return -EBUSY;
+
+       if ((priv->wpa_ie_len == 0) || (priv->wpa_ie == NULL)) {
+               wrqu->data.length = 0;
+               goto out;
+       }
+
+       if (wrqu->data.length < priv->wpa_ie_len) {
+               err = -E2BIG;
+               goto out;
+       }
+
+       wrqu->data.length = priv->wpa_ie_len;
+       memcpy(extra, priv->wpa_ie, priv->wpa_ie_len);
+
+out:
+       orinoco_unlock(priv, &flags);
+       return err;
+}
+
+static int orinoco_ioctl_set_mlme(struct net_device *dev,
+                                 struct iw_request_info *info,
+                                 union iwreq_data *wrqu, char *extra)
+{
+       struct orinoco_private *priv = netdev_priv(dev);
+       hermes_t *hw = &priv->hw;
+       struct iw_mlme *mlme = (struct iw_mlme *)extra;
+       unsigned long flags;
+       int ret = 0;
+
+       if (orinoco_lock(priv, &flags) != 0)
+               return -EBUSY;
+
+       switch (mlme->cmd) {
+       case IW_MLME_DEAUTH:
+               /* silently ignore */
+               break;
+
+       case IW_MLME_DISASSOC:
+       {
+               struct {
+                       u8 addr[ETH_ALEN];
+                       __le16 reason_code;
+               } __attribute__ ((packed)) buf;
+
+               memcpy(buf.addr, mlme->addr.sa_data, ETH_ALEN);
+               buf.reason_code = cpu_to_le16(mlme->reason_code);
+               ret = HERMES_WRITE_RECORD(hw, USER_BAP,
+                                         HERMES_RID_CNFDISASSOCIATE,
+                                         &buf);
+               break;
+       }
+       default:
+               ret = -EOPNOTSUPP;
+       }
+
+       orinoco_unlock(priv, &flags);
+       return ret;
+}
+
 static int orinoco_ioctl_getretry(struct net_device *dev,
                                  struct iw_request_info *info,
                                  struct iw_param *rrq,
@@ -3943,7 +5284,7 @@ static int orinoco_ioctl_getrid(struct net_device *dev,
        return err;
 }
 
-/* Trigger a scan (look for other cells in the vicinity */
+/* Trigger a scan (look for other cells in the vicinity) */
 static int orinoco_ioctl_setscan(struct net_device *dev,
                                 struct iw_request_info *info,
                                 struct iw_param *srq,
@@ -3951,6 +5292,7 @@ static int orinoco_ioctl_setscan(struct net_device *dev,
 {
        struct orinoco_private *priv = netdev_priv(dev);
        hermes_t *hw = &priv->hw;
+       struct iw_scan_req *si = (struct iw_scan_req *) extra;
        int err = 0;
        unsigned long flags;
 
@@ -3982,7 +5324,6 @@ static int orinoco_ioctl_setscan(struct net_device *dev,
         * we access scan variables in priv is critical.
         *      o scan_inprogress : not touched by irq handler
         *      o scan_mode : not touched by irq handler
-        *      o scan_len : synchronised with scan_result
         * Before modifying anything on those variables, please think hard !
         * Jean II */
 
@@ -4012,13 +5353,43 @@ static int orinoco_ioctl_setscan(struct net_device *dev,
                }
                break;
                case FIRMWARE_TYPE_AGERE:
-                       err = hermes_write_wordrec(hw, USER_BAP,
+                       if (priv->scan_mode & IW_SCAN_THIS_ESSID) {
+                               struct hermes_idstring idbuf;
+                               size_t len = min(sizeof(idbuf.val),
+                                                (size_t) si->essid_len);
+                               idbuf.len = cpu_to_le16(len);
+                               memcpy(idbuf.val, si->essid, len);
+
+                               err = hermes_write_ltv(hw, USER_BAP,
+                                              HERMES_RID_CNFSCANSSID_AGERE,
+                                              HERMES_BYTES_TO_RECLEN(len + 2),
+                                              &idbuf);
+                       } else
+                               err = hermes_write_wordrec(hw, USER_BAP,
                                                   HERMES_RID_CNFSCANSSID_AGERE,
                                                   0);  /* Any ESSID */
                        if (err)
                                break;
 
-                       err = hermes_inquire(hw, HERMES_INQ_SCAN);
+                       if (priv->has_ext_scan) {
+                               /* Clear scan results at the start of
+                                * an extended scan */
+                               orinoco_clear_scan_results(priv,
+                                               msecs_to_jiffies(15000));
+
+                               /* TODO: Is this available on older firmware?
+                                *   Can we use it to scan specific channels
+                                *   for IW_SCAN_THIS_FREQ? */
+                               err = hermes_write_wordrec(hw, USER_BAP,
+                                               HERMES_RID_CNFSCANCHANNELS2GHZ,
+                                               0x7FFF);
+                               if (err)
+                                       goto out;
+
+                               err = hermes_inquire(hw,
+                                                    HERMES_INQ_CHANNELINFO);
+                       } else
+                               err = hermes_inquire(hw, HERMES_INQ_SCAN);
                        break;
                }
        } else
@@ -4036,8 +5407,7 @@ static int orinoco_ioctl_setscan(struct net_device *dev,
 #define MAX_CUSTOM_LEN 64
 
 /* Translate scan data returned from the card to a card independant
- * format that the Wireless Tools will understand - Jean II
- * Return message length or -errno for fatal errors */
+ * format that the Wireless Tools will understand - Jean II */
 static inline char *orinoco_translate_scan(struct net_device *dev,
                                           struct iw_request_info *info,
                                           char *current_ev,
@@ -4049,9 +5419,10 @@ static inline char *orinoco_translate_scan(struct net_device *dev,
        u16                     capabilities;
        u16                     channel;
        struct iw_event         iwe;            /* Temporary buffer */
-       char                   *p;
        char custom[MAX_CUSTOM_LEN];
 
+       memset(&iwe, 0, sizeof(iwe));
+
        /* First entry *MUST* be the AP MAC address */
        iwe.cmd = SIOCGIWAP;
        iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
@@ -4073,8 +5444,8 @@ static inline char *orinoco_translate_scan(struct net_device *dev,
        /* Add mode */
        iwe.cmd = SIOCGIWMODE;
        capabilities = le16_to_cpu(bss->a.capabilities);
-       if (capabilities & 0x3) {
-               if (capabilities & 0x1)
+       if (capabilities & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS)) {
+               if (capabilities & WLAN_CAPABILITY_ESS)
                        iwe.u.mode = IW_MODE_MASTER;
                else
                        iwe.u.mode = IW_MODE_ADHOC;
@@ -4084,17 +5455,22 @@ static inline char *orinoco_translate_scan(struct net_device *dev,
 
        channel = bss->s.channel;
        if ((channel >= 1) && (channel <= NUM_CHANNELS)) {
-               /* Add frequency */
+               /* Add channel and frequency */
                iwe.cmd = SIOCGIWFREQ;
+               iwe.u.freq.m = channel;
+               iwe.u.freq.e = 0;
+               current_ev = iwe_stream_add_event(info, current_ev, end_buf,
+                                                 &iwe, IW_EV_FREQ_LEN);
+
                iwe.u.freq.m = channel_frequency[channel-1] * 100000;
                iwe.u.freq.e = 1;
                current_ev = iwe_stream_add_event(info, current_ev, end_buf,
                                                  &iwe, IW_EV_FREQ_LEN);
        }
 
-       /* Add quality statistics */
+       /* Add quality statistics. level and noise in dB. No link quality */
        iwe.cmd = IWEVQUAL;
-       iwe.u.qual.updated = 0x10;      /* no link quality */
+       iwe.u.qual.updated = IW_QUAL_DBM | IW_QUAL_QUAL_INVALID;
        iwe.u.qual.level = (__u8) le16_to_cpu(bss->a.level) - 0x95;
        iwe.u.qual.noise = (__u8) le16_to_cpu(bss->a.noise) - 0x95;
        /* Wireless tools prior to 27.pre22 will show link quality
@@ -4108,25 +5484,13 @@ static inline char *orinoco_translate_scan(struct net_device *dev,
 
        /* Add encryption capability */
        iwe.cmd = SIOCGIWENCODE;
-       if (capabilities & 0x10)
+       if (capabilities & WLAN_CAPABILITY_PRIVACY)
                iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
        else
                iwe.u.data.flags = IW_ENCODE_DISABLED;
        iwe.u.data.length = 0;
        current_ev = iwe_stream_add_point(info, current_ev, end_buf,
-                                         &iwe, bss->a.essid);
-
-       /* Add EXTRA: Age to display seconds since last beacon/probe response
-        * for given network. */
-       iwe.cmd = IWEVCUSTOM;
-       p = custom;
-       p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
-                     " Last beacon: %dms ago",
-                     jiffies_to_msecs(jiffies - last_scanned));
-       iwe.u.data.length = p - custom;
-       if (iwe.u.data.length)
-               current_ev = iwe_stream_add_point(info, current_ev, end_buf,
-                                                 &iwe, custom);
+                                         &iwe, NULL);
 
        /* Bit rate is not available in Lucent/Agere firmwares */
        if (priv->firmware_type != FIRMWARE_TYPE_AGERE) {
@@ -4148,7 +5512,8 @@ static inline char *orinoco_translate_scan(struct net_device *dev,
                        if (bss->p.rates[i] == 0x0)
                                break;
                        /* Bit rate given in 500 kb/s units (+ 0x80) */
-                       iwe.u.bitrate.value = ((bss->p.rates[i] & 0x7f) * 500000);
+                       iwe.u.bitrate.value =
+                               ((bss->p.rates[i] & 0x7f) * 500000);
                        current_val = iwe_stream_add_value(info, current_ev,
                                                           current_val,
                                                           end_buf, &iwe,
@@ -4159,6 +5524,199 @@ static inline char *orinoco_translate_scan(struct net_device *dev,
                        current_ev = current_val;
        }
 
+       /* Beacon interval */
+       iwe.cmd = IWEVCUSTOM;
+       iwe.u.data.length = snprintf(custom, MAX_CUSTOM_LEN,
+                                    "bcn_int=%d",
+                                    le16_to_cpu(bss->a.beacon_interv));
+       if (iwe.u.data.length)
+               current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+                                                 &iwe, custom);
+
+       /* Capabilites */
+       iwe.cmd = IWEVCUSTOM;
+       iwe.u.data.length = snprintf(custom, MAX_CUSTOM_LEN,
+                                    "capab=0x%04x",
+                                    capabilities);
+       if (iwe.u.data.length)
+               current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+                                                 &iwe, custom);
+
+       /* Add EXTRA: Age to display seconds since last beacon/probe response
+        * for given network. */
+       iwe.cmd = IWEVCUSTOM;
+       iwe.u.data.length = snprintf(custom, MAX_CUSTOM_LEN,
+                                    " Last beacon: %dms ago",
+                                    jiffies_to_msecs(jiffies - last_scanned));
+       if (iwe.u.data.length)
+               current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+                                                 &iwe, custom);
+
+       return current_ev;
+}
+
+static inline char *orinoco_translate_ext_scan(struct net_device *dev,
+                                              struct iw_request_info *info,
+                                              char *current_ev,
+                                              char *end_buf,
+                                              struct agere_ext_scan_info *bss,
+                                              unsigned int last_scanned)
+{
+       u16                     capabilities;
+       u16                     channel;
+       struct iw_event         iwe;            /* Temporary buffer */
+       char custom[MAX_CUSTOM_LEN];
+       u8 *ie;
+
+       memset(&iwe, 0, sizeof(iwe));
+
+       /* First entry *MUST* be the AP MAC address */
+       iwe.cmd = SIOCGIWAP;
+       iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
+       memcpy(iwe.u.ap_addr.sa_data, bss->bssid, ETH_ALEN);
+       current_ev = iwe_stream_add_event(info, current_ev, end_buf,
+                                         &iwe, IW_EV_ADDR_LEN);
+
+       /* Other entries will be displayed in the order we give them */
+
+       /* Add the ESSID */
+       ie = bss->data;
+       iwe.u.data.length = ie[1];
+       if (iwe.u.data.length) {
+               if (iwe.u.data.length > 32)
+                       iwe.u.data.length = 32;
+               iwe.cmd = SIOCGIWESSID;
+               iwe.u.data.flags = 1;
+               current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+                                                 &iwe, &ie[2]);
+       }
+
+       /* Add mode */
+       capabilities = le16_to_cpu(bss->capabilities);
+       if (capabilities & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS)) {
+               iwe.cmd = SIOCGIWMODE;
+               if (capabilities & WLAN_CAPABILITY_ESS)
+                       iwe.u.mode = IW_MODE_MASTER;
+               else
+                       iwe.u.mode = IW_MODE_ADHOC;
+               current_ev = iwe_stream_add_event(info, current_ev, end_buf,
+                                                 &iwe, IW_EV_UINT_LEN);
+       }
+
+       ie = orinoco_get_ie(bss->data, sizeof(bss->data), MFIE_TYPE_DS_SET);
+       channel = ie ? ie[2] : 0;
+       if ((channel >= 1) && (channel <= NUM_CHANNELS)) {
+               /* Add channel and frequency */
+               iwe.cmd = SIOCGIWFREQ;
+               iwe.u.freq.m = channel;
+               iwe.u.freq.e = 0;
+               current_ev = iwe_stream_add_event(info, current_ev, end_buf,
+                                                 &iwe, IW_EV_FREQ_LEN);
+
+               iwe.u.freq.m = channel_frequency[channel-1] * 100000;
+               iwe.u.freq.e = 1;
+               current_ev = iwe_stream_add_event(info, current_ev, end_buf,
+                                                 &iwe, IW_EV_FREQ_LEN);
+       }
+
+       /* Add quality statistics. level and noise in dB. No link quality */
+       iwe.cmd = IWEVQUAL;
+       iwe.u.qual.updated = IW_QUAL_DBM | IW_QUAL_QUAL_INVALID;
+       iwe.u.qual.level = bss->level - 0x95;
+       iwe.u.qual.noise = bss->noise - 0x95;
+       /* Wireless tools prior to 27.pre22 will show link quality
+        * anyway, so we provide a reasonable value. */
+       if (iwe.u.qual.level > iwe.u.qual.noise)
+               iwe.u.qual.qual = iwe.u.qual.level - iwe.u.qual.noise;
+       else
+               iwe.u.qual.qual = 0;
+       current_ev = iwe_stream_add_event(info, current_ev, end_buf,
+                                         &iwe, IW_EV_QUAL_LEN);
+
+       /* Add encryption capability */
+       iwe.cmd = SIOCGIWENCODE;
+       if (capabilities & WLAN_CAPABILITY_PRIVACY)
+               iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
+       else
+               iwe.u.data.flags = IW_ENCODE_DISABLED;
+       iwe.u.data.length = 0;
+       current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+                                         &iwe, NULL);
+
+       /* WPA IE */
+       ie = orinoco_get_wpa_ie(bss->data, sizeof(bss->data));
+       if (ie) {
+               iwe.cmd = IWEVGENIE;
+               iwe.u.data.length = ie[1] + 2;
+               current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+                                                 &iwe, ie);
+       }
+
+       /* RSN IE */
+       ie = orinoco_get_ie(bss->data, sizeof(bss->data), MFIE_TYPE_RSN);
+       if (ie) {
+               iwe.cmd = IWEVGENIE;
+               iwe.u.data.length = ie[1] + 2;
+               current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+                                                 &iwe, ie);
+       }
+
+       ie = orinoco_get_ie(bss->data, sizeof(bss->data), MFIE_TYPE_RATES);
+       if (ie) {
+               char *p = current_ev + iwe_stream_lcp_len(info);
+               int i;
+
+               iwe.cmd = SIOCGIWRATE;
+               /* Those two flags are ignored... */
+               iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
+
+               for (i = 2; i < (ie[1] + 2); i++) {
+                       iwe.u.bitrate.value = ((ie[i] & 0x7F) * 500000);
+                       p = iwe_stream_add_value(info, current_ev, p, end_buf,
+                                                &iwe, IW_EV_PARAM_LEN);
+               }
+               /* Check if we added any event */
+               if (p > (current_ev + iwe_stream_lcp_len(info)))
+                       current_ev = p;
+       }
+
+       /* Timestamp */
+       iwe.cmd = IWEVCUSTOM;
+       iwe.u.data.length = snprintf(custom, MAX_CUSTOM_LEN,
+                                    "tsf=%016llx",
+                                    le64_to_cpu(bss->timestamp));
+       if (iwe.u.data.length)
+               current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+                                                 &iwe, custom);
+
+       /* Beacon interval */
+       iwe.cmd = IWEVCUSTOM;
+       iwe.u.data.length = snprintf(custom, MAX_CUSTOM_LEN,
+                                    "bcn_int=%d",
+                                    le16_to_cpu(bss->beacon_interval));
+       if (iwe.u.data.length)
+               current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+                                                 &iwe, custom);
+
+       /* Capabilites */
+       iwe.cmd = IWEVCUSTOM;
+       iwe.u.data.length = snprintf(custom, MAX_CUSTOM_LEN,
+                                    "capab=0x%04x",
+                                    capabilities);
+       if (iwe.u.data.length)
+               current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+                                                 &iwe, custom);
+
+       /* Add EXTRA: Age to display seconds since last beacon/probe response
+        * for given network. */
+       iwe.cmd = IWEVCUSTOM;
+       iwe.u.data.length = snprintf(custom, MAX_CUSTOM_LEN,
+                                    " Last beacon: %dms ago",
+                                    jiffies_to_msecs(jiffies - last_scanned));
+       if (iwe.u.data.length)
+               current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+                                                 &iwe, custom);
+
        return current_ev;
 }
 
@@ -4169,7 +5727,6 @@ static int orinoco_ioctl_getscan(struct net_device *dev,
                                 char *extra)
 {
        struct orinoco_private *priv = netdev_priv(dev);
-       bss_element *bss;
        int err = 0;
        unsigned long flags;
        char *current_ev = extra;
@@ -4189,18 +5746,47 @@ static int orinoco_ioctl_getscan(struct net_device *dev,
                goto out;
        }
 
-       list_for_each_entry(bss, &priv->bss_list, list) {
-               /* Translate to WE format this entry */
-               current_ev = orinoco_translate_scan(dev, info, current_ev,
-                                                   extra + srq->length,
-                                                   &bss->bss,
-                                                   bss->last_scanned);
-
-               /* Check if there is space for one more entry */
-               if ((extra + srq->length - current_ev) <= IW_EV_ADDR_LEN) {
-                       /* Ask user space to try again with a bigger buffer */
-                       err = -E2BIG;
-                       goto out;
+       if (priv->has_ext_scan) {
+               struct xbss_element *bss;
+
+               list_for_each_entry(bss, &priv->bss_list, list) {
+                       /* Translate this entry to WE format */
+                       current_ev =
+                               orinoco_translate_ext_scan(dev, info,
+                                                          current_ev,
+                                                          extra + srq->length,
+                                                          &bss->bss,
+                                                          bss->last_scanned);
+
+                       /* Check if there is space for one more entry */
+                       if ((extra + srq->length - current_ev)
+                           <= IW_EV_ADDR_LEN) {
+                               /* Ask user space to try again with a
+                                * bigger buffer */
+                               err = -E2BIG;
+                               goto out;
+                       }
+               }
+
+       } else {
+               struct bss_element *bss;
+
+               list_for_each_entry(bss, &priv->bss_list, list) {
+                       /* Translate this entry to WE format */
+                       current_ev = orinoco_translate_scan(dev, info,
+                                                           current_ev,
+                                                           extra + srq->length,
+                                                           &bss->bss,
+                                                           bss->last_scanned);
+
+                       /* Check if there is space for one more entry */
+                       if ((extra + srq->length - current_ev)
+                           <= IW_EV_ADDR_LEN) {
+                               /* Ask user space to try again with a
+                                * bigger buffer */
+                               err = -E2BIG;
+                               goto out;
+                       }
                }
        }
 
@@ -4291,39 +5877,48 @@ static const struct iw_priv_args orinoco_privtab[] = {
  * Structures to export the Wireless Handlers
  */
 
+#define STD_IW_HANDLER(id, func) \
+       [IW_IOCTL_IDX(id)] = (iw_handler) func
 static const iw_handler        orinoco_handler[] = {
-       [SIOCSIWCOMMIT-SIOCIWFIRST] = (iw_handler) orinoco_ioctl_commit,
-       [SIOCGIWNAME  -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getname,
-       [SIOCSIWFREQ  -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setfreq,
-       [SIOCGIWFREQ  -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getfreq,
-       [SIOCSIWMODE  -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setmode,
-       [SIOCGIWMODE  -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getmode,
-       [SIOCSIWSENS  -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setsens,
-       [SIOCGIWSENS  -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getsens,
-       [SIOCGIWRANGE -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getiwrange,
-       [SIOCSIWSPY   -SIOCIWFIRST] = (iw_handler) iw_handler_set_spy,
-       [SIOCGIWSPY   -SIOCIWFIRST] = (iw_handler) iw_handler_get_spy,
-       [SIOCSIWTHRSPY-SIOCIWFIRST] = (iw_handler) iw_handler_set_thrspy,
-       [SIOCGIWTHRSPY-SIOCIWFIRST] = (iw_handler) iw_handler_get_thrspy,
-       [SIOCSIWAP    -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setwap,
-       [SIOCGIWAP    -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getwap,
-       [SIOCSIWSCAN  -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setscan,
-       [SIOCGIWSCAN  -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getscan,
-       [SIOCSIWESSID -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setessid,
-       [SIOCGIWESSID -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getessid,
-       [SIOCSIWNICKN -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setnick,
-       [SIOCGIWNICKN -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getnick,
-       [SIOCSIWRATE  -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setrate,
-       [SIOCGIWRATE  -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getrate,
-       [SIOCSIWRTS   -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setrts,
-       [SIOCGIWRTS   -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getrts,
-       [SIOCSIWFRAG  -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setfrag,
-       [SIOCGIWFRAG  -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getfrag,
-       [SIOCGIWRETRY -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getretry,
-       [SIOCSIWENCODE-SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setiwencode,
-       [SIOCGIWENCODE-SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getiwencode,
-       [SIOCSIWPOWER -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setpower,
-       [SIOCGIWPOWER -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getpower,
+       STD_IW_HANDLER(SIOCSIWCOMMIT,   orinoco_ioctl_commit),
+       STD_IW_HANDLER(SIOCGIWNAME,     orinoco_ioctl_getname),
+       STD_IW_HANDLER(SIOCSIWFREQ,     orinoco_ioctl_setfreq),
+       STD_IW_HANDLER(SIOCGIWFREQ,     orinoco_ioctl_getfreq),
+       STD_IW_HANDLER(SIOCSIWMODE,     orinoco_ioctl_setmode),
+       STD_IW_HANDLER(SIOCGIWMODE,     orinoco_ioctl_getmode),
+       STD_IW_HANDLER(SIOCSIWSENS,     orinoco_ioctl_setsens),
+       STD_IW_HANDLER(SIOCGIWSENS,     orinoco_ioctl_getsens),
+       STD_IW_HANDLER(SIOCGIWRANGE,    orinoco_ioctl_getiwrange),
+       STD_IW_HANDLER(SIOCSIWSPY,      iw_handler_set_spy),
+       STD_IW_HANDLER(SIOCGIWSPY,      iw_handler_get_spy),
+       STD_IW_HANDLER(SIOCSIWTHRSPY,   iw_handler_set_thrspy),
+       STD_IW_HANDLER(SIOCGIWTHRSPY,   iw_handler_get_thrspy),
+       STD_IW_HANDLER(SIOCSIWAP,       orinoco_ioctl_setwap),
+       STD_IW_HANDLER(SIOCGIWAP,       orinoco_ioctl_getwap),
+       STD_IW_HANDLER(SIOCSIWSCAN,     orinoco_ioctl_setscan),
+       STD_IW_HANDLER(SIOCGIWSCAN,     orinoco_ioctl_getscan),
+       STD_IW_HANDLER(SIOCSIWESSID,    orinoco_ioctl_setessid),
+       STD_IW_HANDLER(SIOCGIWESSID,    orinoco_ioctl_getessid),
+       STD_IW_HANDLER(SIOCSIWNICKN,    orinoco_ioctl_setnick),
+       STD_IW_HANDLER(SIOCGIWNICKN,    orinoco_ioctl_getnick),
+       STD_IW_HANDLER(SIOCSIWRATE,     orinoco_ioctl_setrate),
+       STD_IW_HANDLER(SIOCGIWRATE,     orinoco_ioctl_getrate),
+       STD_IW_HANDLER(SIOCSIWRTS,      orinoco_ioctl_setrts),
+       STD_IW_HANDLER(SIOCGIWRTS,      orinoco_ioctl_getrts),
+       STD_IW_HANDLER(SIOCSIWFRAG,     orinoco_ioctl_setfrag),
+       STD_IW_HANDLER(SIOCGIWFRAG,     orinoco_ioctl_getfrag),
+       STD_IW_HANDLER(SIOCGIWRETRY,    orinoco_ioctl_getretry),
+       STD_IW_HANDLER(SIOCSIWENCODE,   orinoco_ioctl_setiwencode),
+       STD_IW_HANDLER(SIOCGIWENCODE,   orinoco_ioctl_getiwencode),
+       STD_IW_HANDLER(SIOCSIWPOWER,    orinoco_ioctl_setpower),
+       STD_IW_HANDLER(SIOCGIWPOWER,    orinoco_ioctl_getpower),
+       STD_IW_HANDLER(SIOCSIWGENIE,    orinoco_ioctl_set_genie),
+       STD_IW_HANDLER(SIOCGIWGENIE,    orinoco_ioctl_get_genie),
+       STD_IW_HANDLER(SIOCSIWMLME,     orinoco_ioctl_set_mlme),
+       STD_IW_HANDLER(SIOCSIWAUTH,     orinoco_ioctl_set_auth),
+       STD_IW_HANDLER(SIOCGIWAUTH,     orinoco_ioctl_get_auth),
+       STD_IW_HANDLER(SIOCSIWENCODEEXT, orinoco_ioctl_set_encodeext),
+       STD_IW_HANDLER(SIOCGIWENCODEEXT, orinoco_ioctl_get_encodeext),
 };
 
 
index c6b1858abde87597f3ff64bdbd4deeb33bad9568..981570bd3b9d660b6c403840a09a1b98d4eb67c7 100644 (file)
@@ -9,6 +9,7 @@
 
 #define DRIVER_VERSION "0.15"
 
+#include <linux/interrupt.h>
 #include <linux/netdevice.h>
 #include <linux/wireless.h>
 #include <net/iw_handler.h>
@@ -30,27 +31,57 @@ struct orinoco_key {
        char data[ORINOCO_MAX_KEY_SIZE];
 } __attribute__ ((packed));
 
+#define TKIP_KEYLEN    16
+#define MIC_KEYLEN     8
+
+struct orinoco_tkip_key {
+       u8 tkip[TKIP_KEYLEN];
+       u8 tx_mic[MIC_KEYLEN];
+       u8 rx_mic[MIC_KEYLEN];
+};
+
 typedef enum {
        FIRMWARE_TYPE_AGERE,
        FIRMWARE_TYPE_INTERSIL,
        FIRMWARE_TYPE_SYMBOL
 } fwtype_t;
 
-typedef struct {
+struct bss_element {
        union hermes_scan_info bss;
        unsigned long last_scanned;
        struct list_head list;
-} bss_element;
+};
+
+struct xbss_element {
+       struct agere_ext_scan_info bss;
+       unsigned long last_scanned;
+       struct list_head list;
+};
+
+struct hermes_rx_descriptor;
+
+struct orinoco_rx_data {
+       struct hermes_rx_descriptor *desc;
+       struct sk_buff *skb;
+       struct list_head list;
+};
 
 struct orinoco_private {
        void *card;     /* Pointer to card dependent structure */
+       struct device *dev;
        int (*hard_reset)(struct orinoco_private *);
+       int (*stop_fw)(struct orinoco_private *, int);
 
        /* Synchronisation stuff */
        spinlock_t lock;
        int hw_unavailable;
        struct work_struct reset_work;
 
+       /* Interrupt tasklets */
+       struct tasklet_struct rx_tasklet;
+       struct list_head rx_list;
+       struct orinoco_rx_data *rx_data;
+
        /* driver state */
        int open;
        u16 last_linkstatus;
@@ -83,13 +114,17 @@ struct orinoco_private {
        unsigned int has_preamble:1;
        unsigned int has_sensitivity:1;
        unsigned int has_hostscan:1;
+       unsigned int has_alt_txcntl:1;
+       unsigned int has_ext_scan:1;
+       unsigned int has_wpa:1;
+       unsigned int do_fw_download:1;
        unsigned int broken_disableport:1;
        unsigned int broken_monitor:1;
 
        /* Configuration paramaters */
        u32 iw_mode;
        int prefer_port3;
-       u16 wep_on, wep_restrict, tx_key;
+       u16 encode_alg, wep_restrict, tx_key;
        struct orinoco_key keys[ORINOCO_MAX_KEYS];
        int bitratemode;
        char nick[IW_ESSID_MAX_SIZE+1];
@@ -113,10 +148,22 @@ struct orinoco_private {
        /* Scanning support */
        struct list_head bss_list;
        struct list_head bss_free_list;
-       bss_element *bss_data;
+       void *bss_xbss_data;
 
        int     scan_inprogress;        /* Scan pending... */
        u32     scan_mode;              /* Type of scan done */
+
+       /* WPA support */
+       u8 *wpa_ie;
+       int wpa_ie_len;
+
+       struct orinoco_tkip_key tkip_key[ORINOCO_MAX_KEYS];
+       struct crypto_hash *rx_tfm_mic;
+       struct crypto_hash *tx_tfm_mic;
+
+       unsigned int wpa_enabled:1;
+       unsigned int tkip_cm_active:1;
+       unsigned int key_mgmt:3;
 };
 
 #ifdef ORINOCO_DEBUG
@@ -130,8 +177,10 @@ extern int orinoco_debug;
 /* Exported prototypes                                              */
 /********************************************************************/
 
-extern struct net_device *alloc_orinocodev(int sizeof_card,
-                                          int (*hard_reset)(struct orinoco_private *));
+extern struct net_device *alloc_orinocodev(
+       int sizeof_card, struct device *device,
+       int (*hard_reset)(struct orinoco_private *),
+       int (*stop_fw)(struct orinoco_private *, int));
 extern void free_orinocodev(struct net_device *dev);
 extern int __orinoco_up(struct net_device *dev);
 extern int __orinoco_down(struct net_device *dev);
index 1c216e015f641b428fceb4c060386d9ee9e1520c..1ccf5a40cf06370afbf70817b0d76516e411236e 100644 (file)
@@ -109,7 +109,8 @@ orinoco_cs_probe(struct pcmcia_device *link)
        struct orinoco_private *priv;
        struct orinoco_pccard *card;
 
-       dev = alloc_orinocodev(sizeof(*card), orinoco_cs_hard_reset);
+       dev = alloc_orinocodev(sizeof(*card), &handle_to_dev(link),
+                              orinoco_cs_hard_reset, NULL);
        if (! dev)
                return -ENOMEM;
        priv = netdev_priv(dev);
index 35ec5fcf81a613d5d4404b92b21e38f74f3486f1..2fc86596302e6bc1adb099a3bd35373b51d5bf86 100644 (file)
@@ -182,7 +182,8 @@ static int orinoco_nortel_init_one(struct pci_dev *pdev,
        }
 
        /* Allocate network device */
-       dev = alloc_orinocodev(sizeof(*card), orinoco_nortel_cor_reset);
+       dev = alloc_orinocodev(sizeof(*card), &pdev->dev,
+                              orinoco_nortel_cor_reset, NULL);
        if (!dev) {
                printk(KERN_ERR PFX "Cannot allocate network device\n");
                err = -ENOMEM;
index 2547d5dac0d338752439e14be5db194871b5baa2..4ebd638a073ebe568e137321b7c56644d4ebf2a2 100644 (file)
@@ -139,7 +139,8 @@ static int orinoco_pci_init_one(struct pci_dev *pdev,
        }
 
        /* Allocate network device */
-       dev = alloc_orinocodev(sizeof(*card), orinoco_pci_cor_reset);
+       dev = alloc_orinocodev(sizeof(*card), &pdev->dev,
+                              orinoco_pci_cor_reset, NULL);
        if (!dev) {
                printk(KERN_ERR PFX "Cannot allocate network device\n");
                err = -ENOMEM;
index 98fe165337d1ee5330b64db71f48266116d31b4a..ef761857bb381bd15a75aacbf88b7e8207d4e419 100644 (file)
@@ -221,7 +221,8 @@ static int orinoco_plx_init_one(struct pci_dev *pdev,
        }
 
        /* Allocate network device */
-       dev = alloc_orinocodev(sizeof(*card), orinoco_plx_cor_reset);
+       dev = alloc_orinocodev(sizeof(*card), &pdev->dev,
+                              orinoco_plx_cor_reset, NULL);
        if (!dev) {
                printk(KERN_ERR PFX "Cannot allocate network device\n");
                err = -ENOMEM;
index df493185a4af65a2b815b4542fbd9f55e71904ba..ede24ec309c0f9d71a34b119376f6576dcdc97d2 100644 (file)
@@ -124,7 +124,8 @@ static int orinoco_tmd_init_one(struct pci_dev *pdev,
        }
 
        /* Allocate network device */
-       dev = alloc_orinocodev(sizeof(*card), orinoco_tmd_cor_reset);
+       dev = alloc_orinocodev(sizeof(*card), &pdev->dev,
+                              orinoco_tmd_cor_reset, NULL);
        if (!dev) {
                printk(KERN_ERR PFX "Cannot allocate network device\n");
                err = -ENOMEM;
index 4801a363507bfae7922bae530554c5de040c2e5b..10df07de9e52add9a83906eb91366bca85a6cadc 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef PRISM54_H
-#define PRISM54_H
+#ifndef P54_H
+#define P54_H
 
 /*
  * Shared defines for all mac80211 Prism54 code
@@ -76,4 +76,4 @@ void p54_fill_eeprom_readback(struct p54_control_hdr *hdr);
 struct ieee80211_hw *p54_init_common(size_t priv_data_len);
 void p54_free_common(struct ieee80211_hw *dev);
 
-#endif /* PRISM54_H */
+#endif /* P54_H */
index 8db6c0e8e540a3dda566be866621a7b94d46d3d8..9bc2a1cf4b57672b05f32c04914552a83535f4fb 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef PRISM54COMMON_H
-#define PRISM54COMMON_H
+#ifndef P54COMMON_H
+#define P54COMMON_H
 
 /*
  * Common code specific definitions for mac80211 Prism54 drivers
@@ -250,4 +250,4 @@ struct p54_tx_control_vdcf {
        __le16 frameburst;
 } __attribute__ ((packed));
 
-#endif /* PRISM54COMMON_H */
+#endif /* P54COMMON_H */
index 7dd4add4bf4e55c13efeaef04ca9e9ac4def0e07..ea2dc3d93c4d07cb389d26b702581cce47ee60d7 100644 (file)
@@ -75,7 +75,7 @@ static int p54p_upload_firmware(struct ieee80211_hw *dev)
 
        err = request_firmware(&fw_entry, "isl3886", &priv->pdev->dev);
        if (err) {
-               printk(KERN_ERR "%s (prism54pci): cannot find firmware "
+               printk(KERN_ERR "%s (p54pci): cannot find firmware "
                       "(isl3886)\n", pci_name(priv->pdev));
                return err;
        }
@@ -150,16 +150,16 @@ static int p54p_read_eeprom(struct ieee80211_hw *dev)
 
        init_completion(&priv->boot_comp);
        err = request_irq(priv->pdev->irq, &p54p_simple_interrupt,
-                         IRQF_SHARED, "prism54pci", priv);
+                         IRQF_SHARED, "p54pci", priv);
        if (err) {
-               printk(KERN_ERR "%s (prism54pci): failed to register IRQ handler\n",
+               printk(KERN_ERR "%s (p54pci): failed to register IRQ handler\n",
                       pci_name(priv->pdev));
                return err;
        }
 
        eeprom = kmalloc(0x2010 + EEPROM_READBACK_LEN, GFP_KERNEL);
        if (!eeprom) {
-               printk(KERN_ERR "%s (prism54pci): no memory for eeprom!\n",
+               printk(KERN_ERR "%s (p54pci): no memory for eeprom!\n",
                       pci_name(priv->pdev));
                err = -ENOMEM;
                goto out;
@@ -177,7 +177,7 @@ static int p54p_read_eeprom(struct ieee80211_hw *dev)
        P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_RESET));
 
        if (!wait_for_completion_interruptible_timeout(&priv->boot_comp, HZ)) {
-               printk(KERN_ERR "%s (prism54pci): Cannot boot firmware!\n",
+               printk(KERN_ERR "%s (p54pci): Cannot boot firmware!\n",
                       pci_name(priv->pdev));
                err = -EINVAL;
                goto out;
@@ -219,7 +219,7 @@ static int p54p_read_eeprom(struct ieee80211_hw *dev)
        alen = le16_to_cpu(ring_control->rx_mgmt[0].len);
        if (le32_to_cpu(ring_control->device_idx[2]) != 1 ||
            alen < 0x10) {
-               printk(KERN_ERR "%s (prism54pci): Cannot read eeprom!\n",
+               printk(KERN_ERR "%s (p54pci): Cannot read eeprom!\n",
                       pci_name(priv->pdev));
                err = -EINVAL;
                goto out;
@@ -412,7 +412,7 @@ static int p54p_open(struct ieee80211_hw *dev)
 
        init_completion(&priv->boot_comp);
        err = request_irq(priv->pdev->irq, &p54p_interrupt,
-                         IRQF_SHARED, "prism54pci", dev);
+                         IRQF_SHARED, "p54pci", dev);
        if (err) {
                printk(KERN_ERR "%s: failed to register IRQ handler\n",
                       wiphy_name(dev->wiphy));
@@ -506,7 +506,7 @@ static int __devinit p54p_probe(struct pci_dev *pdev,
 
        err = pci_enable_device(pdev);
        if (err) {
-               printk(KERN_ERR "%s (prism54pci): Cannot enable new PCI device\n",
+               printk(KERN_ERR "%s (p54pci): Cannot enable new PCI device\n",
                       pci_name(pdev));
                return err;
        }
@@ -514,22 +514,22 @@ static int __devinit p54p_probe(struct pci_dev *pdev,
        mem_addr = pci_resource_start(pdev, 0);
        mem_len = pci_resource_len(pdev, 0);
        if (mem_len < sizeof(struct p54p_csr)) {
-               printk(KERN_ERR "%s (prism54pci): Too short PCI resources\n",
+               printk(KERN_ERR "%s (p54pci): Too short PCI resources\n",
                       pci_name(pdev));
                pci_disable_device(pdev);
                return err;
        }
 
-       err = pci_request_regions(pdev, "prism54pci");
+       err = pci_request_regions(pdev, "p54pci");
        if (err) {
-               printk(KERN_ERR "%s (prism54pci): Cannot obtain PCI resources\n",
+               printk(KERN_ERR "%s (p54pci): Cannot obtain PCI resources\n",
                       pci_name(pdev));
                return err;
        }
 
        if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) ||
            pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) {
-               printk(KERN_ERR "%s (prism54pci): No suitable DMA available\n",
+               printk(KERN_ERR "%s (p54pci): No suitable DMA available\n",
                       pci_name(pdev));
                goto err_free_reg;
        }
@@ -542,7 +542,7 @@ static int __devinit p54p_probe(struct pci_dev *pdev,
 
        dev = p54_init_common(sizeof(*priv));
        if (!dev) {
-               printk(KERN_ERR "%s (prism54pci): ieee80211 alloc failed\n",
+               printk(KERN_ERR "%s (p54pci): ieee80211 alloc failed\n",
                       pci_name(pdev));
                err = -ENOMEM;
                goto err_free_reg;
@@ -556,7 +556,7 @@ static int __devinit p54p_probe(struct pci_dev *pdev,
 
        priv->map = ioremap(mem_addr, mem_len);
        if (!priv->map) {
-               printk(KERN_ERR "%s (prism54pci): Cannot map device memory\n",
+               printk(KERN_ERR "%s (p54pci): Cannot map device memory\n",
                       pci_name(pdev));
                err = -EINVAL;  // TODO: use a better error code?
                goto err_free_dev;
@@ -565,7 +565,7 @@ static int __devinit p54p_probe(struct pci_dev *pdev,
        priv->ring_control = pci_alloc_consistent(pdev, sizeof(*priv->ring_control),
                                                  &priv->ring_control_dma);
        if (!priv->ring_control) {
-               printk(KERN_ERR "%s (prism54pci): Cannot allocate rings\n",
+               printk(KERN_ERR "%s (p54pci): Cannot allocate rings\n",
                       pci_name(pdev));
                err = -ENOMEM;
                goto err_iounmap;
@@ -588,7 +588,7 @@ static int __devinit p54p_probe(struct pci_dev *pdev,
 
        err = ieee80211_register_hw(dev);
        if (err) {
-               printk(KERN_ERR "%s (prism54pci): Cannot register netdevice\n",
+               printk(KERN_ERR "%s (p54pci): Cannot register netdevice\n",
                       pci_name(pdev));
                goto err_free_common;
        }
@@ -673,7 +673,7 @@ static int p54p_resume(struct pci_dev *pdev)
 #endif /* CONFIG_PM */
 
 static struct pci_driver p54p_driver = {
-       .name           = "prism54pci",
+       .name           = "p54pci",
        .id_table       = p54p_table,
        .probe          = p54p_probe,
        .remove         = __devexit_p(p54p_remove),
index 5bedd7af385d287f8151bd1df88f2bfd8f0e9e92..07678ef5ddc83a1c1afbf505081eed0d16021f90 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef PRISM54PCI_H
-#define PRISM54PCI_H
+#ifndef P54PCI_H
+#define P54PCI_H
 
 /*
  * Defines for PCI based mac80211 Prism54 driver
@@ -68,7 +68,7 @@ struct p54p_csr {
 } __attribute__ ((packed));
 
 /* usb backend only needs the register defines above */
-#ifndef PRISM54USB_H
+#ifndef P54USB_H
 struct p54p_desc {
        __le32 host_addr;
        __le32 device_addr;
@@ -102,5 +102,5 @@ struct p54p_priv {
        struct completion boot_comp;
 };
 
-#endif /* PRISM54USB_H */
-#endif /* PRISM54PCI_H */
+#endif /* P54USB_H */
+#endif /* P54PCI_H */
index cbaca23a945353a30734a3ec5aa19e095a209a38..8a420df605af4771b7d942b4f41dce8574f6405c 100644 (file)
@@ -322,7 +322,7 @@ static int p54u_read_eeprom(struct ieee80211_hw *dev)
 
        buf = kmalloc(0x2020, GFP_KERNEL);
        if (!buf) {
-               printk(KERN_ERR "prism54usb: cannot allocate memory for "
+               printk(KERN_ERR "p54usb: cannot allocate memory for "
                       "eeprom readback!\n");
                return -ENOMEM;
        }
@@ -331,7 +331,7 @@ static int p54u_read_eeprom(struct ieee80211_hw *dev)
                *((u32 *) buf) = priv->common.rx_start;
                err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
                if (err) {
-                       printk(KERN_ERR "prism54usb: addr send failed\n");
+                       printk(KERN_ERR "p54usb: addr send failed\n");
                        goto fail;
                }
        } else {
@@ -341,7 +341,7 @@ static int p54u_read_eeprom(struct ieee80211_hw *dev)
                reg->val = cpu_to_le32(ISL38XX_DEV_INT_DATA);
                err = p54u_bulk_msg(priv, P54U_PIPE_DEV, buf, sizeof(*reg));
                if (err) {
-                       printk(KERN_ERR "prism54usb: dev_int send failed\n");
+                       printk(KERN_ERR "p54usb: dev_int send failed\n");
                        goto fail;
                }
        }
@@ -359,7 +359,7 @@ static int p54u_read_eeprom(struct ieee80211_hw *dev)
        err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf,
                            EEPROM_READBACK_LEN + priv->common.tx_hdr_len);
        if (err) {
-               printk(KERN_ERR "prism54usb: eeprom req send failed\n");
+               printk(KERN_ERR "p54usb: eeprom req send failed\n");
                goto fail;
        }
 
@@ -369,7 +369,7 @@ static int p54u_read_eeprom(struct ieee80211_hw *dev)
        if (!err && alen > offset) {
                p54_parse_eeprom(dev, (u8 *)buf + offset, alen - offset);
        } else {
-               printk(KERN_ERR "prism54usb: eeprom read failed!\n");
+               printk(KERN_ERR "p54usb: eeprom read failed!\n");
                err = -EINVAL;
                goto fail;
        }
@@ -458,7 +458,7 @@ static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
 
                err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_size);
                if (err) {
-                       printk(KERN_ERR "prism54usb: firmware upload failed!\n");
+                       printk(KERN_ERR "p54usb: firmware upload failed!\n");
                        goto err_upload_failed;
                }
 
@@ -469,7 +469,7 @@ static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
        *((__le32 *)buf) = cpu_to_le32(~crc32_le(~0, fw_entry->data, fw_entry->size));
        err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, sizeof(u32));
        if (err) {
-               printk(KERN_ERR "prism54usb: firmware upload failed!\n");
+               printk(KERN_ERR "p54usb: firmware upload failed!\n");
                goto err_upload_failed;
        }
 
@@ -480,13 +480,13 @@ static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
                        break;
 
                if (alen > 5 && !memcmp(buf, "ERROR", 5)) {
-                       printk(KERN_INFO "prism54usb: firmware upload failed!\n");
+                       printk(KERN_INFO "p54usb: firmware upload failed!\n");
                        err = -EINVAL;
                        break;
                }
 
                if (time_after(jiffies, timeout)) {
-                       printk(KERN_ERR "prism54usb: firmware boot timed out!\n");
+                       printk(KERN_ERR "p54usb: firmware boot timed out!\n");
                        err = -ETIMEDOUT;
                        break;
                }
@@ -498,7 +498,7 @@ static int p54u_upload_firmware_3887(struct ieee80211_hw *dev)
        buf[1] = '\r';
        err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, 2);
        if (err) {
-               printk(KERN_ERR "prism54usb: firmware boot failed!\n");
+               printk(KERN_ERR "p54usb: firmware boot failed!\n");
                goto err_upload_failed;
        }
 
@@ -660,7 +660,7 @@ static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
 
                err = p54u_bulk_msg(priv, P54U_PIPE_DATA, buf, block_len);
                if (err) {
-                       printk(KERN_ERR "prism54usb: firmware block upload "
+                       printk(KERN_ERR "p54usb: firmware block upload "
                               "failed\n");
                        goto fail;
                }
@@ -694,7 +694,7 @@ static int p54u_upload_firmware_net2280(struct ieee80211_hw *dev)
                          0x002C | (unsigned long)&devreg->direct_mem_win);
                if (!(reg & cpu_to_le32(ISL38XX_DMA_STATUS_DONE)) ||
                    !(reg & cpu_to_le32(ISL38XX_DMA_STATUS_READY))) {
-                       printk(KERN_ERR "prism54usb: firmware DMA transfer "
+                       printk(KERN_ERR "p54usb: firmware DMA transfer "
                               "failed\n");
                        goto fail;
                }
@@ -802,7 +802,7 @@ static int __devinit p54u_probe(struct usb_interface *intf,
 
        dev = p54_init_common(sizeof(*priv));
        if (!dev) {
-               printk(KERN_ERR "prism54usb: ieee80211 alloc failed\n");
+               printk(KERN_ERR "p54usb: ieee80211 alloc failed\n");
                return -ENOMEM;
        }
 
@@ -858,7 +858,7 @@ static int __devinit p54u_probe(struct usb_interface *intf,
        if (!is_valid_ether_addr(dev->wiphy->perm_addr)) {
                u8 perm_addr[ETH_ALEN];
 
-               printk(KERN_WARNING "prism54usb: Invalid hwaddr! Using randomly generated MAC addr\n");
+               printk(KERN_WARNING "p54usb: Invalid hwaddr! Using randomly generated MAC addr\n");
                random_ether_addr(perm_addr);
                SET_IEEE80211_PERM_ADDR(dev, perm_addr);
        }
@@ -867,7 +867,7 @@ static int __devinit p54u_probe(struct usb_interface *intf,
 
        err = ieee80211_register_hw(dev);
        if (err) {
-               printk(KERN_ERR "prism54usb: Cannot register netdevice\n");
+               printk(KERN_ERR "p54usb: Cannot register netdevice\n");
                goto err_free_dev;
        }
 
@@ -902,7 +902,7 @@ static void __devexit p54u_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver p54u_driver = {
-       .name   = "prism54usb",
+       .name   = "p54usb",
        .id_table = p54u_table,
        .probe = p54u_probe,
        .disconnect = p54u_disconnect,
index d1896b396c1c128d3285dc27026855349ae2bbd5..1baaff058c5a1dcceeb6cb87159dddd852a0b590 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef PRISM54USB_H
-#define PRISM54USB_H
+#ifndef P54USB_H
+#define P54USB_H
 
 /*
  * Defines for USB based mac80211 Prism54 driver
@@ -130,4 +130,4 @@ struct p54u_priv {
        struct sk_buff_head rx_queue;
 };
 
-#endif /* PRISM54USB_H */
+#endif /* P54USB_H */
index 3d75a7137d3cccb41f0533144c88c81a3833963a..16e68f4b654a94370433cd928c23405f4a5be950 100644 (file)
@@ -71,7 +71,7 @@ prism54_mib_mode_helper(islpci_private *priv, u32 iw_mode)
        if (iw_mode == IW_MODE_REPEAT || iw_mode == IW_MODE_SECOND) {
                printk(KERN_DEBUG
                       "%s(): Sorry, Repeater mode and Secondary mode "
-                      "are not yet supported by this driver.\n", __FUNCTION__);
+                      "are not yet supported by this driver.\n", __func__);
                return -EINVAL;
        }
 
@@ -333,7 +333,7 @@ prism54_set_mode(struct net_device *ndev, struct iw_request_info *info,
        if (*uwrq > IW_MODE_MONITOR || *uwrq < IW_MODE_AUTO) {
                printk(KERN_DEBUG
                       "%s: %s() You passed a non-valid init_mode.\n",
-                      priv->ndev->name, __FUNCTION__);
+                      priv->ndev->name, __func__);
                return -EINVAL;
        }
 
@@ -1234,7 +1234,7 @@ prism54_set_txpower(struct net_device *ndev, struct iw_request_info *info,
                /* don't know how to disable radio */
                printk(KERN_DEBUG
                       "%s: %s() disabling radio is not yet supported.\n",
-                      priv->ndev->name, __FUNCTION__);
+                      priv->ndev->name, __func__);
                return -ENOTSUPP;
        } else if (vwrq->fixed)
                /* currently only fixed value is supported */
@@ -1242,7 +1242,7 @@ prism54_set_txpower(struct net_device *ndev, struct iw_request_info *info,
        else {
                printk(KERN_DEBUG
                       "%s: %s() auto power will be implemented later.\n",
-                      priv->ndev->name, __FUNCTION__);
+                      priv->ndev->name, __func__);
                return -ENOTSUPP;
        }
 }
index d485a86bba75cb87a7c73de60ae84b4c24438773..11f590d63affe146e697b8c3c4d88243cd0469ee 100644 (file)
@@ -33,6 +33,10 @@ config RT2X00_LIB_FIRMWARE
        depends on RT2X00_LIB
        select FW_LOADER
 
+config RT2X00_LIB_CRYPTO
+       boolean
+       depends on RT2X00_LIB
+
 config RT2X00_LIB_RFKILL
        boolean
        depends on RT2X00_LIB
@@ -103,6 +107,7 @@ config RT61PCI
        depends on PCI
        select RT2X00_LIB_PCI
        select RT2X00_LIB_FIRMWARE
+       select RT2X00_LIB_CRYPTO
        select CRC_ITU_T
        select EEPROM_93CX6
        ---help---
@@ -151,6 +156,7 @@ config RT73USB
        depends on USB
        select RT2X00_LIB_USB
        select RT2X00_LIB_FIRMWARE
+       select RT2X00_LIB_CRYPTO
        select CRC_ITU_T
        ---help---
          This adds support for rt2501 wireless chipset family.
index 1087dbcf1a04b2026a9acf3bc1713b849219d1fd..917cb4f3b038948792bd241dc3c1ce3b49e130d2 100644 (file)
@@ -3,6 +3,7 @@ rt2x00lib-y                             += rt2x00mac.o
 rt2x00lib-y                            += rt2x00config.o
 rt2x00lib-y                            += rt2x00queue.o
 rt2x00lib-$(CONFIG_RT2X00_LIB_DEBUGFS) += rt2x00debug.o
+rt2x00lib-$(CONFIG_RT2X00_LIB_CRYPTO)  += rt2x00crypto.o
 rt2x00lib-$(CONFIG_RT2X00_LIB_RFKILL)  += rt2x00rfkill.o
 rt2x00lib-$(CONFIG_RT2X00_LIB_FIRMWARE)        += rt2x00firmware.o
 rt2x00lib-$(CONFIG_RT2X00_LIB_LEDS)    += rt2x00leds.o
index 4c0538d6099bb2503646d091e4a9e9a1d3417095..0107cec18b262306ad1c9026c9267a440ce60050 100644 (file)
@@ -1404,7 +1404,7 @@ static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
  * RF value list for RF2420 & RF2421
  * Supports: 2.4 GHz
  */
-static const struct rf_channel rf_vals_bg[] = {
+static const struct rf_channel rf_vals_b[] = {
        { 1,  0x00022058, 0x000c1fda, 0x00000101, 0 },
        { 2,  0x00022058, 0x000c1fee, 0x00000101, 0 },
        { 3,  0x00022058, 0x000c2002, 0x00000101, 0 },
@@ -1421,10 +1421,11 @@ static const struct rf_channel rf_vals_bg[] = {
        { 14, 0x00022058, 0x000c20fa, 0x00000101, 0 },
 };
 
-static void rt2400pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
+static int rt2400pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 {
        struct hw_mode_spec *spec = &rt2x00dev->spec;
-       u8 *txpower;
+       struct channel_info *info;
+       char *tx_power;
        unsigned int i;
 
        /*
@@ -1439,24 +1440,29 @@ static void rt2400pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
                                rt2x00_eeprom_addr(rt2x00dev,
                                                   EEPROM_MAC_ADDR_0));
 
-       /*
-        * Convert tx_power array in eeprom.
-        */
-       txpower = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_START);
-       for (i = 0; i < 14; i++)
-               txpower[i] = TXPOWER_FROM_DEV(txpower[i]);
-
        /*
         * Initialize hw_mode information.
         */
        spec->supported_bands = SUPPORT_BAND_2GHZ;
        spec->supported_rates = SUPPORT_RATE_CCK;
-       spec->tx_power_a = NULL;
-       spec->tx_power_bg = txpower;
-       spec->tx_power_default = DEFAULT_TXPOWER;
 
-       spec->num_channels = ARRAY_SIZE(rf_vals_bg);
-       spec->channels = rf_vals_bg;
+       spec->num_channels = ARRAY_SIZE(rf_vals_b);
+       spec->channels = rf_vals_b;
+
+       /*
+        * Create channel information array
+        */
+       info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
+       if (!info)
+               return -ENOMEM;
+
+       spec->channels_info = info;
+
+       tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_START);
+       for (i = 0; i < 14; i++)
+               info[i].tx_power1 = TXPOWER_FROM_DEV(tx_power[i]);
+
+       return 0;
 }
 
 static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev)
@@ -1477,7 +1483,9 @@ static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev)
        /*
         * Initialize hw specifications.
         */
-       rt2400pci_probe_hw_mode(rt2x00dev);
+       retval = rt2400pci_probe_hw_mode(rt2x00dev);
+       if (retval)
+               return retval;
 
        /*
         * This device requires the atim queue and DMA-mapped skbs.
index bc5564258228be1ef0218fe3863c91c3f3b731f5..bbff381ce3963d11e28b9b261c5c44ab88d3da5b 100644 (file)
 #define MAX_TXPOWER    62
 #define DEFAULT_TXPOWER        39
 
-#define TXPOWER_FROM_DEV(__txpower)                                    \
-({                                                                     \
-       ((__txpower) > MAX_TXPOWER) ? DEFAULT_TXPOWER - MIN_TXPOWER :   \
-       ((__txpower) < MIN_TXPOWER) ? DEFAULT_TXPOWER - MIN_TXPOWER :   \
-       (((__txpower) - MAX_TXPOWER) + MIN_TXPOWER);                    \
-})
-
-#define TXPOWER_TO_DEV(__txpower)                      \
-({                                                     \
-       (__txpower) += MIN_TXPOWER;                     \
-       ((__txpower) <= MIN_TXPOWER) ? MAX_TXPOWER :    \
-       (((__txpower) >= MAX_TXPOWER) ? MIN_TXPOWER :   \
-       (MAX_TXPOWER - ((__txpower) - MIN_TXPOWER)));   \
-})
+#define __CLAMP_TX(__txpower) \
+       clamp_t(char, (__txpower), MIN_TXPOWER, MAX_TXPOWER)
+
+#define TXPOWER_FROM_DEV(__txpower) \
+       ((__CLAMP_TX(__txpower) - MAX_TXPOWER) + MIN_TXPOWER)
+
+#define TXPOWER_TO_DEV(__txpower) \
+       MAX_TXPOWER - (__CLAMP_TX(__txpower) - MIN_TXPOWER)
 
 #endif /* RT2400PCI_H */
index 181a146b4768e229f43d70df03878777c8698b73..e0ff76ff490dd5920cbf4d4d47093f96ac9f568f 100644 (file)
@@ -1721,10 +1721,11 @@ static const struct rf_channel rf_vals_5222[] = {
        { 161, 0x00022020, 0x000090be, 0x00000101, 0x00000a07 },
 };
 
-static void rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
+static int rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 {
        struct hw_mode_spec *spec = &rt2x00dev->spec;
-       u8 *txpower;
+       struct channel_info *info;
+       char *tx_power;
        unsigned int i;
 
        /*
@@ -1740,21 +1741,11 @@ static void rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
                                rt2x00_eeprom_addr(rt2x00dev,
                                                   EEPROM_MAC_ADDR_0));
 
-       /*
-        * Convert tx_power array in eeprom.
-        */
-       txpower = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_START);
-       for (i = 0; i < 14; i++)
-               txpower[i] = TXPOWER_FROM_DEV(txpower[i]);
-
        /*
         * Initialize hw_mode information.
         */
        spec->supported_bands = SUPPORT_BAND_2GHZ;
        spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM;
-       spec->tx_power_a = NULL;
-       spec->tx_power_bg = txpower;
-       spec->tx_power_default = DEFAULT_TXPOWER;
 
        if (rt2x00_rf(&rt2x00dev->chip, RF2522)) {
                spec->num_channels = ARRAY_SIZE(rf_vals_bg_2522);
@@ -1776,6 +1767,26 @@ static void rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
                spec->num_channels = ARRAY_SIZE(rf_vals_5222);
                spec->channels = rf_vals_5222;
        }
+
+       /*
+        * Create channel information array
+        */
+       info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
+       if (!info)
+               return -ENOMEM;
+
+       spec->channels_info = info;
+
+       tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_START);
+       for (i = 0; i < 14; i++)
+               info[i].tx_power1 = TXPOWER_FROM_DEV(tx_power[i]);
+
+       if (spec->num_channels > 14) {
+               for (i = 14; i < spec->num_channels; i++)
+                       info[i].tx_power1 = DEFAULT_TXPOWER;
+       }
+
+       return 0;
 }
 
 static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev)
@@ -1796,7 +1807,9 @@ static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev)
        /*
         * Initialize hw specifications.
         */
-       rt2500pci_probe_hw_mode(rt2x00dev);
+       retval = rt2500pci_probe_hw_mode(rt2x00dev);
+       if (retval)
+               return retval;
 
        /*
         * This device requires the atim queue and DMA-mapped skbs.
index 42f376929ea9287d7471d94f254b94f089277239..8c26bef6cf49cc23d0eecafe635e20f93b89f052 100644 (file)
 #define MAX_TXPOWER    31
 #define DEFAULT_TXPOWER        24
 
-#define TXPOWER_FROM_DEV(__txpower)            \
-({                                             \
-       ((__txpower) > MAX_TXPOWER) ?           \
-               DEFAULT_TXPOWER : (__txpower);  \
-})
-
-#define TXPOWER_TO_DEV(__txpower)                      \
-({                                                     \
-       ((__txpower) <= MIN_TXPOWER) ? MIN_TXPOWER :    \
-       (((__txpower) >= MAX_TXPOWER) ? MAX_TXPOWER :   \
-       (__txpower));                                   \
-})
+#define TXPOWER_FROM_DEV(__txpower) \
+       (((u8)(__txpower)) > MAX_TXPOWER) ? DEFAULT_TXPOWER : (__txpower)
+
+#define TXPOWER_TO_DEV(__txpower) \
+       clamp_t(char, __txpower, MIN_TXPOWER, MAX_TXPOWER)
 
 #endif /* RT2500PCI_H */
index cd5af656932dda7c0a49f88d7d3b244180e56af0..3b90ed62214872e64e75e59a82d620149ca205e3 100644 (file)
@@ -1665,10 +1665,11 @@ static const struct rf_channel rf_vals_5222[] = {
        { 161, 0x00022020, 0x000090be, 0x00000101, 0x00000a07 },
 };
 
-static void rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
+static int rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 {
        struct hw_mode_spec *spec = &rt2x00dev->spec;
-       u8 *txpower;
+       struct channel_info *info;
+       char *tx_power;
        unsigned int i;
 
        /*
@@ -1686,21 +1687,11 @@ static void rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
                                rt2x00_eeprom_addr(rt2x00dev,
                                                   EEPROM_MAC_ADDR_0));
 
-       /*
-        * Convert tx_power array in eeprom.
-        */
-       txpower = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_START);
-       for (i = 0; i < 14; i++)
-               txpower[i] = TXPOWER_FROM_DEV(txpower[i]);
-
        /*
         * Initialize hw_mode information.
         */
        spec->supported_bands = SUPPORT_BAND_2GHZ;
        spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM;
-       spec->tx_power_a = NULL;
-       spec->tx_power_bg = txpower;
-       spec->tx_power_default = DEFAULT_TXPOWER;
 
        if (rt2x00_rf(&rt2x00dev->chip, RF2522)) {
                spec->num_channels = ARRAY_SIZE(rf_vals_bg_2522);
@@ -1722,6 +1713,26 @@ static void rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
                spec->num_channels = ARRAY_SIZE(rf_vals_5222);
                spec->channels = rf_vals_5222;
        }
+
+       /*
+        * Create channel information array
+        */
+       info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
+       if (!info)
+               return -ENOMEM;
+
+       spec->channels_info = info;
+
+       tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_START);
+       for (i = 0; i < 14; i++)
+               info[i].tx_power1 = TXPOWER_FROM_DEV(tx_power[i]);
+
+       if (spec->num_channels > 14) {
+               for (i = 14; i < spec->num_channels; i++)
+                       info[i].tx_power1 = DEFAULT_TXPOWER;
+       }
+
+       return 0;
 }
 
 static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev)
@@ -1742,7 +1753,9 @@ static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev)
        /*
         * Initialize hw specifications.
         */
-       rt2500usb_probe_hw_mode(rt2x00dev);
+       retval = rt2500usb_probe_hw_mode(rt2x00dev);
+       if (retval)
+               return retval;
 
        /*
         * This device requires the atim queue
index 4769ffeb4cc6ac3a577b2d62905c13ef52d3b3f2..89e5ed24e4f7906a95ae0feaacc992e022840e34 100644 (file)
 #define MAX_TXPOWER    31
 #define DEFAULT_TXPOWER        24
 
-#define TXPOWER_FROM_DEV(__txpower)            \
-({                                             \
-       ((__txpower) > MAX_TXPOWER) ?           \
-               DEFAULT_TXPOWER : (__txpower);  \
-})
-
-#define TXPOWER_TO_DEV(__txpower)                      \
-({                                                     \
-       ((__txpower) <= MIN_TXPOWER) ? MIN_TXPOWER :    \
-       (((__txpower) >= MAX_TXPOWER) ? MAX_TXPOWER :   \
-       (__txpower));                                   \
-})
+#define TXPOWER_FROM_DEV(__txpower) \
+       (((u8)(__txpower)) > MAX_TXPOWER) ? DEFAULT_TXPOWER : (__txpower)
+
+#define TXPOWER_TO_DEV(__txpower) \
+       clamp_t(char, __txpower, MIN_TXPOWER, MAX_TXPOWER)
 
 #endif /* RT2500USB_H */
index 8b10ea41b2045b802f50be50bb703730e3165169..3fa3d5b006a6b66bdc3d69700530279481e23485 100644 (file)
@@ -44,7 +44,7 @@
 /*
  * Module information.
  */
-#define DRV_VERSION    "2.1.8"
+#define DRV_VERSION    "2.2.0"
 #define DRV_PROJECT    "http://rt2x00.serialmonkey.com"
 
 /*
  */
 #define DEBUG_PRINTK_MSG(__dev, __kernlvl, __lvl, __msg, __args...)    \
        printk(__kernlvl "%s -> %s: %s - " __msg,                       \
-              wiphy_name((__dev)->hw->wiphy), __FUNCTION__, __lvl, ##__args)
+              wiphy_name((__dev)->hw->wiphy), __func__, __lvl, ##__args)
 
 #define DEBUG_PRINTK_PROBE(__kernlvl, __lvl, __msg, __args...) \
        printk(__kernlvl "%s -> %s: %s - " __msg,               \
-              KBUILD_MODNAME, __FUNCTION__, __lvl, ##__args)
+              KBUILD_MODNAME, __func__, __lvl, ##__args)
 
 #ifdef CONFIG_RT2X00_DEBUG
 #define DEBUG_PRINTK(__dev, __kernlvl, __lvl, __msg, __args...)        \
@@ -143,6 +143,17 @@ struct rf_channel {
        u32 rf4;
 };
 
+/*
+ * Channel information structure
+ */
+struct channel_info {
+       unsigned int flags;
+#define GEOGRAPHY_ALLOWED      0x00000001
+
+       short tx_power1;
+       short tx_power2;
+};
+
 /*
  * Antenna setup values.
  */
@@ -394,10 +405,7 @@ static inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif)
  * @num_channels: Number of supported channels. This is used as array size
  *     for @tx_power_a, @tx_power_bg and @channels.
  * @channels: Device/chipset specific channel values (See &struct rf_channel).
- * @tx_power_a: TX power values for all 5.2GHz channels (may be NULL).
- * @tx_power_bg: TX power values for all 2.4GHz channels (may be NULL).
- * @tx_power_default: Default TX power value to use when either
- *     @tx_power_a or @tx_power_bg is missing.
+ * @channels_info: Additional information for channels (See &struct channel_info).
  */
 struct hw_mode_spec {
        unsigned int supported_bands;
@@ -410,10 +418,7 @@ struct hw_mode_spec {
 
        unsigned int num_channels;
        const struct rf_channel *channels;
-
-       const u8 *tx_power_a;
-       const u8 *tx_power_bg;
-       u8 tx_power_default;
+       const struct channel_info *channels_info;
 };
 
 /*
@@ -425,7 +430,9 @@ struct hw_mode_spec {
  */
 struct rt2x00lib_conf {
        struct ieee80211_conf *conf;
+
        struct rf_channel rf;
+       struct channel_info channel;
 
        struct antenna_setup ant;
 
@@ -451,6 +458,23 @@ struct rt2x00lib_erp {
        int ack_consume_time;
 };
 
+/*
+ * Configuration structure for hardware encryption.
+ */
+struct rt2x00lib_crypto {
+       enum cipher cipher;
+
+       enum set_key_cmd cmd;
+       const u8 *address;
+
+       u32 bssidx;
+       u32 aid;
+
+       u8 key[16];
+       u8 tx_mic[8];
+       u8 rx_mic[8];
+};
+
 /*
  * Configuration structure wrapper around the
  * rt2x00 interface configuration handler.
@@ -547,6 +571,12 @@ struct rt2x00lib_ops {
        /*
         * Configuration handlers.
         */
+       int (*config_shared_key) (struct rt2x00_dev *rt2x00dev,
+                                 struct rt2x00lib_crypto *crypto,
+                                 struct ieee80211_key_conf *key);
+       int (*config_pairwise_key) (struct rt2x00_dev *rt2x00dev,
+                                   struct rt2x00lib_crypto *crypto,
+                                   struct ieee80211_key_conf *key);
        void (*config_filter) (struct rt2x00_dev *rt2x00dev,
                               const unsigned int filter_flags);
        void (*config_intf) (struct rt2x00_dev *rt2x00dev,
@@ -609,7 +639,7 @@ enum rt2x00_flags {
        DEVICE_DIRTY_CONFIG,
 
        /*
-        * Driver features
+        * Driver requirements
         */
        DRIVER_REQUIRE_FIRMWARE,
        DRIVER_REQUIRE_BEACON_GUARD,
@@ -618,9 +648,14 @@ enum rt2x00_flags {
        DRIVER_REQUIRE_DMA,
 
        /*
-        * Driver configuration
+        * Driver features
         */
        CONFIG_SUPPORT_HW_BUTTON,
+       CONFIG_SUPPORT_HW_CRYPTO,
+
+       /*
+        * Driver configuration
+        */
        CONFIG_FRAME_TYPE,
        CONFIG_RF_SEQUENCE,
        CONFIG_EXTERNAL_LNA_A,
@@ -768,6 +803,11 @@ struct rt2x00_dev {
         */
        u32 *rf;
 
+       /*
+        * LNA gain
+        */
+       short lna_gain;
+
        /*
         * USB Max frame size (for rt2500usb & rt73usb).
         */
@@ -966,6 +1006,13 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw,
                                unsigned int changed_flags,
                                unsigned int *total_flags,
                                int mc_count, struct dev_addr_list *mc_list);
+#ifdef CONFIG_RT2X00_LIB_CRYPTO
+int rt2x00mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
+                     const u8 *local_address, const u8 *address,
+                     struct ieee80211_key_conf *key);
+#else
+#define rt2x00mac_set_key      NULL
+#endif /* CONFIG_RT2X00_LIB_CRYPTO */
 int rt2x00mac_get_stats(struct ieee80211_hw *hw,
                        struct ieee80211_low_level_stats *stats);
 int rt2x00mac_get_tx_stats(struct ieee80211_hw *hw,
index d134c3be539a7af207ea5543b1e90e1f085ff945..ea37c79620430e0488cf7d5f24a0dbe58765a279 100644 (file)
@@ -245,6 +245,10 @@ config:
                memcpy(&libconf.rf,
                       &rt2x00dev->spec.channels[conf->channel->hw_value],
                       sizeof(libconf.rf));
+
+               memcpy(&libconf.channel,
+                      &rt2x00dev->spec.channels_info[conf->channel->hw_value],
+                      sizeof(libconf.channel));
        }
 
        if (flags & CONFIG_UPDATE_ANTENNA) {
diff --git a/drivers/net/wireless/rt2x00/rt2x00crypto.c b/drivers/net/wireless/rt2x00/rt2x00crypto.c
new file mode 100644 (file)
index 0000000..e1448cf
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+       Copyright (C) 2004 - 2008 rt2x00 SourceForge Project
+       <http://rt2x00.serialmonkey.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.
+ */
+
+/*
+       Module: rt2x00lib
+       Abstract: rt2x00 crypto specific routines.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+
+#include "rt2x00.h"
+#include "rt2x00lib.h"
+
+enum cipher rt2x00crypto_key_to_cipher(struct ieee80211_key_conf *key)
+{
+       switch (key->alg) {
+       case ALG_WEP:
+               if (key->keylen == LEN_WEP40)
+                       return CIPHER_WEP64;
+               else
+                       return CIPHER_WEP128;
+       case ALG_TKIP:
+               return CIPHER_TKIP;
+       case ALG_CCMP:
+               return CIPHER_AES;
+       default:
+               return CIPHER_NONE;
+       }
+}
+
+unsigned int rt2x00crypto_tx_overhead(struct ieee80211_tx_info *tx_info)
+{
+       struct ieee80211_key_conf *key = tx_info->control.hw_key;
+       unsigned int overhead = 0;
+
+       /*
+        * Extend frame length to include IV/EIV/ICV/MMIC,
+        * note that these lengths should only be added when
+        * mac80211 does not generate it.
+        */
+       overhead += tx_info->control.icv_len;
+
+       if (!(key->flags & IEEE80211_KEY_FLAG_GENERATE_IV))
+               overhead += tx_info->control.iv_len;
+
+       if (!(key->flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) {
+               if (key->alg == ALG_TKIP)
+                       overhead += 8;
+       }
+
+       return overhead;
+}
+
+void rt2x00crypto_tx_remove_iv(struct sk_buff *skb, unsigned int iv_len)
+{
+       struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
+       unsigned int header_length = ieee80211_get_hdrlen_from_skb(skb);
+
+       if (unlikely(!iv_len))
+               return;
+
+       /* Copy IV/EIV data */
+       if (iv_len >= 4)
+               memcpy(&skbdesc->iv, skb->data + header_length, 4);
+       if (iv_len >= 8)
+               memcpy(&skbdesc->eiv, skb->data + header_length + 4, 4);
+
+       /* Move ieee80211 header */
+       memmove(skb->data + iv_len, skb->data, header_length);
+
+       /* Pull buffer to correct size */
+       skb_pull(skb, iv_len);
+
+       /* IV/EIV data has officially be stripped */
+       skbdesc->flags |= FRAME_DESC_IV_STRIPPED;
+}
+
+void rt2x00crypto_tx_insert_iv(struct sk_buff *skb)
+{
+       struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
+       unsigned int header_length = ieee80211_get_hdrlen_from_skb(skb);
+       const unsigned int iv_len =
+           ((!!(skbdesc->iv)) * 4) + ((!!(skbdesc->eiv)) * 4);
+
+       if (!(skbdesc->flags & FRAME_DESC_IV_STRIPPED))
+               return;
+
+       skb_push(skb, iv_len);
+
+       /* Move ieee80211 header */
+       memmove(skb->data, skb->data + iv_len, header_length);
+
+       /* Copy IV/EIV data */
+       if (iv_len >= 4)
+               memcpy(skb->data + header_length, &skbdesc->iv, 4);
+       if (iv_len >= 8)
+               memcpy(skb->data + header_length + 4, &skbdesc->eiv, 4);
+
+       /* IV/EIV data has returned into the frame */
+       skbdesc->flags &= ~FRAME_DESC_IV_STRIPPED;
+}
+
+void rt2x00crypto_rx_insert_iv(struct sk_buff *skb, unsigned int align,
+                              unsigned int header_length,
+                              struct rxdone_entry_desc *rxdesc)
+{
+       unsigned int payload_len = rxdesc->size - header_length;
+       unsigned int iv_len;
+       unsigned int icv_len;
+       unsigned int transfer = 0;
+
+       /*
+        * WEP64/WEP128: Provides IV & ICV
+        * TKIP: Provides IV/EIV & ICV
+        * AES: Provies IV/EIV & ICV
+        */
+       switch (rxdesc->cipher) {
+       case CIPHER_WEP64:
+       case CIPHER_WEP128:
+               iv_len = 4;
+               icv_len = 4;
+               break;
+       case CIPHER_TKIP:
+               iv_len = 8;
+               icv_len = 4;
+               break;
+       case CIPHER_AES:
+               iv_len = 8;
+               icv_len = 8;
+               break;
+       default:
+               /* Unsupport type */
+               return;
+       }
+
+       /*
+        * Make room for new data, note that we increase both
+        * headsize and tailsize when required. The tailsize is
+        * only needed when ICV data needs to be inserted and
+        * the padding is smaller then the ICV data.
+        * When alignment requirements is greater then the
+        * ICV data we must trim the skb to the correct size
+        * because we need to remove the extra bytes.
+        */
+       skb_push(skb, iv_len + align);
+       if (align < icv_len)
+               skb_put(skb, icv_len - align);
+       else if (align > icv_len)
+               skb_trim(skb, rxdesc->size + iv_len + icv_len);
+
+       /* Move ieee80211 header */
+       memmove(skb->data + transfer,
+               skb->data + transfer + iv_len + align,
+               header_length);
+       transfer += header_length;
+
+       /* Copy IV data */
+       if (iv_len >= 4) {
+               memcpy(skb->data + transfer, &rxdesc->iv, 4);
+               transfer += 4;
+       }
+
+       /* Copy EIV data */
+       if (iv_len >= 8) {
+               memcpy(skb->data + transfer, &rxdesc->eiv, 4);
+               transfer += 4;
+       }
+
+       /* Move payload */
+       if (align) {
+               memmove(skb->data + transfer,
+                       skb->data + transfer + align,
+                       payload_len);
+       }
+
+       /*
+        * NOTE: Always count the payload as transfered,
+        * even when alignment was set to zero. This is required
+        * for determining the correct offset for the ICV data.
+        */
+       transfer += payload_len;
+
+       /* Copy ICV data */
+       if (icv_len >= 4) {
+               memcpy(skb->data + transfer, &rxdesc->icv, 4);
+               /*
+                * AES appends 8 bytes, we can't fill the upper
+                * 4 bytes, but mac80211 doesn't care about what
+                * we provide here anyway and strips it immediately.
+                */
+               transfer += icv_len;
+       }
+
+       /* IV/EIV/ICV has been inserted into frame */
+       rxdesc->size = transfer;
+       rxdesc->flags &= ~RX_FLAG_IV_STRIPPED;
+}
index 6bee1d611bbf5203ee13e33c3290592654aee0f5..5cf4c859e39d741ec6dfe4595523065ee25e5125 100644 (file)
 
 #define MAX_LINE_LENGTH 64
 
+struct rt2x00debug_crypto {
+       unsigned long success;
+       unsigned long icv_error;
+       unsigned long mic_error;
+       unsigned long key_error;
+};
+
 struct rt2x00debug_intf {
        /*
         * Pointer to driver structure where
@@ -63,6 +70,7 @@ struct rt2x00debug_intf {
         *   - queue folder
         *     - frame dump file
         *     - queue stats file
+        *     - crypto stats file
         */
        struct dentry *driver_folder;
        struct dentry *driver_entry;
@@ -80,6 +88,7 @@ struct rt2x00debug_intf {
        struct dentry *queue_folder;
        struct dentry *queue_frame_dump_entry;
        struct dentry *queue_stats_entry;
+       struct dentry *crypto_stats_entry;
 
        /*
         * The frame dump file only allows a single reader,
@@ -97,6 +106,12 @@ struct rt2x00debug_intf {
        struct sk_buff_head frame_dump_skbqueue;
        wait_queue_head_t frame_dump_waitqueue;
 
+       /*
+        * HW crypto statistics.
+        * All statistics are stored seperately per cipher type.
+        */
+       struct rt2x00debug_crypto crypto_stats[CIPHER_MAX];
+
        /*
         * Driver and chipset files will use a data buffer
         * that has been created in advance. This will simplify
@@ -114,6 +129,25 @@ struct rt2x00debug_intf {
        unsigned int offset_rf;
 };
 
+void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev,
+                              enum cipher cipher, enum rx_crypto status)
+{
+       struct rt2x00debug_intf *intf = rt2x00dev->debugfs_intf;
+
+       if (cipher == CIPHER_TKIP_NO_MIC)
+               cipher = CIPHER_TKIP;
+       if (cipher == CIPHER_NONE || cipher > CIPHER_MAX)
+               return;
+
+       /* Remove CIPHER_NONE index */
+       cipher--;
+
+       intf->crypto_stats[cipher].success += (status == RX_CRYPTO_SUCCESS);
+       intf->crypto_stats[cipher].icv_error += (status == RX_CRYPTO_FAIL_ICV);
+       intf->crypto_stats[cipher].mic_error += (status == RX_CRYPTO_FAIL_MIC);
+       intf->crypto_stats[cipher].key_error += (status == RX_CRYPTO_FAIL_KEY);
+}
+
 void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
                            enum rt2x00_dump_type type, struct sk_buff *skb)
 {
@@ -327,6 +361,59 @@ static const struct file_operations rt2x00debug_fop_queue_stats = {
        .release        = rt2x00debug_file_release,
 };
 
+#ifdef CONFIG_RT2X00_LIB_CRYPTO
+static ssize_t rt2x00debug_read_crypto_stats(struct file *file,
+                                            char __user *buf,
+                                            size_t length,
+                                            loff_t *offset)
+{
+       struct rt2x00debug_intf *intf = file->private_data;
+       char *name[] = { "WEP64", "WEP128", "TKIP", "AES" };
+       char *data;
+       char *temp;
+       size_t size;
+       unsigned int i;
+
+       if (*offset)
+               return 0;
+
+       data = kzalloc((1 + CIPHER_MAX)* MAX_LINE_LENGTH, GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       temp = data;
+       temp += sprintf(data, "cipher\tsuccess\ticv err\tmic err\tkey err\n");
+
+       for (i = 0; i < CIPHER_MAX; i++) {
+               temp += sprintf(temp, "%s\t%lu\t%lu\t%lu\t%lu\n", name[i],
+                               intf->crypto_stats[i].success,
+                               intf->crypto_stats[i].icv_error,
+                               intf->crypto_stats[i].mic_error,
+                               intf->crypto_stats[i].key_error);
+       }
+
+       size = strlen(data);
+       size = min(size, length);
+
+       if (copy_to_user(buf, data, size)) {
+               kfree(data);
+               return -EFAULT;
+       }
+
+       kfree(data);
+
+       *offset += size;
+       return size;
+}
+
+static const struct file_operations rt2x00debug_fop_crypto_stats = {
+       .owner          = THIS_MODULE,
+       .read           = rt2x00debug_read_crypto_stats,
+       .open           = rt2x00debug_file_open,
+       .release        = rt2x00debug_file_release,
+};
+#endif
+
 #define RT2X00DEBUGFS_OPS_READ(__name, __format, __type)       \
 static ssize_t rt2x00debug_read_##__name(struct file *file,    \
                                         char __user *buf,      \
@@ -569,6 +656,13 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev)
            debugfs_create_file("queue", S_IRUSR, intf->queue_folder,
                                intf, &rt2x00debug_fop_queue_stats);
 
+#ifdef CONFIG_RT2X00_LIB_CRYPTO
+       if (test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags))
+               intf->crypto_stats_entry =
+                   debugfs_create_file("crypto", S_IRUGO, intf->queue_folder,
+                                       intf, &rt2x00debug_fop_crypto_stats);
+#endif
+
        return;
 
 exit:
@@ -587,6 +681,9 @@ void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev)
 
        skb_queue_purge(&intf->frame_dump_skbqueue);
 
+#ifdef CONFIG_RT2X00_LIB_CRYPTO
+       debugfs_remove(intf->crypto_stats_entry);
+#endif
        debugfs_remove(intf->queue_stats_entry);
        debugfs_remove(intf->queue_frame_dump_entry);
        debugfs_remove(intf->queue_folder);
index f42283ad7b023b697e4aa9375b5c01557ae54f2b..328ff8bc4c16b31e324df229d1464f96ba7d308a 100644 (file)
@@ -507,6 +507,15 @@ void rt2x00lib_txdone(struct queue_entry *entry,
         */
        rt2x00queue_unmap_skb(rt2x00dev, entry->skb);
 
+       /*
+        * If the IV/EIV data was stripped from the frame before it was
+        * passed to the hardware, we should now reinsert it again because
+        * mac80211 will expect the the same data to be present it the
+        * frame as it was passed to us.
+        */
+       if (test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags))
+               rt2x00crypto_tx_insert_iv(entry->skb);
+
        /*
         * Send frame to debugfs immediately, after this call is completed
         * we are going to overwrite the skb->cb array.
@@ -585,7 +594,7 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
        struct ieee80211_supported_band *sband;
        struct ieee80211_hdr *hdr;
        const struct rt2x00_rate *rate;
-       unsigned int header_size;
+       unsigned int header_length;
        unsigned int align;
        unsigned int i;
        int idx = -1;
@@ -613,10 +622,19 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
         * The data behind the ieee80211 header must be
         * aligned on a 4 byte boundary.
         */
-       header_size = ieee80211_get_hdrlen_from_skb(entry->skb);
-       align = ((unsigned long)(entry->skb->data + header_size)) & 3;
+       header_length = ieee80211_get_hdrlen_from_skb(entry->skb);
+       align = ((unsigned long)(entry->skb->data + header_length)) & 3;
 
-       if (align) {
+       /*
+        * Hardware might have stripped the IV/EIV/ICV data,
+        * in that case it is possible that the data was
+        * provided seperately (through hardware descriptor)
+        * in which case we should reinsert the data into the frame.
+        */
+       if ((rxdesc.flags & RX_FLAG_IV_STRIPPED)) {
+               rt2x00crypto_rx_insert_iv(entry->skb, align,
+                                         header_length, &rxdesc);
+       } else if (align) {
                skb_push(entry->skb, align);
                /* Move entire frame in 1 command */
                memmove(entry->skb->data, entry->skb->data + align,
@@ -657,6 +675,10 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
            (rxdesc.dev_flags & RXDONE_MY_BSS))
                rt2x00lib_update_link_stats(&rt2x00dev->link, rxdesc.rssi);
 
+       rt2x00debug_update_crypto(rt2x00dev,
+                                 rxdesc.cipher,
+                                 rxdesc.cipher_status);
+
        rt2x00dev->link.qual.rx_success++;
 
        rx_status->mactime = rxdesc.timestamp;
@@ -796,7 +818,6 @@ static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev,
        struct ieee80211_rate *rates;
        unsigned int num_rates;
        unsigned int i;
-       unsigned char tx_power;
 
        num_rates = 0;
        if (spec->supported_rates & SUPPORT_RATE_CCK)
@@ -822,20 +843,9 @@ static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev,
         * Initialize Channel list.
         */
        for (i = 0; i < spec->num_channels; i++) {
-               if (spec->channels[i].channel <= 14) {
-                       if (spec->tx_power_bg)
-                               tx_power = spec->tx_power_bg[i];
-                       else
-                               tx_power = spec->tx_power_default;
-               } else {
-                       if (spec->tx_power_a)
-                               tx_power = spec->tx_power_a[i];
-                       else
-                               tx_power = spec->tx_power_default;
-               }
-
                rt2x00lib_channel(&channels[i],
-                                 spec->channels[i].channel, tx_power, i);
+                                 spec->channels[i].channel,
+                                 spec->channels_info[i].tx_power1, i);
        }
 
        /*
@@ -887,6 +897,8 @@ static void rt2x00lib_remove_hw(struct rt2x00_dev *rt2x00dev)
                rt2x00dev->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = NULL;
                rt2x00dev->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = NULL;
        }
+
+       kfree(rt2x00dev->spec.channels_info);
 }
 
 static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
index c5fb3a72cf37e5f0bff29c367d98d08f27536571..7bbc16b1b6c6d1083fad848cb2460342e28df60c 100644 (file)
@@ -181,6 +181,8 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev);
 void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev);
 void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
                            enum rt2x00_dump_type type, struct sk_buff *skb);
+void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev,
+                              enum cipher cipher, enum rx_crypto status);
 #else
 static inline void rt2x00debug_register(struct rt2x00_dev *rt2x00dev)
 {
@@ -195,8 +197,53 @@ static inline void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
                                          struct sk_buff *skb)
 {
 }
+
+static inline void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev,
+                                            enum cipher cipher,
+                                            enum rx_crypto status)
+{
+}
 #endif /* CONFIG_RT2X00_LIB_DEBUGFS */
 
+/*
+ * Crypto handlers.
+ */
+#ifdef CONFIG_RT2X00_LIB_CRYPTO
+enum cipher rt2x00crypto_key_to_cipher(struct ieee80211_key_conf *key);
+unsigned int rt2x00crypto_tx_overhead(struct ieee80211_tx_info *tx_info);
+void rt2x00crypto_tx_remove_iv(struct sk_buff *skb, unsigned int iv_len);
+void rt2x00crypto_tx_insert_iv(struct sk_buff *skb);
+void rt2x00crypto_rx_insert_iv(struct sk_buff *skb, unsigned int align,
+                              unsigned int header_length,
+                              struct rxdone_entry_desc *rxdesc);
+#else
+static inline enum cipher rt2x00crypto_key_to_cipher(struct ieee80211_key_conf *key)
+{
+       return CIPHER_NONE;
+}
+
+static inline unsigned int rt2x00crypto_tx_overhead(struct ieee80211_tx_info *tx_info)
+{
+       return 0;
+}
+
+static inline void rt2x00crypto_tx_remove_iv(struct sk_buff *skb,
+                                            unsigned int iv_len)
+{
+}
+
+static inline void rt2x00crypto_tx_insert_iv(struct sk_buff *skb)
+{
+}
+
+static inline void rt2x00crypto_rx_insert_iv(struct sk_buff *skb,
+                                            unsigned int align,
+                                            unsigned int header_length,
+                                            struct rxdone_entry_desc *rxdesc)
+{
+}
+#endif
+
 /*
  * RFkill handlers.
  */
index d06507388635c9080f68e034934220853776a3e1..3af42733941738f6de8782cc5dc72b6d86f6e919 100644 (file)
@@ -36,21 +36,22 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,
        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(frag_skb);
        struct ieee80211_tx_info *rts_info;
        struct sk_buff *skb;
-       int size;
+       unsigned int data_length;
+       int retval = 0;
 
        if (tx_info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT)
-               size = sizeof(struct ieee80211_cts);
+               data_length = sizeof(struct ieee80211_cts);
        else
-               size = sizeof(struct ieee80211_rts);
+               data_length = sizeof(struct ieee80211_rts);
 
-       skb = dev_alloc_skb(size + rt2x00dev->hw->extra_tx_headroom);
-       if (!skb) {
+       skb = dev_alloc_skb(data_length + rt2x00dev->hw->extra_tx_headroom);
+       if (unlikely(!skb)) {
                WARNING(rt2x00dev, "Failed to create RTS/CTS frame.\n");
-               return NETDEV_TX_BUSY;
+               return -ENOMEM;
        }
 
        skb_reserve(skb, rt2x00dev->hw->extra_tx_headroom);
-       skb_put(skb, size);
+       skb_put(skb, data_length);
 
        /*
         * Copy TX information over from original frame to
@@ -63,7 +64,6 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,
         */
        memcpy(skb->cb, frag_skb->cb, sizeof(skb->cb));
        rts_info = IEEE80211_SKB_CB(skb);
-       rts_info->control.hw_key = NULL;
        rts_info->flags &= ~IEEE80211_TX_CTL_USE_RTS_CTS;
        rts_info->flags &= ~IEEE80211_TX_CTL_USE_CTS_PROTECT;
        rts_info->flags &= ~IEEE80211_TX_CTL_REQ_TX_STATUS;
@@ -73,22 +73,33 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,
        else
                rts_info->flags &= ~IEEE80211_TX_CTL_NO_ACK;
 
+       skb->do_not_encrypt = 1;
+
+       /*
+        * RTS/CTS frame should use the length of the frame plus any
+        * encryption overhead that will be added by the hardware.
+        */
+#ifdef CONFIG_RT2X00_LIB_CRYPTO
+       if (!frag_skb->do_not_encrypt)
+               data_length += rt2x00crypto_tx_overhead(tx_info);
+#endif /* CONFIG_RT2X00_LIB_CRYPTO */
+
        if (tx_info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT)
                ieee80211_ctstoself_get(rt2x00dev->hw, tx_info->control.vif,
-                                       frag_skb->data, size, tx_info,
+                                       frag_skb->data, data_length, tx_info,
                                        (struct ieee80211_cts *)(skb->data));
        else
                ieee80211_rts_get(rt2x00dev->hw, tx_info->control.vif,
-                                 frag_skb->data, size, tx_info,
+                                 frag_skb->data, data_length, tx_info,
                                  (struct ieee80211_rts *)(skb->data));
 
-       if (rt2x00queue_write_tx_frame(queue, skb)) {
+       retval = rt2x00queue_write_tx_frame(queue, skb);
+       if (retval) {
                dev_kfree_skb_any(skb);
                WARNING(rt2x00dev, "Failed to send RTS/CTS frame.\n");
-               return NETDEV_TX_BUSY;
        }
 
-       return NETDEV_TX_OK;
+       return retval;
 }
 
 int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
@@ -106,11 +117,8 @@ int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
         * Note that we can only stop the TX queues inside the TX path
         * due to possible race conditions in mac80211.
         */
-       if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags)) {
-               ieee80211_stop_queues(hw);
-               dev_kfree_skb_any(skb);
-               return NETDEV_TX_OK;
-       }
+       if (!test_bit(DEVICE_PRESENT, &rt2x00dev->flags))
+               goto exit_fail;
 
        /*
         * Determine which queue to put packet on.
@@ -141,26 +149,25 @@ int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
        if ((tx_info->flags & (IEEE80211_TX_CTL_USE_RTS_CTS |
                               IEEE80211_TX_CTL_USE_CTS_PROTECT)) &&
            !rt2x00dev->ops->hw->set_rts_threshold) {
-               if (rt2x00queue_available(queue) <= 1) {
-                       ieee80211_stop_queue(rt2x00dev->hw, qid);
-                       return NETDEV_TX_BUSY;
-               }
-
-               if (rt2x00mac_tx_rts_cts(rt2x00dev, queue, skb)) {
-                       ieee80211_stop_queue(rt2x00dev->hw, qid);
-                       return NETDEV_TX_BUSY;
-               }
-       }
+               if (rt2x00queue_available(queue) <= 1)
+                       goto exit_fail;
 
-       if (rt2x00queue_write_tx_frame(queue, skb)) {
-               ieee80211_stop_queue(rt2x00dev->hw, qid);
-               return NETDEV_TX_BUSY;
+               if (rt2x00mac_tx_rts_cts(rt2x00dev, queue, skb))
+                       goto exit_fail;
        }
 
+       if (rt2x00queue_write_tx_frame(queue, skb))
+               goto exit_fail;
+
        if (rt2x00queue_threshold(queue))
                ieee80211_stop_queue(rt2x00dev->hw, qid);
 
        return NETDEV_TX_OK;
+
+ exit_fail:
+       ieee80211_stop_queue(rt2x00dev->hw, qid);
+       dev_kfree_skb_any(skb);
+       return NETDEV_TX_OK;
 }
 EXPORT_SYMBOL_GPL(rt2x00mac_tx);
 
@@ -467,6 +474,90 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw,
 }
 EXPORT_SYMBOL_GPL(rt2x00mac_configure_filter);
 
+#ifdef CONFIG_RT2X00_LIB_CRYPTO
+int rt2x00mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
+                     const u8 *local_address, const u8 *address,
+                     struct ieee80211_key_conf *key)
+{
+       struct rt2x00_dev *rt2x00dev = hw->priv;
+       int (*set_key) (struct rt2x00_dev *rt2x00dev,
+                       struct rt2x00lib_crypto *crypto,
+                       struct ieee80211_key_conf *key);
+       struct rt2x00lib_crypto crypto;
+
+       if (!test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags))
+               return -EOPNOTSUPP;
+       else if (key->keylen > 32)
+               return -ENOSPC;
+
+       memset(&crypto, 0, sizeof(crypto));
+
+       /*
+        * When in STA mode, bssidx is always 0 otherwise local_address[5]
+        * contains the bss number, see BSS_ID_MASK comments for details.
+        */
+       if (rt2x00dev->intf_sta_count)
+               crypto.bssidx = 0;
+       else
+               crypto.bssidx =
+                   local_address[5] & (rt2x00dev->ops->max_ap_intf - 1);
+
+       crypto.cipher = rt2x00crypto_key_to_cipher(key);
+       if (crypto.cipher == CIPHER_NONE)
+               return -EOPNOTSUPP;
+
+       crypto.cmd = cmd;
+       crypto.address = address;
+
+       if (crypto.cipher == CIPHER_TKIP) {
+               if (key->keylen > NL80211_TKIP_DATA_OFFSET_ENCR_KEY)
+                       memcpy(&crypto.key,
+                              &key->key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY],
+                              sizeof(crypto.key));
+
+               if (key->keylen > NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY)
+                       memcpy(&crypto.tx_mic,
+                              &key->key[NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY],
+                              sizeof(crypto.tx_mic));
+
+               if (key->keylen > NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY)
+                       memcpy(&crypto.rx_mic,
+                              &key->key[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY],
+                              sizeof(crypto.rx_mic));
+       } else
+               memcpy(&crypto.key, &key->key[0], key->keylen);
+
+       /*
+        * Each BSS has a maximum of 4 shared keys.
+        * Shared key index values:
+        *      0) BSS0 key0
+        *      1) BSS0 key1
+        *      ...
+        *      4) BSS1 key0
+        *      ...
+        *      8) BSS2 key0
+        *      ...
+        * Both pairwise as shared key indeces are determined by
+        * driver. This is required because the hardware requires
+        * keys to be assigned in correct order (When key 1 is
+        * provided but key 0 is not, then the key is not found
+        * by the hardware during RX).
+        */
+       key->hw_key_idx = 0;
+
+       if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
+               set_key = rt2x00dev->ops->lib->config_pairwise_key;
+       else
+               set_key = rt2x00dev->ops->lib->config_shared_key;
+
+       if (!set_key)
+               return -EOPNOTSUPP;
+
+       return set_key(rt2x00dev, &crypto, key);
+}
+EXPORT_SYMBOL_GPL(rt2x00mac_set_key);
+#endif /* CONFIG_RT2X00_LIB_CRYPTO */
+
 int rt2x00mac_get_stats(struct ieee80211_hw *hw,
                        struct ieee80211_low_level_stats *stats)
 {
index 898cdd7f57d9cc20f1898d35c40d4d04b9279034..c0f97c53e5ce5aabfb8d675142364ed376fef62f 100644 (file)
 struct sk_buff *rt2x00queue_alloc_rxskb(struct rt2x00_dev *rt2x00dev,
                                        struct queue_entry *entry)
 {
-       unsigned int frame_size;
-       unsigned int reserved_size;
        struct sk_buff *skb;
        struct skb_frame_desc *skbdesc;
+       unsigned int frame_size;
+       unsigned int head_size = 0;
+       unsigned int tail_size = 0;
 
        /*
         * The frame size includes descriptor size, because the
@@ -49,16 +50,32 @@ struct sk_buff *rt2x00queue_alloc_rxskb(struct rt2x00_dev *rt2x00dev,
         * this means we need at least 3 bytes for moving the frame
         * into the correct offset.
         */
-       reserved_size = 4;
+       head_size = 4;
+
+       /*
+        * For IV/EIV/ICV assembly we must make sure there is
+        * at least 8 bytes bytes available in headroom for IV/EIV
+        * and 4 bytes for ICV data as tailroon.
+        */
+#ifdef CONFIG_RT2X00_LIB_CRYPTO
+       if (test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags)) {
+               head_size += 8;
+               tail_size += 4;
+       }
+#endif /* CONFIG_RT2X00_LIB_CRYPTO */
 
        /*
         * Allocate skbuffer.
         */
-       skb = dev_alloc_skb(frame_size + reserved_size);
+       skb = dev_alloc_skb(frame_size + head_size + tail_size);
        if (!skb)
                return NULL;
 
-       skb_reserve(skb, reserved_size);
+       /*
+        * Make sure we not have a frame with the requested bytes
+        * available in the head and tail.
+        */
+       skb_reserve(skb, head_size);
        skb_put(skb, frame_size);
 
        /*
@@ -140,7 +157,7 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,
        txdesc->cw_max = entry->queue->cw_max;
        txdesc->aifs = entry->queue->aifs;
 
-       /* Data length should be extended with 4 bytes for CRC */
+       /* Data length + CRC + IV/EIV/ICV/MMIC (when using encryption) */
        data_length = entry->skb->len + 4;
 
        /*
@@ -149,6 +166,35 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,
        if (!(tx_info->flags & IEEE80211_TX_CTL_NO_ACK))
                __set_bit(ENTRY_TXD_ACK, &txdesc->flags);
 
+#ifdef CONFIG_RT2X00_LIB_CRYPTO
+       if (test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags) &&
+           !entry->skb->do_not_encrypt) {
+               struct ieee80211_key_conf *hw_key = tx_info->control.hw_key;
+
+               __set_bit(ENTRY_TXD_ENCRYPT, &txdesc->flags);
+
+               txdesc->cipher = rt2x00crypto_key_to_cipher(hw_key);
+
+               if (hw_key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
+                       __set_bit(ENTRY_TXD_ENCRYPT_PAIRWISE, &txdesc->flags);
+
+               txdesc->key_idx = hw_key->hw_key_idx;
+               txdesc->iv_offset = ieee80211_get_hdrlen_from_skb(entry->skb);
+
+               /*
+                * Extend frame length to include all encryption overhead
+                * that will be added by the hardware.
+                */
+               data_length += rt2x00crypto_tx_overhead(tx_info);
+
+               if (!(hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV))
+                       __set_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags);
+
+               if (!(hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_MMIC))
+                       __set_bit(ENTRY_TXD_ENCRYPT_MMIC, &txdesc->flags);
+       }
+#endif /* CONFIG_RT2X00_LIB_CRYPTO */
+
        /*
         * Check if this is a RTS/CTS frame
         */
@@ -305,6 +351,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb)
        struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX);
        struct txentry_desc txdesc;
        struct skb_frame_desc *skbdesc;
+       unsigned int iv_len = IEEE80211_SKB_CB(skb)->control.iv_len;
 
        if (unlikely(rt2x00queue_full(queue)))
                return -EINVAL;
@@ -326,15 +373,33 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb)
        rt2x00queue_create_tx_descriptor(entry, &txdesc);
 
        /*
-        * skb->cb array is now ours and we are free to use it.
+        * All information is retreived from the skb->cb array,
+        * now we should claim ownership of the driver part of that
+        * array.
         */
        skbdesc = get_skb_frame_desc(entry->skb);
        memset(skbdesc, 0, sizeof(*skbdesc));
        skbdesc->entry = entry;
 
+       /*
+        * When hardware encryption is supported, and this frame
+        * is to be encrypted, we should strip the IV/EIV data from
+        * the frame so we can provide it to the driver seperately.
+        */
+       if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc.flags) &&
+           !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc.flags))
+               rt2x00crypto_tx_remove_iv(skb, iv_len);
+
+       /*
+        * It could be possible that the queue was corrupted and this
+        * call failed. Just drop the frame, we cannot rollback and pass
+        * the frame to mac80211 because the skb->cb has now been tainted.
+        */
        if (unlikely(queue->rt2x00dev->ops->lib->write_tx_data(entry))) {
                __clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
-               return -EIO;
+               dev_kfree_skb_any(entry->skb);
+               entry->skb = NULL;
+               return 0;
        }
 
        if (test_bit(DRIVER_REQUIRE_DMA, &queue->rt2x00dev->flags))
index ff78e52ce43c2340ba910741c2ece4be764a05e0..37f3f98d58a2e8e7950cd22336663eb84941a7fe 100644 (file)
@@ -87,10 +87,13 @@ enum data_queue_qid {
  *
  * @SKBDESC_DMA_MAPPED_RX: &skb_dma field has been mapped for RX
  * @SKBDESC_DMA_MAPPED_TX: &skb_dma field has been mapped for TX
+ * @FRAME_DESC_IV_STRIPPED: Frame contained a IV/EIV provided by
+ *     mac80211 but was stripped for processing by the driver.
  */
 enum skb_frame_desc_flags {
-       SKBDESC_DMA_MAPPED_RX = (1 << 0),
-       SKBDESC_DMA_MAPPED_TX = (1 << 1),
+       SKBDESC_DMA_MAPPED_RX = 1 << 0,
+       SKBDESC_DMA_MAPPED_TX = 1 << 1,
+       FRAME_DESC_IV_STRIPPED = 1 << 2,
 };
 
 /**
@@ -104,6 +107,8 @@ enum skb_frame_desc_flags {
  * @desc: Pointer to descriptor part of the frame.
  *     Note that this pointer could point to something outside
  *     of the scope of the skb->data pointer.
+ * @iv: IV data used during encryption/decryption.
+ * @eiv: EIV data used during encryption/decryption.
  * @skb_dma: (PCI-only) the DMA address associated with the sk buffer.
  * @entry: The entry to which this sk buffer belongs.
  */
@@ -113,6 +118,9 @@ struct skb_frame_desc {
        unsigned int desc_len;
        void *desc;
 
+       __le32 iv;
+       __le32 eiv;
+
        dma_addr_t skb_dma;
 
        struct queue_entry *entry;
@@ -152,7 +160,11 @@ enum rxdone_entry_desc_flags {
  * @size: Data size of the received frame.
  * @flags: MAC80211 receive flags (See &enum mac80211_rx_flags).
  * @dev_flags: Ralink receive flags (See &enum rxdone_entry_desc_flags).
-
+ * @cipher: Cipher type used during decryption.
+ * @cipher_status: Decryption status.
+ * @iv: IV data used during decryption.
+ * @eiv: EIV data used during decryption.
+ * @icv: ICV data used during decryption.
  */
 struct rxdone_entry_desc {
        u64 timestamp;
@@ -161,6 +173,12 @@ struct rxdone_entry_desc {
        int size;
        int flags;
        int dev_flags;
+       u8 cipher;
+       u8 cipher_status;
+
+       __le32 iv;
+       __le32 eiv;
+       __le32 icv;
 };
 
 /**
@@ -206,6 +224,10 @@ struct txdone_entry_desc {
  * @ENTRY_TXD_BURST: This frame belongs to the same burst event.
  * @ENTRY_TXD_ACK: An ACK is required for this frame.
  * @ENTRY_TXD_RETRY_MODE: When set, the long retry count is used.
+ * @ENTRY_TXD_ENCRYPT: This frame should be encrypted.
+ * @ENTRY_TXD_ENCRYPT_PAIRWISE: Use pairwise key table (instead of shared).
+ * @ENTRY_TXD_ENCRYPT_IV: Generate IV/EIV in hardware.
+ * @ENTRY_TXD_ENCRYPT_MMIC: Generate MIC in hardware.
  */
 enum txentry_desc_flags {
        ENTRY_TXD_RTS_FRAME,
@@ -218,6 +240,10 @@ enum txentry_desc_flags {
        ENTRY_TXD_BURST,
        ENTRY_TXD_ACK,
        ENTRY_TXD_RETRY_MODE,
+       ENTRY_TXD_ENCRYPT,
+       ENTRY_TXD_ENCRYPT_PAIRWISE,
+       ENTRY_TXD_ENCRYPT_IV,
+       ENTRY_TXD_ENCRYPT_MMIC,
 };
 
 /**
@@ -236,6 +262,9 @@ enum txentry_desc_flags {
  * @ifs: IFS value.
  * @cw_min: cwmin value.
  * @cw_max: cwmax value.
+ * @cipher: Cipher type used for encryption.
+ * @key_idx: Key index used for encryption.
+ * @iv_offset: Position where IV should be inserted by hardware.
  */
 struct txentry_desc {
        unsigned long flags;
@@ -252,6 +281,10 @@ struct txentry_desc {
        short ifs;
        short cw_min;
        short cw_max;
+
+       enum cipher cipher;
+       u16 key_idx;
+       u16 iv_offset;
 };
 
 /**
@@ -484,25 +517,51 @@ static inline int rt2x00queue_threshold(struct data_queue *queue)
 }
 
 /**
- * rt2x00_desc_read - Read a word from the hardware descriptor.
+ * _rt2x00_desc_read - Read a word from the hardware descriptor.
+ * @desc: Base descriptor address
+ * @word: Word index from where the descriptor should be read.
+ * @value: Address where the descriptor value should be written into.
+ */
+static inline void _rt2x00_desc_read(__le32 *desc, const u8 word, __le32 *value)
+{
+       *value = desc[word];
+}
+
+/**
+ * rt2x00_desc_read - Read a word from the hardware descriptor, this
+ * function will take care of the byte ordering.
  * @desc: Base descriptor address
  * @word: Word index from where the descriptor should be read.
  * @value: Address where the descriptor value should be written into.
  */
 static inline void rt2x00_desc_read(__le32 *desc, const u8 word, u32 *value)
 {
-       *value = le32_to_cpu(desc[word]);
+       __le32 tmp;
+       _rt2x00_desc_read(desc, word, &tmp);
+       *value = le32_to_cpu(tmp);
+}
+
+/**
+ * rt2x00_desc_write - write a word to the hardware descriptor, this
+ * function will take care of the byte ordering.
+ * @desc: Base descriptor address
+ * @word: Word index from where the descriptor should be written.
+ * @value: Value that should be written into the descriptor.
+ */
+static inline void _rt2x00_desc_write(__le32 *desc, const u8 word, __le32 value)
+{
+       desc[word] = value;
 }
 
 /**
- * rt2x00_desc_write - wrote a word to the hardware descriptor.
+ * rt2x00_desc_write - write a word to the hardware descriptor.
  * @desc: Base descriptor address
  * @word: Word index from where the descriptor should be written.
  * @value: Value that should be written into the descriptor.
  */
 static inline void rt2x00_desc_write(__le32 *desc, const u8 word, u32 value)
 {
-       desc[word] = cpu_to_le32(value);
+       _rt2x00_desc_write(desc, word, cpu_to_le32(value));
 }
 
 #endif /* RT2X00QUEUE_H */
index 7e88ce5651b95041f35fde0a8ec682b09ca091eb..6d5acf99a1c553890ec059551ea0926dc7ace499 100644 (file)
 #ifndef RT2X00REG_H
 #define RT2X00REG_H
 
+/*
+ * RX crypto status
+ */
+enum rx_crypto {
+       RX_CRYPTO_SUCCESS = 0,
+       RX_CRYPTO_FAIL_ICV = 1,
+       RX_CRYPTO_FAIL_MIC = 2,
+       RX_CRYPTO_FAIL_KEY = 3,
+};
+
 /*
  * Antenna values
  */
@@ -104,7 +114,14 @@ enum cipher {
  */
        CIPHER_CKIP64 = 5,
        CIPHER_CKIP128 = 6,
-       CIPHER_TKIP_NO_MIC = 7,
+       CIPHER_TKIP_NO_MIC = 7, /* Don't send to device */
+
+/*
+ * Max cipher type.
+ * Note that CIPHER_NONE isn't counted, and CKIP64 and CKIP128
+ * are excluded due to limitations in mac80211.
+ */
+       CIPHER_MAX = 4,
 };
 
 /*
index 087e90b328cd285dfbda2837a807ca243d1fe788..23cf93dfda0603c4150feadbe004f5e7a3b71ef5 100644 (file)
 #include "rt2x00pci.h"
 #include "rt61pci.h"
 
+/*
+ * Allow hardware encryption to be disabled.
+ */
+static int modparam_nohwcrypt = 0;
+module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO);
+MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");
+
 /*
  * Register access.
  * BBP and RF register require indirect register access,
@@ -346,6 +353,204 @@ static void rt61pci_init_led(struct rt2x00_dev *rt2x00dev,
 /*
  * Configuration handlers.
  */
+static int rt61pci_config_shared_key(struct rt2x00_dev *rt2x00dev,
+                                    struct rt2x00lib_crypto *crypto,
+                                    struct ieee80211_key_conf *key)
+{
+       struct hw_key_entry key_entry;
+       struct rt2x00_field32 field;
+       u32 mask;
+       u32 reg;
+
+       if (crypto->cmd == SET_KEY) {
+               /*
+                * rt2x00lib can't determine the correct free
+                * key_idx for shared keys. We have 1 register
+                * with key valid bits. The goal is simple, read
+                * the register, if that is full we have no slots
+                * left.
+                * Note that each BSS is allowed to have up to 4
+                * shared keys, so put a mask over the allowed
+                * entries.
+                */
+               mask = (0xf << crypto->bssidx);
+
+               rt2x00pci_register_read(rt2x00dev, SEC_CSR0, &reg);
+               reg &= mask;
+
+               if (reg && reg == mask)
+                       return -ENOSPC;
+
+               key->hw_key_idx += reg ? (ffz(reg) - 1) : 0;
+
+               /*
+                * Upload key to hardware
+                */
+               memcpy(key_entry.key, crypto->key,
+                      sizeof(key_entry.key));
+               memcpy(key_entry.tx_mic, crypto->tx_mic,
+                      sizeof(key_entry.tx_mic));
+               memcpy(key_entry.rx_mic, crypto->rx_mic,
+                      sizeof(key_entry.rx_mic));
+
+               reg = SHARED_KEY_ENTRY(key->hw_key_idx);
+               rt2x00pci_register_multiwrite(rt2x00dev, reg,
+                                             &key_entry, sizeof(key_entry));
+
+               /*
+                * The cipher types are stored over 2 registers.
+                * bssidx 0 and 1 keys are stored in SEC_CSR1 and
+                * bssidx 1 and 2 keys are stored in SEC_CSR5.
+                * Using the correct defines correctly will cause overhead,
+                * so just calculate the correct offset.
+                */
+               if (key->hw_key_idx < 8) {
+                       field.bit_offset = (3 * key->hw_key_idx);
+                       field.bit_mask = 0x7 << field.bit_offset;
+
+                       rt2x00pci_register_read(rt2x00dev, SEC_CSR1, &reg);
+                       rt2x00_set_field32(&reg, field, crypto->cipher);
+                       rt2x00pci_register_write(rt2x00dev, SEC_CSR1, reg);
+               } else {
+                       field.bit_offset = (3 * (key->hw_key_idx - 8));
+                       field.bit_mask = 0x7 << field.bit_offset;
+
+                       rt2x00pci_register_read(rt2x00dev, SEC_CSR5, &reg);
+                       rt2x00_set_field32(&reg, field, crypto->cipher);
+                       rt2x00pci_register_write(rt2x00dev, SEC_CSR5, reg);
+               }
+
+               /*
+                * The driver does not support the IV/EIV generation
+                * in hardware. However it doesn't support the IV/EIV
+                * inside the ieee80211 frame either, but requires it
+                * to be provided seperately for the descriptor.
+                * rt2x00lib will cut the IV/EIV data out of all frames
+                * given to us by mac80211, but we must tell mac80211
+                * to generate the IV/EIV data.
+                */
+               key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
+       }
+
+       /*
+        * SEC_CSR0 contains only single-bit fields to indicate
+        * a particular key is valid. Because using the FIELD32()
+        * defines directly will cause a lot of overhead we use
+        * a calculation to determine the correct bit directly.
+        */
+       mask = 1 << key->hw_key_idx;
+
+       rt2x00pci_register_read(rt2x00dev, SEC_CSR0, &reg);
+       if (crypto->cmd == SET_KEY)
+               reg |= mask;
+       else if (crypto->cmd == DISABLE_KEY)
+               reg &= ~mask;
+       rt2x00pci_register_write(rt2x00dev, SEC_CSR0, reg);
+
+       return 0;
+}
+
+static int rt61pci_config_pairwise_key(struct rt2x00_dev *rt2x00dev,
+                                      struct rt2x00lib_crypto *crypto,
+                                      struct ieee80211_key_conf *key)
+{
+       struct hw_pairwise_ta_entry addr_entry;
+       struct hw_key_entry key_entry;
+       u32 mask;
+       u32 reg;
+
+       if (crypto->cmd == SET_KEY) {
+               /*
+                * rt2x00lib can't determine the correct free
+                * key_idx for pairwise keys. We have 2 registers
+                * with key valid bits. The goal is simple, read
+                * the first register, if that is full move to
+                * the next register.
+                * When both registers are full, we drop the key,
+                * otherwise we use the first invalid entry.
+                */
+               rt2x00pci_register_read(rt2x00dev, SEC_CSR2, &reg);
+               if (reg && reg == ~0) {
+                       key->hw_key_idx = 32;
+                       rt2x00pci_register_read(rt2x00dev, SEC_CSR3, &reg);
+                       if (reg && reg == ~0)
+                               return -ENOSPC;
+               }
+
+               key->hw_key_idx += reg ? (ffz(reg) - 1) : 0;
+
+               /*
+                * Upload key to hardware
+                */
+               memcpy(key_entry.key, crypto->key,
+                      sizeof(key_entry.key));
+               memcpy(key_entry.tx_mic, crypto->tx_mic,
+                      sizeof(key_entry.tx_mic));
+               memcpy(key_entry.rx_mic, crypto->rx_mic,
+                      sizeof(key_entry.rx_mic));
+
+               memset(&addr_entry, 0, sizeof(addr_entry));
+               memcpy(&addr_entry, crypto->address, ETH_ALEN);
+               addr_entry.cipher = crypto->cipher;
+
+               reg = PAIRWISE_KEY_ENTRY(key->hw_key_idx);
+               rt2x00pci_register_multiwrite(rt2x00dev, reg,
+                                             &key_entry, sizeof(key_entry));
+
+               reg = PAIRWISE_TA_ENTRY(key->hw_key_idx);
+               rt2x00pci_register_multiwrite(rt2x00dev, reg,
+                                             &addr_entry, sizeof(addr_entry));
+
+               /*
+                * Enable pairwise lookup table for given BSS idx,
+                * without this received frames will not be decrypted
+                * by the hardware.
+                */
+               rt2x00pci_register_read(rt2x00dev, SEC_CSR4, &reg);
+               reg |= (1 << crypto->bssidx);
+               rt2x00pci_register_write(rt2x00dev, SEC_CSR4, reg);
+
+               /*
+                * The driver does not support the IV/EIV generation
+                * in hardware. However it doesn't support the IV/EIV
+                * inside the ieee80211 frame either, but requires it
+                * to be provided seperately for the descriptor.
+                * rt2x00lib will cut the IV/EIV data out of all frames
+                * given to us by mac80211, but we must tell mac80211
+                * to generate the IV/EIV data.
+                */
+               key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
+       }
+
+       /*
+        * SEC_CSR2 and SEC_CSR3 contain only single-bit fields to indicate
+        * a particular key is valid. Because using the FIELD32()
+        * defines directly will cause a lot of overhead we use
+        * a calculation to determine the correct bit directly.
+        */
+       if (key->hw_key_idx < 32) {
+               mask = 1 << key->hw_key_idx;
+
+               rt2x00pci_register_read(rt2x00dev, SEC_CSR2, &reg);
+               if (crypto->cmd == SET_KEY)
+                       reg |= mask;
+               else if (crypto->cmd == DISABLE_KEY)
+                       reg &= ~mask;
+               rt2x00pci_register_write(rt2x00dev, SEC_CSR2, reg);
+       } else {
+               mask = 1 << (key->hw_key_idx - 32);
+
+               rt2x00pci_register_read(rt2x00dev, SEC_CSR3, &reg);
+               if (crypto->cmd == SET_KEY)
+                       reg |= mask;
+               else if (crypto->cmd == DISABLE_KEY)
+                       reg &= ~mask;
+               rt2x00pci_register_write(rt2x00dev, SEC_CSR3, reg);
+       }
+
+       return 0;
+}
+
 static void rt61pci_config_filter(struct rt2x00_dev *rt2x00dev,
                                  const unsigned int filter_flags)
 {
@@ -440,6 +645,30 @@ static void rt61pci_config_erp(struct rt2x00_dev *rt2x00dev,
        rt2x00pci_register_write(rt2x00dev, TXRX_CSR4, reg);
 }
 
+
+static void rt61pci_config_lna_gain(struct rt2x00_dev *rt2x00dev,
+                                   struct rt2x00lib_conf *libconf)
+{
+       u16 eeprom;
+       short lna_gain = 0;
+
+       if (libconf->band == IEEE80211_BAND_2GHZ) {
+               if (test_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags))
+                       lna_gain += 14;
+
+               rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_BG, &eeprom);
+               lna_gain -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_BG_1);
+       } else {
+               if (test_bit(CONFIG_EXTERNAL_LNA_A, &rt2x00dev->flags))
+                       lna_gain += 14;
+
+               rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_A, &eeprom);
+               lna_gain -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_A_1);
+       }
+
+       rt2x00dev->lna_gain = lna_gain;
+}
+
 static void rt61pci_config_phymode(struct rt2x00_dev *rt2x00dev,
                                   const int basic_rate_mask)
 {
@@ -758,6 +987,9 @@ static void rt61pci_config(struct rt2x00_dev *rt2x00dev,
                           struct rt2x00lib_conf *libconf,
                           const unsigned int flags)
 {
+       /* Always recalculate LNA gain before changing configuration */
+       rt61pci_config_lna_gain(rt2x00dev, libconf);
+
        if (flags & CONFIG_UPDATE_PHYMODE)
                rt61pci_config_phymode(rt2x00dev, libconf->basic_rates);
        if (flags & CONFIG_UPDATE_CHANNEL)
@@ -1533,8 +1765,8 @@ static int rt61pci_set_device_state(struct rt2x00_dev *rt2x00dev,
  * TX descriptor initialization
  */
 static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
-                                   struct sk_buff *skb,
-                                   struct txentry_desc *txdesc)
+                                 struct sk_buff *skb,
+                                 struct txentry_desc *txdesc)
 {
        struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
        __le32 *txd = skbdesc->desc;
@@ -1548,7 +1780,7 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
        rt2x00_set_field32(&word, TXD_W1_AIFSN, txdesc->aifs);
        rt2x00_set_field32(&word, TXD_W1_CWMIN, txdesc->cw_min);
        rt2x00_set_field32(&word, TXD_W1_CWMAX, txdesc->cw_max);
-       rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, IEEE80211_HEADER);
+       rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, txdesc->iv_offset);
        rt2x00_set_field32(&word, TXD_W1_HW_SEQUENCE,
                           test_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags));
        rt2x00_set_field32(&word, TXD_W1_BUFFER_COUNT, 1);
@@ -1561,6 +1793,11 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
        rt2x00_set_field32(&word, TXD_W2_PLCP_LENGTH_HIGH, txdesc->length_high);
        rt2x00_desc_write(txd, 2, word);
 
+       if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc->flags)) {
+               _rt2x00_desc_write(txd, 3, skbdesc->iv);
+               _rt2x00_desc_write(txd, 4, skbdesc->eiv);
+       }
+
        rt2x00_desc_read(txd, 5, &word);
        rt2x00_set_field32(&word, TXD_W5_PID_TYPE, skbdesc->entry->queue->qid);
        rt2x00_set_field32(&word, TXD_W5_PID_SUBTYPE,
@@ -1595,11 +1832,15 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
        rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs);
        rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
                           test_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags));
-       rt2x00_set_field32(&word, TXD_W0_TKIP_MIC, 0);
+       rt2x00_set_field32(&word, TXD_W0_TKIP_MIC,
+                          test_bit(ENTRY_TXD_ENCRYPT_MMIC, &txdesc->flags));
+       rt2x00_set_field32(&word, TXD_W0_KEY_TABLE,
+                          test_bit(ENTRY_TXD_ENCRYPT_PAIRWISE, &txdesc->flags));
+       rt2x00_set_field32(&word, TXD_W0_KEY_INDEX, txdesc->key_idx);
        rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, skb->len);
        rt2x00_set_field32(&word, TXD_W0_BURST,
                           test_bit(ENTRY_TXD_BURST, &txdesc->flags));
-       rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, CIPHER_NONE);
+       rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, txdesc->cipher);
        rt2x00_desc_write(txd, 0, word);
 }
 
@@ -1676,40 +1917,27 @@ static void rt61pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
  */
 static int rt61pci_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1)
 {
-       u16 eeprom;
-       u8 offset;
+       u8 offset = rt2x00dev->lna_gain;
        u8 lna;
 
        lna = rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_LNA);
        switch (lna) {
        case 3:
-               offset = 90;
+               offset += 90;
                break;
        case 2:
-               offset = 74;
+               offset += 74;
                break;
        case 1:
-               offset = 64;
+               offset += 64;
                break;
        default:
                return 0;
        }
 
        if (rt2x00dev->rx_status.band == IEEE80211_BAND_5GHZ) {
-               if (test_bit(CONFIG_EXTERNAL_LNA_A, &rt2x00dev->flags))
-                       offset += 14;
-
                if (lna == 3 || lna == 2)
                        offset += 10;
-
-               rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_A, &eeprom);
-               offset -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_A_1);
-       } else {
-               if (test_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags))
-                       offset += 14;
-
-               rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_BG, &eeprom);
-               offset -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_BG_1);
        }
 
        return rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_AGC) * 2 - offset;
@@ -1718,6 +1946,7 @@ static int rt61pci_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1)
 static void rt61pci_fill_rxdone(struct queue_entry *entry,
                                struct rxdone_entry_desc *rxdesc)
 {
+       struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
        struct queue_entry_priv_pci *entry_priv = entry->priv_data;
        u32 word0;
        u32 word1;
@@ -1728,6 +1957,38 @@ static void rt61pci_fill_rxdone(struct queue_entry *entry,
        if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR))
                rxdesc->flags |= RX_FLAG_FAILED_FCS_CRC;
 
+       if (test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags)) {
+               rxdesc->cipher =
+                   rt2x00_get_field32(word0, RXD_W0_CIPHER_ALG);
+               rxdesc->cipher_status =
+                   rt2x00_get_field32(word0, RXD_W0_CIPHER_ERROR);
+       }
+
+       if (rxdesc->cipher != CIPHER_NONE) {
+               _rt2x00_desc_read(entry_priv->desc, 2, &rxdesc->iv);
+               _rt2x00_desc_read(entry_priv->desc, 3, &rxdesc->eiv);
+               _rt2x00_desc_read(entry_priv->desc, 4, &rxdesc->icv);
+
+               /*
+                * Hardware has stripped IV/EIV data from 802.11 frame during
+                * decryption. It has provided the data seperately but rt2x00lib
+                * should decide if it should be reinserted.
+                */
+               rxdesc->flags |= RX_FLAG_IV_STRIPPED;
+
+               /*
+                * FIXME: Legacy driver indicates that the frame does
+                * contain the Michael Mic. Unfortunately, in rt2x00
+                * the MIC seems to be missing completely...
+                */
+               rxdesc->flags |= RX_FLAG_MMIC_STRIPPED;
+
+               if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS)
+                       rxdesc->flags |= RX_FLAG_DECRYPTED;
+               else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC)
+                       rxdesc->flags |= RX_FLAG_MMIC_ERROR;
+       }
+
        /*
         * Obtain the status about this packet.
         * When frame was received with an OFDM bitrate,
@@ -1735,7 +1996,7 @@ static void rt61pci_fill_rxdone(struct queue_entry *entry,
         * a CCK bitrate the signal is the rate in 100kbit/s.
         */
        rxdesc->signal = rt2x00_get_field32(word1, RXD_W1_SIGNAL);
-       rxdesc->rssi = rt61pci_agc_to_rssi(entry->queue->rt2x00dev, word1);
+       rxdesc->rssi = rt61pci_agc_to_rssi(rt2x00dev, word1);
        rxdesc->size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
 
        if (rt2x00_get_field32(word0, RXD_W0_OFDM))
@@ -2274,10 +2535,11 @@ static const struct rf_channel rf_vals_seq[] = {
        { 46, 0x00002ccc, 0x000049a6, 0x0009be55, 0x000c0a23 },
 };
 
-static void rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
+static int rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 {
        struct hw_mode_spec *spec = &rt2x00dev->spec;
-       u8 *txpower;
+       struct channel_info *info;
+       char *tx_power;
        unsigned int i;
 
        /*
@@ -2293,21 +2555,11 @@ static void rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
                                rt2x00_eeprom_addr(rt2x00dev,
                                                   EEPROM_MAC_ADDR_0));
 
-       /*
-        * Convert tx_power array in eeprom.
-        */
-       txpower = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_G_START);
-       for (i = 0; i < 14; i++)
-               txpower[i] = TXPOWER_FROM_DEV(txpower[i]);
-
        /*
         * Initialize hw_mode information.
         */
        spec->supported_bands = SUPPORT_BAND_2GHZ;
        spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM;
-       spec->tx_power_a = NULL;
-       spec->tx_power_bg = txpower;
-       spec->tx_power_default = DEFAULT_TXPOWER;
 
        if (!test_bit(CONFIG_RF_SEQUENCE, &rt2x00dev->flags)) {
                spec->num_channels = 14;
@@ -2321,13 +2573,28 @@ static void rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
            rt2x00_rf(&rt2x00dev->chip, RF5325)) {
                spec->supported_bands |= SUPPORT_BAND_5GHZ;
                spec->num_channels = ARRAY_SIZE(rf_vals_seq);
+       }
+
+       /*
+        * Create channel information array
+        */
+       info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
+       if (!info)
+               return -ENOMEM;
+
+       spec->channels_info = info;
 
-               txpower = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A_START);
-               for (i = 0; i < 14; i++)
-                       txpower[i] = TXPOWER_FROM_DEV(txpower[i]);
+       tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_G_START);
+       for (i = 0; i < 14; i++)
+               info[i].tx_power1 = TXPOWER_FROM_DEV(tx_power[i]);
 
-               spec->tx_power_a = txpower;
+       if (spec->num_channels > 14) {
+               tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A_START);
+               for (i = 14; i < spec->num_channels; i++)
+                       info[i].tx_power1 = TXPOWER_FROM_DEV(tx_power[i]);
        }
+
+       return 0;
 }
 
 static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev)
@@ -2348,13 +2615,17 @@ static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev)
        /*
         * Initialize hw specifications.
         */
-       rt61pci_probe_hw_mode(rt2x00dev);
+       retval = rt61pci_probe_hw_mode(rt2x00dev);
+       if (retval)
+               return retval;
 
        /*
         * This device requires firmware and DMA mapped skbs.
         */
        __set_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags);
        __set_bit(DRIVER_REQUIRE_DMA, &rt2x00dev->flags);
+       if (!modparam_nohwcrypt)
+               __set_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags);
 
        /*
         * Set the rssi offset.
@@ -2404,6 +2675,7 @@ static const struct ieee80211_ops rt61pci_mac80211_ops = {
        .config                 = rt2x00mac_config,
        .config_interface       = rt2x00mac_config_interface,
        .configure_filter       = rt2x00mac_configure_filter,
+       .set_key                = rt2x00mac_set_key,
        .get_stats              = rt2x00mac_get_stats,
        .set_retry_limit        = rt61pci_set_retry_limit,
        .bss_info_changed       = rt2x00mac_bss_info_changed,
@@ -2432,6 +2704,8 @@ static const struct rt2x00lib_ops rt61pci_rt2x00_ops = {
        .write_beacon           = rt61pci_write_beacon,
        .kick_tx_queue          = rt61pci_kick_tx_queue,
        .fill_rxdone            = rt61pci_fill_rxdone,
+       .config_shared_key      = rt61pci_config_shared_key,
+       .config_pairwise_key    = rt61pci_config_pairwise_key,
        .config_filter          = rt61pci_config_filter,
        .config_intf            = rt61pci_config_intf,
        .config_erp             = rt61pci_config_erp,
index 1004d5b899e639edff1d081a4fe756772b24a2a7..8ec1451308ccea2700ce05e03f0be2229a3c2779 100644 (file)
 #define PAIRWISE_KEY_TABLE_BASE                0x1200
 #define PAIRWISE_TA_TABLE_BASE         0x1a00
 
+#define SHARED_KEY_ENTRY(__idx) \
+       ( SHARED_KEY_TABLE_BASE + \
+               ((__idx) * sizeof(struct hw_key_entry)) )
+#define PAIRWISE_KEY_ENTRY(__idx) \
+       ( PAIRWISE_KEY_TABLE_BASE + \
+               ((__idx) * sizeof(struct hw_key_entry)) )
+#define PAIRWISE_TA_ENTRY(__idx) \
+       ( PAIRWISE_TA_TABLE_BASE + \
+               ((__idx) * sizeof(struct hw_pairwise_ta_entry)) )
+
 struct hw_key_entry {
        u8 key[16];
        u8 tx_mic[8];
@@ -142,7 +152,8 @@ struct hw_key_entry {
 
 struct hw_pairwise_ta_entry {
        u8 address[6];
-       u8 reserved[2];
+       u8 cipher;
+       u8 reserved;
 } __attribute__ ((packed));
 
 /*
@@ -662,6 +673,10 @@ struct hw_pairwise_ta_entry {
  * SEC_CSR4: Pairwise key table lookup control.
  */
 #define SEC_CSR4                       0x30b0
+#define SEC_CSR4_ENABLE_BSS0           FIELD32(0x00000001)
+#define SEC_CSR4_ENABLE_BSS1           FIELD32(0x00000002)
+#define SEC_CSR4_ENABLE_BSS2           FIELD32(0x00000004)
+#define SEC_CSR4_ENABLE_BSS3           FIELD32(0x00000008)
 
 /*
  * SEC_CSR5: shared key table security mode register.
@@ -1428,8 +1443,10 @@ struct hw_pairwise_ta_entry {
 
 /*
  * Word4
+ * ICV: Received ICV of originally encrypted.
+ * NOTE: This is a guess, the official definition is "reserved"
  */
-#define RXD_W4_RESERVED                        FIELD32(0xffffffff)
+#define RXD_W4_ICV                     FIELD32(0xffffffff)
 
 /*
  * the above 20-byte is called RXINFO and will be DMAed to MAC RX block
@@ -1465,17 +1482,10 @@ struct hw_pairwise_ta_entry {
 #define MAX_TXPOWER    31
 #define DEFAULT_TXPOWER        24
 
-#define TXPOWER_FROM_DEV(__txpower)            \
-({                                             \
-       ((__txpower) > MAX_TXPOWER) ?           \
-               DEFAULT_TXPOWER : (__txpower);  \
-})
-
-#define TXPOWER_TO_DEV(__txpower)                      \
-({                                                     \
-       ((__txpower) <= MIN_TXPOWER) ? MIN_TXPOWER :    \
-       (((__txpower) >= MAX_TXPOWER) ? MAX_TXPOWER :   \
-       (__txpower));                                   \
-})
+#define TXPOWER_FROM_DEV(__txpower) \
+       (((u8)(__txpower)) > MAX_TXPOWER) ? DEFAULT_TXPOWER : (__txpower)
+
+#define TXPOWER_TO_DEV(__txpower) \
+       clamp_t(char, __txpower, MIN_TXPOWER, MAX_TXPOWER)
 
 #endif /* RT61PCI_H */
index 9761eaaa08be789e0cc970272719860ca3116526..f58fd059c9a0cd4bb80002724b652e83b418075b 100644 (file)
 #include "rt2x00usb.h"
 #include "rt73usb.h"
 
+/*
+ * Allow hardware encryption to be disabled.
+ */
+static int modparam_nohwcrypt = 0;
+module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO);
+MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");
+
 /*
  * Register access.
  * All access to the CSR registers will go through the methods
@@ -357,6 +364,219 @@ static void rt73usb_init_led(struct rt2x00_dev *rt2x00dev,
 /*
  * Configuration handlers.
  */
+static int rt73usb_config_shared_key(struct rt2x00_dev *rt2x00dev,
+                                    struct rt2x00lib_crypto *crypto,
+                                    struct ieee80211_key_conf *key)
+{
+       struct hw_key_entry key_entry;
+       struct rt2x00_field32 field;
+       int timeout;
+       u32 mask;
+       u32 reg;
+
+       if (crypto->cmd == SET_KEY) {
+               /*
+                * rt2x00lib can't determine the correct free
+                * key_idx for shared keys. We have 1 register
+                * with key valid bits. The goal is simple, read
+                * the register, if that is full we have no slots
+                * left.
+                * Note that each BSS is allowed to have up to 4
+                * shared keys, so put a mask over the allowed
+                * entries.
+                */
+               mask = (0xf << crypto->bssidx);
+
+               rt73usb_register_read(rt2x00dev, SEC_CSR0, &reg);
+               reg &= mask;
+
+               if (reg && reg == mask)
+                       return -ENOSPC;
+
+               key->hw_key_idx += reg ? (ffz(reg) - 1) : 0;
+
+               /*
+                * Upload key to hardware
+                */
+               memcpy(key_entry.key, crypto->key,
+                      sizeof(key_entry.key));
+               memcpy(key_entry.tx_mic, crypto->tx_mic,
+                      sizeof(key_entry.tx_mic));
+               memcpy(key_entry.rx_mic, crypto->rx_mic,
+                      sizeof(key_entry.rx_mic));
+
+               reg = SHARED_KEY_ENTRY(key->hw_key_idx);
+               timeout = REGISTER_TIMEOUT32(sizeof(key_entry));
+               rt2x00usb_vendor_request_large_buff(rt2x00dev, USB_MULTI_WRITE,
+                                                   USB_VENDOR_REQUEST_OUT, reg,
+                                                   &key_entry,
+                                                   sizeof(key_entry),
+                                                   timeout);
+
+               /*
+                * The cipher types are stored over 2 registers.
+                * bssidx 0 and 1 keys are stored in SEC_CSR1 and
+                * bssidx 1 and 2 keys are stored in SEC_CSR5.
+                * Using the correct defines correctly will cause overhead,
+                * so just calculate the correct offset.
+                */
+               if (key->hw_key_idx < 8) {
+                       field.bit_offset = (3 * key->hw_key_idx);
+                       field.bit_mask = 0x7 << field.bit_offset;
+
+                       rt73usb_register_read(rt2x00dev, SEC_CSR1, &reg);
+                       rt2x00_set_field32(&reg, field, crypto->cipher);
+                       rt73usb_register_write(rt2x00dev, SEC_CSR1, reg);
+               } else {
+                       field.bit_offset = (3 * (key->hw_key_idx - 8));
+                       field.bit_mask = 0x7 << field.bit_offset;
+
+                       rt73usb_register_read(rt2x00dev, SEC_CSR5, &reg);
+                       rt2x00_set_field32(&reg, field, crypto->cipher);
+                       rt73usb_register_write(rt2x00dev, SEC_CSR5, reg);
+               }
+
+               /*
+                * The driver does not support the IV/EIV generation
+                * in hardware. However it doesn't support the IV/EIV
+                * inside the ieee80211 frame either, but requires it
+                * to be provided seperately for the descriptor.
+                * rt2x00lib will cut the IV/EIV data out of all frames
+                * given to us by mac80211, but we must tell mac80211
+                * to generate the IV/EIV data.
+                */
+               key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
+       }
+
+       /*
+        * SEC_CSR0 contains only single-bit fields to indicate
+        * a particular key is valid. Because using the FIELD32()
+        * defines directly will cause a lot of overhead we use
+        * a calculation to determine the correct bit directly.
+        */
+       mask = 1 << key->hw_key_idx;
+
+       rt73usb_register_read(rt2x00dev, SEC_CSR0, &reg);
+       if (crypto->cmd == SET_KEY)
+               reg |= mask;
+       else if (crypto->cmd == DISABLE_KEY)
+               reg &= ~mask;
+       rt73usb_register_write(rt2x00dev, SEC_CSR0, reg);
+
+       return 0;
+}
+
+static int rt73usb_config_pairwise_key(struct rt2x00_dev *rt2x00dev,
+                                      struct rt2x00lib_crypto *crypto,
+                                      struct ieee80211_key_conf *key)
+{
+       struct hw_pairwise_ta_entry addr_entry;
+       struct hw_key_entry key_entry;
+       int timeout;
+       u32 mask;
+       u32 reg;
+
+       if (crypto->cmd == SET_KEY) {
+               /*
+                * rt2x00lib can't determine the correct free
+                * key_idx for pairwise keys. We have 2 registers
+                * with key valid bits. The goal is simple, read
+                * the first register, if that is full move to
+                * the next register.
+                * When both registers are full, we drop the key,
+                * otherwise we use the first invalid entry.
+                */
+               rt73usb_register_read(rt2x00dev, SEC_CSR2, &reg);
+               if (reg && reg == ~0) {
+                       key->hw_key_idx = 32;
+                       rt73usb_register_read(rt2x00dev, SEC_CSR3, &reg);
+                       if (reg && reg == ~0)
+                               return -ENOSPC;
+               }
+
+               key->hw_key_idx += reg ? (ffz(reg) - 1) : 0;
+
+               /*
+                * Upload key to hardware
+                */
+               memcpy(key_entry.key, crypto->key,
+                      sizeof(key_entry.key));
+               memcpy(key_entry.tx_mic, crypto->tx_mic,
+                      sizeof(key_entry.tx_mic));
+               memcpy(key_entry.rx_mic, crypto->rx_mic,
+                      sizeof(key_entry.rx_mic));
+
+               reg = PAIRWISE_KEY_ENTRY(key->hw_key_idx);
+               timeout = REGISTER_TIMEOUT32(sizeof(key_entry));
+               rt2x00usb_vendor_request_large_buff(rt2x00dev, USB_MULTI_WRITE,
+                                                   USB_VENDOR_REQUEST_OUT, reg,
+                                                   &key_entry,
+                                                   sizeof(key_entry),
+                                                   timeout);
+
+               /*
+                * Send the address and cipher type to the hardware register.
+                * This data fits within the CSR cache size, so we can use
+                * rt73usb_register_multiwrite() directly.
+                */
+               memset(&addr_entry, 0, sizeof(addr_entry));
+               memcpy(&addr_entry, crypto->address, ETH_ALEN);
+               addr_entry.cipher = crypto->cipher;
+
+               reg = PAIRWISE_TA_ENTRY(key->hw_key_idx);
+               rt73usb_register_multiwrite(rt2x00dev, reg,
+                                           &addr_entry, sizeof(addr_entry));
+
+               /*
+                * Enable pairwise lookup table for given BSS idx,
+                * without this received frames will not be decrypted
+                * by the hardware.
+                */
+               rt73usb_register_read(rt2x00dev, SEC_CSR4, &reg);
+               reg |= (1 << crypto->bssidx);
+               rt73usb_register_write(rt2x00dev, SEC_CSR4, reg);
+
+               /*
+                * The driver does not support the IV/EIV generation
+                * in hardware. However it doesn't support the IV/EIV
+                * inside the ieee80211 frame either, but requires it
+                * to be provided seperately for the descriptor.
+                * rt2x00lib will cut the IV/EIV data out of all frames
+                * given to us by mac80211, but we must tell mac80211
+                * to generate the IV/EIV data.
+                */
+               key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
+       }
+
+       /*
+        * SEC_CSR2 and SEC_CSR3 contain only single-bit fields to indicate
+        * a particular key is valid. Because using the FIELD32()
+        * defines directly will cause a lot of overhead we use
+        * a calculation to determine the correct bit directly.
+        */
+       if (key->hw_key_idx < 32) {
+               mask = 1 << key->hw_key_idx;
+
+               rt73usb_register_read(rt2x00dev, SEC_CSR2, &reg);
+               if (crypto->cmd == SET_KEY)
+                       reg |= mask;
+               else if (crypto->cmd == DISABLE_KEY)
+                       reg &= ~mask;
+               rt73usb_register_write(rt2x00dev, SEC_CSR2, reg);
+       } else {
+               mask = 1 << (key->hw_key_idx - 32);
+
+               rt73usb_register_read(rt2x00dev, SEC_CSR3, &reg);
+               if (crypto->cmd == SET_KEY)
+                       reg |= mask;
+               else if (crypto->cmd == DISABLE_KEY)
+                       reg &= ~mask;
+               rt73usb_register_write(rt2x00dev, SEC_CSR3, reg);
+       }
+
+       return 0;
+}
+
 static void rt73usb_config_filter(struct rt2x00_dev *rt2x00dev,
                                  const unsigned int filter_flags)
 {
@@ -451,6 +671,26 @@ static void rt73usb_config_erp(struct rt2x00_dev *rt2x00dev,
        rt73usb_register_write(rt2x00dev, TXRX_CSR4, reg);
 }
 
+static void rt73usb_config_lna_gain(struct rt2x00_dev *rt2x00dev,
+                                   struct rt2x00lib_conf *libconf)
+{
+       u16 eeprom;
+       short lna_gain = 0;
+
+       if (libconf->band == IEEE80211_BAND_2GHZ) {
+               if (test_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags))
+                       lna_gain += 14;
+
+               rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_BG, &eeprom);
+               lna_gain -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_BG_1);
+       } else {
+               rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_A, &eeprom);
+               lna_gain -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_A_1);
+       }
+
+       rt2x00dev->lna_gain = lna_gain;
+}
+
 static void rt73usb_config_phymode(struct rt2x00_dev *rt2x00dev,
                                   const int basic_rate_mask)
 {
@@ -705,6 +945,9 @@ static void rt73usb_config(struct rt2x00_dev *rt2x00dev,
                           struct rt2x00lib_conf *libconf,
                           const unsigned int flags)
 {
+       /* Always recalculate LNA gain before changing configuration */
+       rt73usb_config_lna_gain(rt2x00dev, libconf);
+
        if (flags & CONFIG_UPDATE_PHYMODE)
                rt73usb_config_phymode(rt2x00dev, libconf->basic_rates);
        if (flags & CONFIG_UPDATE_CHANNEL)
@@ -1265,8 +1508,8 @@ static int rt73usb_set_device_state(struct rt2x00_dev *rt2x00dev,
  * TX descriptor initialization
  */
 static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
-                                   struct sk_buff *skb,
-                                   struct txentry_desc *txdesc)
+                                 struct sk_buff *skb,
+                                 struct txentry_desc *txdesc)
 {
        struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
        __le32 *txd = skbdesc->desc;
@@ -1280,7 +1523,7 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
        rt2x00_set_field32(&word, TXD_W1_AIFSN, txdesc->aifs);
        rt2x00_set_field32(&word, TXD_W1_CWMIN, txdesc->cw_min);
        rt2x00_set_field32(&word, TXD_W1_CWMAX, txdesc->cw_max);
-       rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, IEEE80211_HEADER);
+       rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, txdesc->iv_offset);
        rt2x00_set_field32(&word, TXD_W1_HW_SEQUENCE,
                           test_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags));
        rt2x00_desc_write(txd, 1, word);
@@ -1292,6 +1535,11 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
        rt2x00_set_field32(&word, TXD_W2_PLCP_LENGTH_HIGH, txdesc->length_high);
        rt2x00_desc_write(txd, 2, word);
 
+       if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc->flags)) {
+               _rt2x00_desc_write(txd, 3, skbdesc->iv);
+               _rt2x00_desc_write(txd, 4, skbdesc->eiv);
+       }
+
        rt2x00_desc_read(txd, 5, &word);
        rt2x00_set_field32(&word, TXD_W5_TX_POWER,
                           TXPOWER_TO_DEV(rt2x00dev->tx_power));
@@ -1313,12 +1561,16 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
        rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs);
        rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
                           test_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags));
-       rt2x00_set_field32(&word, TXD_W0_TKIP_MIC, 0);
+       rt2x00_set_field32(&word, TXD_W0_TKIP_MIC,
+                          test_bit(ENTRY_TXD_ENCRYPT_MMIC, &txdesc->flags));
+       rt2x00_set_field32(&word, TXD_W0_KEY_TABLE,
+                          test_bit(ENTRY_TXD_ENCRYPT_PAIRWISE, &txdesc->flags));
+       rt2x00_set_field32(&word, TXD_W0_KEY_INDEX, txdesc->key_idx);
        rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT,
                           skb->len - skbdesc->desc_len);
        rt2x00_set_field32(&word, TXD_W0_BURST2,
                           test_bit(ENTRY_TXD_BURST, &txdesc->flags));
-       rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, CIPHER_NONE);
+       rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, txdesc->cipher);
        rt2x00_desc_write(txd, 0, word);
 }
 
@@ -1422,20 +1674,19 @@ static void rt73usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
  */
 static int rt73usb_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1)
 {
-       u16 eeprom;
-       u8 offset;
+       u8 offset = rt2x00dev->lna_gain;
        u8 lna;
 
        lna = rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_LNA);
        switch (lna) {
        case 3:
-               offset = 90;
+               offset += 90;
                break;
        case 2:
-               offset = 74;
+               offset += 74;
                break;
        case 1:
-               offset = 64;
+               offset += 64;
                break;
        default:
                return 0;
@@ -1451,15 +1702,6 @@ static int rt73usb_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1)
                        else if (lna == 2)
                                offset += 8;
                }
-
-               rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_A, &eeprom);
-               offset -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_A_1);
-       } else {
-               if (test_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags))
-                       offset += 14;
-
-               rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_BG, &eeprom);
-               offset -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_BG_1);
        }
 
        return rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_AGC) * 2 - offset;
@@ -1468,6 +1710,7 @@ static int rt73usb_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1)
 static void rt73usb_fill_rxdone(struct queue_entry *entry,
                                struct rxdone_entry_desc *rxdesc)
 {
+       struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
        struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
        __le32 *rxd = (__le32 *)entry->skb->data;
        u32 word0;
@@ -1489,6 +1732,38 @@ static void rt73usb_fill_rxdone(struct queue_entry *entry,
        if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR))
                rxdesc->flags |= RX_FLAG_FAILED_FCS_CRC;
 
+       if (test_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags)) {
+               rxdesc->cipher =
+                   rt2x00_get_field32(word0, RXD_W0_CIPHER_ALG);
+               rxdesc->cipher_status =
+                   rt2x00_get_field32(word0, RXD_W0_CIPHER_ERROR);
+       }
+
+       if (rxdesc->cipher != CIPHER_NONE) {
+               _rt2x00_desc_read(rxd, 2, &rxdesc->iv);
+               _rt2x00_desc_read(rxd, 3, &rxdesc->eiv);
+               _rt2x00_desc_read(rxd, 4, &rxdesc->icv);
+
+               /*
+                * Hardware has stripped IV/EIV data from 802.11 frame during
+                * decryption. It has provided the data seperately but rt2x00lib
+                * should decide if it should be reinserted.
+                */
+               rxdesc->flags |= RX_FLAG_IV_STRIPPED;
+
+               /*
+                * FIXME: Legacy driver indicates that the frame does
+                * contain the Michael Mic. Unfortunately, in rt2x00
+                * the MIC seems to be missing completely...
+                */
+               rxdesc->flags |= RX_FLAG_MMIC_STRIPPED;
+
+               if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS)
+                       rxdesc->flags |= RX_FLAG_DECRYPTED;
+               else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC)
+                       rxdesc->flags |= RX_FLAG_MMIC_ERROR;
+       }
+
        /*
         * Obtain the status about this packet.
         * When frame was received with an OFDM bitrate,
@@ -1496,7 +1771,7 @@ static void rt73usb_fill_rxdone(struct queue_entry *entry,
         * a CCK bitrate the signal is the rate in 100kbit/s.
         */
        rxdesc->signal = rt2x00_get_field32(word1, RXD_W1_SIGNAL);
-       rxdesc->rssi = rt73usb_agc_to_rssi(entry->queue->rt2x00dev, word1);
+       rxdesc->rssi = rt73usb_agc_to_rssi(rt2x00dev, word1);
        rxdesc->size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
 
        if (rt2x00_get_field32(word0, RXD_W0_OFDM))
@@ -1852,10 +2127,11 @@ static const struct rf_channel rf_vals_5225_2527[] = {
 };
 
 
-static void rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
+static int rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 {
        struct hw_mode_spec *spec = &rt2x00dev->spec;
-       u8 *txpower;
+       struct channel_info *info;
+       char *tx_power;
        unsigned int i;
 
        /*
@@ -1871,21 +2147,11 @@ static void rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
                                rt2x00_eeprom_addr(rt2x00dev,
                                                   EEPROM_MAC_ADDR_0));
 
-       /*
-        * Convert tx_power array in eeprom.
-        */
-       txpower = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_G_START);
-       for (i = 0; i < 14; i++)
-               txpower[i] = TXPOWER_FROM_DEV(txpower[i]);
-
        /*
         * Initialize hw_mode information.
         */
        spec->supported_bands = SUPPORT_BAND_2GHZ;
        spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM;
-       spec->tx_power_a = NULL;
-       spec->tx_power_bg = txpower;
-       spec->tx_power_default = DEFAULT_TXPOWER;
 
        if (rt2x00_rf(&rt2x00dev->chip, RF2528)) {
                spec->num_channels = ARRAY_SIZE(rf_vals_bg_2528);
@@ -1903,14 +2169,26 @@ static void rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
                spec->channels = rf_vals_5225_2527;
        }
 
-       if (rt2x00_rf(&rt2x00dev->chip, RF5225) ||
-           rt2x00_rf(&rt2x00dev->chip, RF5226)) {
-               txpower = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A_START);
-               for (i = 0; i < 14; i++)
-                       txpower[i] = TXPOWER_FROM_DEV(txpower[i]);
+       /*
+        * Create channel information array
+        */
+       info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
+       if (!info)
+               return -ENOMEM;
 
-               spec->tx_power_a = txpower;
+       spec->channels_info = info;
+
+       tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_G_START);
+       for (i = 0; i < 14; i++)
+               info[i].tx_power1 = TXPOWER_FROM_DEV(tx_power[i]);
+
+       if (spec->num_channels > 14) {
+               tx_power = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A_START);
+               for (i = 14; i < spec->num_channels; i++)
+                       info[i].tx_power1 = TXPOWER_FROM_DEV(tx_power[i]);
        }
+
+       return 0;
 }
 
 static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev)
@@ -1931,13 +2209,17 @@ static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev)
        /*
         * Initialize hw specifications.
         */
-       rt73usb_probe_hw_mode(rt2x00dev);
+       retval = rt73usb_probe_hw_mode(rt2x00dev);
+       if (retval)
+               return retval;
 
        /*
         * This device requires firmware.
         */
        __set_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags);
        __set_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags);
+       if (!modparam_nohwcrypt)
+               __set_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags);
 
        /*
         * Set the rssi offset.
@@ -1997,6 +2279,7 @@ static const struct ieee80211_ops rt73usb_mac80211_ops = {
        .config                 = rt2x00mac_config,
        .config_interface       = rt2x00mac_config_interface,
        .configure_filter       = rt2x00mac_configure_filter,
+       .set_key                = rt2x00mac_set_key,
        .get_stats              = rt2x00mac_get_stats,
        .set_retry_limit        = rt73usb_set_retry_limit,
        .bss_info_changed       = rt2x00mac_bss_info_changed,
@@ -2024,6 +2307,8 @@ static const struct rt2x00lib_ops rt73usb_rt2x00_ops = {
        .get_tx_data_len        = rt73usb_get_tx_data_len,
        .kick_tx_queue          = rt73usb_kick_tx_queue,
        .fill_rxdone            = rt73usb_fill_rxdone,
+       .config_shared_key      = rt73usb_config_shared_key,
+       .config_pairwise_key    = rt73usb_config_pairwise_key,
        .config_filter          = rt73usb_config_filter,
        .config_intf            = rt73usb_config_intf,
        .config_erp             = rt73usb_config_erp,
index 14849350101136818bd8d2990c88057eb0dbfddc..868386c457f65c39c4e15d11ef92cefbebb534a4 100644 (file)
 #define PAIRWISE_KEY_TABLE_BASE                0x1200
 #define PAIRWISE_TA_TABLE_BASE         0x1a00
 
+#define SHARED_KEY_ENTRY(__idx) \
+       ( SHARED_KEY_TABLE_BASE + \
+               ((__idx) * sizeof(struct hw_key_entry)) )
+#define PAIRWISE_KEY_ENTRY(__idx) \
+       ( PAIRWISE_KEY_TABLE_BASE + \
+               ((__idx) * sizeof(struct hw_key_entry)) )
+#define PAIRWISE_TA_ENTRY(__idx) \
+       ( PAIRWISE_TA_TABLE_BASE + \
+               ((__idx) * sizeof(struct hw_pairwise_ta_entry)) )
+
 struct hw_key_entry {
        u8 key[16];
        u8 tx_mic[8];
@@ -100,7 +110,8 @@ struct hw_key_entry {
 
 struct hw_pairwise_ta_entry {
        u8 address[6];
-       u8 reserved[2];
+       u8 cipher;
+       u8 reserved;
 } __attribute__ ((packed));
 
 /*
@@ -563,6 +574,10 @@ struct hw_pairwise_ta_entry {
  * SEC_CSR4: Pairwise key table lookup control.
  */
 #define SEC_CSR4                       0x30b0
+#define SEC_CSR4_ENABLE_BSS0           FIELD32(0x00000001)
+#define SEC_CSR4_ENABLE_BSS1           FIELD32(0x00000002)
+#define SEC_CSR4_ENABLE_BSS2           FIELD32(0x00000004)
+#define SEC_CSR4_ENABLE_BSS3           FIELD32(0x00000008)
 
 /*
  * SEC_CSR5: shared key table security mode register.
@@ -1010,8 +1025,10 @@ struct hw_pairwise_ta_entry {
 
 /*
  * Word4
+ * ICV: Received ICV of originally encrypted.
+ * NOTE: This is a guess, the official definition is "reserved"
  */
-#define RXD_W4_RESERVED                        FIELD32(0xffffffff)
+#define RXD_W4_ICV                     FIELD32(0xffffffff)
 
 /*
  * the above 20-byte is called RXINFO and will be DMAed to MAC RX block
@@ -1033,17 +1050,10 @@ struct hw_pairwise_ta_entry {
 #define MAX_TXPOWER    31
 #define DEFAULT_TXPOWER        24
 
-#define TXPOWER_FROM_DEV(__txpower)            \
-({                                             \
-       ((__txpower) > MAX_TXPOWER) ?           \
-               DEFAULT_TXPOWER : (__txpower);  \
-})
-
-#define TXPOWER_TO_DEV(__txpower)                      \
-({                                                     \
-       ((__txpower) <= MIN_TXPOWER) ? MIN_TXPOWER :    \
-       (((__txpower) >= MAX_TXPOWER) ? MAX_TXPOWER :   \
-       (__txpower));                                   \
-})
+#define TXPOWER_FROM_DEV(__txpower) \
+       (((u8)(__txpower)) > MAX_TXPOWER) ? DEFAULT_TXPOWER : (__txpower)
+
+#define TXPOWER_TO_DEV(__txpower) \
+       clamp_t(char, __txpower, MIN_TXPOWER, MAX_TXPOWER)
 
 #endif /* RT73USB_H */
index 082a11f93bebd77a88d055a44335037cfb3d1a73..8721282a8185d05d7db2be8cf7301467cdd26a80 100644 (file)
 #define ANAPARAM_PWR1_SHIFT    20
 #define ANAPARAM_PWR1_MASK     (0x7F << ANAPARAM_PWR1_SHIFT)
 
-enum rtl8180_tx_desc_flags {
-       RTL8180_TX_DESC_FLAG_NO_ENC     = (1 << 15),
-       RTL8180_TX_DESC_FLAG_TX_OK      = (1 << 15),
-       RTL8180_TX_DESC_FLAG_SPLCP      = (1 << 16),
-       RTL8180_TX_DESC_FLAG_RX_UNDER   = (1 << 16),
-       RTL8180_TX_DESC_FLAG_MOREFRAG   = (1 << 17),
-       RTL8180_TX_DESC_FLAG_CTS        = (1 << 18),
-       RTL8180_TX_DESC_FLAG_RTS        = (1 << 23),
-       RTL8180_TX_DESC_FLAG_LS         = (1 << 28),
-       RTL8180_TX_DESC_FLAG_FS         = (1 << 29),
-       RTL8180_TX_DESC_FLAG_DMA        = (1 << 30),
-       RTL8180_TX_DESC_FLAG_OWN        = (1 << 31)
-};
-
 struct rtl8180_tx_desc {
        __le32 flags;
        __le16 rts_duration;
@@ -52,23 +38,6 @@ struct rtl8180_tx_desc {
        u32 reserved[2];
 } __attribute__ ((packed));
 
-enum rtl8180_rx_desc_flags {
-       RTL8180_RX_DESC_FLAG_ICV_ERR    = (1 << 12),
-       RTL8180_RX_DESC_FLAG_CRC32_ERR  = (1 << 13),
-       RTL8180_RX_DESC_FLAG_PM         = (1 << 14),
-       RTL8180_RX_DESC_FLAG_RX_ERR     = (1 << 15),
-       RTL8180_RX_DESC_FLAG_BCAST      = (1 << 16),
-       RTL8180_RX_DESC_FLAG_PAM        = (1 << 17),
-       RTL8180_RX_DESC_FLAG_MCAST      = (1 << 18),
-       RTL8180_RX_DESC_FLAG_SPLCP      = (1 << 25),
-       RTL8180_RX_DESC_FLAG_FOF        = (1 << 26),
-       RTL8180_RX_DESC_FLAG_DMA_FAIL   = (1 << 27),
-       RTL8180_RX_DESC_FLAG_LS         = (1 << 28),
-       RTL8180_RX_DESC_FLAG_FS         = (1 << 29),
-       RTL8180_RX_DESC_FLAG_EOR        = (1 << 30),
-       RTL8180_RX_DESC_FLAG_OWN        = (1 << 31)
-};
-
 struct rtl8180_rx_desc {
        __le32 flags;
        __le32 flags2;
index b7172a12c0572e3d9b1c27b3cf6747d7021a2eed..861c76a65d6a07fbbba31545077f84496dcebb8e 100644 (file)
@@ -110,12 +110,12 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
                struct sk_buff *skb = priv->rx_buf[priv->rx_idx];
                u32 flags = le32_to_cpu(entry->flags);
 
-               if (flags & RTL8180_RX_DESC_FLAG_OWN)
+               if (flags & RTL818X_RX_DESC_FLAG_OWN)
                        return;
 
-               if (unlikely(flags & (RTL8180_RX_DESC_FLAG_DMA_FAIL |
-                                     RTL8180_RX_DESC_FLAG_FOF |
-                                     RTL8180_RX_DESC_FLAG_RX_ERR)))
+               if (unlikely(flags & (RTL818X_RX_DESC_FLAG_DMA_FAIL |
+                                     RTL818X_RX_DESC_FLAG_FOF |
+                                     RTL818X_RX_DESC_FLAG_RX_ERR)))
                        goto done;
                else {
                        u32 flags2 = le32_to_cpu(entry->flags2);
@@ -140,7 +140,7 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
                        rx_status.band = dev->conf.channel->band;
                        rx_status.mactime = le64_to_cpu(entry->tsft);
                        rx_status.flag |= RX_FLAG_TSFT;
-                       if (flags & RTL8180_RX_DESC_FLAG_CRC32_ERR)
+                       if (flags & RTL818X_RX_DESC_FLAG_CRC32_ERR)
                                rx_status.flag |= RX_FLAG_FAILED_FCS_CRC;
 
                        ieee80211_rx_irqsafe(dev, skb, &rx_status);
@@ -154,10 +154,10 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
 
        done:
                entry->rx_buf = cpu_to_le32(*((dma_addr_t *)skb->cb));
-               entry->flags = cpu_to_le32(RTL8180_RX_DESC_FLAG_OWN |
+               entry->flags = cpu_to_le32(RTL818X_RX_DESC_FLAG_OWN |
                                           MAX_RX_SIZE);
                if (priv->rx_idx == 31)
-                       entry->flags |= cpu_to_le32(RTL8180_RX_DESC_FLAG_EOR);
+                       entry->flags |= cpu_to_le32(RTL818X_RX_DESC_FLAG_EOR);
                priv->rx_idx = (priv->rx_idx + 1) % 32;
        }
 }
@@ -173,7 +173,7 @@ static void rtl8180_handle_tx(struct ieee80211_hw *dev, unsigned int prio)
                struct ieee80211_tx_info *info;
                u32 flags = le32_to_cpu(entry->flags);
 
-               if (flags & RTL8180_TX_DESC_FLAG_OWN)
+               if (flags & RTL818X_TX_DESC_FLAG_OWN)
                        return;
 
                ring->idx = (ring->idx + 1) % ring->entries;
@@ -185,7 +185,7 @@ static void rtl8180_handle_tx(struct ieee80211_hw *dev, unsigned int prio)
                memset(&info->status, 0, sizeof(info->status));
 
                if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) {
-                       if (flags & RTL8180_TX_DESC_FLAG_TX_OK)
+                       if (flags & RTL818X_TX_DESC_FLAG_TX_OK)
                                info->flags |= IEEE80211_TX_STAT_ACK;
                        else
                                info->status.excessive_retries = 1;
@@ -252,20 +252,20 @@ static int rtl8180_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
        mapping = pci_map_single(priv->pdev, skb->data,
                                 skb->len, PCI_DMA_TODEVICE);
 
-       tx_flags = RTL8180_TX_DESC_FLAG_OWN | RTL8180_TX_DESC_FLAG_FS |
-                  RTL8180_TX_DESC_FLAG_LS |
+       tx_flags = RTL818X_TX_DESC_FLAG_OWN | RTL818X_TX_DESC_FLAG_FS |
+                  RTL818X_TX_DESC_FLAG_LS |
                   (ieee80211_get_tx_rate(dev, info)->hw_value << 24) |
                   skb->len;
 
        if (priv->r8185)
-               tx_flags |= RTL8180_TX_DESC_FLAG_DMA |
-                           RTL8180_TX_DESC_FLAG_NO_ENC;
+               tx_flags |= RTL818X_TX_DESC_FLAG_DMA |
+                           RTL818X_TX_DESC_FLAG_NO_ENC;
 
        if (info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) {
-               tx_flags |= RTL8180_TX_DESC_FLAG_RTS;
+               tx_flags |= RTL818X_TX_DESC_FLAG_RTS;
                tx_flags |= ieee80211_get_rts_cts_rate(dev, info)->hw_value << 19;
        } else if (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT) {
-               tx_flags |= RTL8180_TX_DESC_FLAG_CTS;
+               tx_flags |= RTL818X_TX_DESC_FLAG_CTS;
                tx_flags |= ieee80211_get_rts_cts_rate(dev, info)->hw_value << 19;
        }
 
@@ -446,10 +446,10 @@ static int rtl8180_init_rx_ring(struct ieee80211_hw *dev)
                *mapping = pci_map_single(priv->pdev, skb_tail_pointer(skb),
                                          MAX_RX_SIZE, PCI_DMA_FROMDEVICE);
                entry->rx_buf = cpu_to_le32(*mapping);
-               entry->flags = cpu_to_le32(RTL8180_RX_DESC_FLAG_OWN |
+               entry->flags = cpu_to_le32(RTL818X_RX_DESC_FLAG_OWN |
                                           MAX_RX_SIZE);
        }
-       entry->flags |= cpu_to_le32(RTL8180_RX_DESC_FLAG_EOR);
+       entry->flags |= cpu_to_le32(RTL818X_RX_DESC_FLAG_EOR);
        return 0;
 }
 
index 5a9515c99960a164a8fb9d8552d4f30cad984717..e82bb4d289e834e2a2117a463d1a96697534a47d 100644 (file)
@@ -58,12 +58,6 @@ struct rtl8187b_rx_hdr {
 
 /* {rtl8187,rtl8187b}_tx_info is in skb */
 
-/* Tx flags are common between rtl8187 and rtl8187b */
-#define RTL8187_TX_FLAG_NO_ENCRYPT     (1 << 15)
-#define RTL8187_TX_FLAG_MORE_FRAG      (1 << 17)
-#define RTL8187_TX_FLAG_CTS            (1 << 18)
-#define RTL8187_TX_FLAG_RTS            (1 << 23)
-
 struct rtl8187_tx_hdr {
        __le32 flags;
        __le16 rts_duration;
index ca5deb6244e63c881ba3e48bdee13da2ca2f0716..060a265053583f867f4b6eae86fcb518932927bc 100644 (file)
@@ -187,18 +187,18 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
        }
 
        flags = skb->len;
-       flags |= RTL8187_TX_FLAG_NO_ENCRYPT;
+       flags |= RTL818X_TX_DESC_FLAG_NO_ENC;
 
        flags |= ieee80211_get_tx_rate(dev, info)->hw_value << 24;
        if (ieee80211_has_morefrags(((struct ieee80211_hdr *)skb->data)->frame_control))
-               flags |= RTL8187_TX_FLAG_MORE_FRAG;
+               flags |= RTL818X_TX_DESC_FLAG_MOREFRAG;
        if (info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) {
-               flags |= RTL8187_TX_FLAG_RTS;
+               flags |= RTL818X_TX_DESC_FLAG_RTS;
                flags |= ieee80211_get_rts_cts_rate(dev, info)->hw_value << 19;
                rts_dur = ieee80211_rts_duration(dev, priv->vif,
                                                 skb->len, info);
        } else if (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT) {
-               flags |= RTL8187_TX_FLAG_CTS;
+               flags |= RTL818X_TX_DESC_FLAG_CTS;
                flags |= ieee80211_get_rts_cts_rate(dev, info)->hw_value << 19;
        }
 
@@ -354,7 +354,7 @@ static void rtl8187_rx_cb(struct urb *urb)
        rx_status.freq = dev->conf.channel->center_freq;
        rx_status.band = dev->conf.channel->band;
        rx_status.flag |= RX_FLAG_TSFT;
-       if (flags & (1 << 13))
+       if (flags & RTL818X_RX_DESC_FLAG_CRC32_ERR)
                rx_status.flag |= RX_FLAG_FAILED_FCS_CRC;
        ieee80211_rx_irqsafe(dev, skb, &rx_status);
 
index 00900fe16fce5ae6e515de2337ff3819c887ce52..3538b15211b190bd2cf07d96ecd6caf79c527232 100644 (file)
@@ -193,4 +193,39 @@ struct rtl818x_rf_ops {
        void (*set_chan)(struct ieee80211_hw *, struct ieee80211_conf *);
 };
 
+/* Tx/Rx flags are common between RTL818X chips */
+
+enum rtl818x_tx_desc_flags {
+       RTL818X_TX_DESC_FLAG_NO_ENC     = (1 << 15),
+       RTL818X_TX_DESC_FLAG_TX_OK      = (1 << 15),
+       RTL818X_TX_DESC_FLAG_SPLCP      = (1 << 16),
+       RTL818X_TX_DESC_FLAG_RX_UNDER   = (1 << 16),
+       RTL818X_TX_DESC_FLAG_MOREFRAG   = (1 << 17),
+       RTL818X_TX_DESC_FLAG_CTS        = (1 << 18),
+       RTL818X_TX_DESC_FLAG_RTS        = (1 << 23),
+       RTL818X_TX_DESC_FLAG_LS         = (1 << 28),
+       RTL818X_TX_DESC_FLAG_FS         = (1 << 29),
+       RTL818X_TX_DESC_FLAG_DMA        = (1 << 30),
+       RTL818X_TX_DESC_FLAG_OWN        = (1 << 31)
+};
+
+enum rtl818x_rx_desc_flags {
+       RTL818X_RX_DESC_FLAG_ICV_ERR    = (1 << 12),
+       RTL818X_RX_DESC_FLAG_CRC32_ERR  = (1 << 13),
+       RTL818X_RX_DESC_FLAG_PM         = (1 << 14),
+       RTL818X_RX_DESC_FLAG_RX_ERR     = (1 << 15),
+       RTL818X_RX_DESC_FLAG_BCAST      = (1 << 16),
+       RTL818X_RX_DESC_FLAG_PAM        = (1 << 17),
+       RTL818X_RX_DESC_FLAG_MCAST      = (1 << 18),
+       RTL818X_RX_DESC_FLAG_QOS        = (1 << 19), /* RTL8187(B) only */
+       RTL818X_RX_DESC_FLAG_TRSW       = (1 << 24), /* RTL8187(B) only */
+       RTL818X_RX_DESC_FLAG_SPLCP      = (1 << 25),
+       RTL818X_RX_DESC_FLAG_FOF        = (1 << 26),
+       RTL818X_RX_DESC_FLAG_DMA_FAIL   = (1 << 27),
+       RTL818X_RX_DESC_FLAG_LS         = (1 << 28),
+       RTL818X_RX_DESC_FLAG_FS         = (1 << 29),
+       RTL818X_RX_DESC_FLAG_EOR        = (1 << 30),
+       RTL818X_RX_DESC_FLAG_OWN        = (1 << 31)
+};
+
 #endif /* RTL818X_H */
index 98df9bc7836a095ffe4bb42242a0665a20c629b3..e368759d1d89f8346bc06e00b675b2cda91517e3 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/delay.h>
-#include <linux/firmware.h>
 #include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
@@ -34,9 +33,6 @@
 
 #include "orinoco.h"
 
-static const char primary_fw_name[] = "symbol_sp24t_prim_fw";
-static const char secondary_fw_name[] = "symbol_sp24t_sec_fw";
-
 /********************************************************************/
 /* Module stuff                                                            */
 /********************************************************************/
@@ -71,161 +67,11 @@ struct orinoco_pccard {
 static int spectrum_cs_config(struct pcmcia_device *link);
 static void spectrum_cs_release(struct pcmcia_device *link);
 
-/********************************************************************/
-/* Firmware downloader                                             */
-/********************************************************************/
-
-/* Position of PDA in the adapter memory */
-#define EEPROM_ADDR    0x3000
-#define EEPROM_LEN     0x200
-#define PDA_OFFSET     0x100
-
-#define PDA_ADDR       (EEPROM_ADDR + PDA_OFFSET)
-#define PDA_WORDS      ((EEPROM_LEN - PDA_OFFSET) / 2)
-
 /* Constants for the CISREG_CCSR register */
 #define HCR_RUN                0x07    /* run firmware after reset */
 #define HCR_IDLE       0x0E    /* don't run firmware after reset */
 #define HCR_MEM16      0x10    /* memory width bit, should be preserved */
 
-/*
- * AUX port access.  To unlock the AUX port write the access keys to the
- * PARAM0-2 registers, then write HERMES_AUX_ENABLE to the HERMES_CONTROL
- * register.  Then read it and make sure it's HERMES_AUX_ENABLED.
- */
-#define HERMES_AUX_ENABLE      0x8000  /* Enable auxiliary port access */
-#define HERMES_AUX_DISABLE     0x4000  /* Disable to auxiliary port access */
-#define HERMES_AUX_ENABLED     0xC000  /* Auxiliary port is open */
-
-#define HERMES_AUX_PW0 0xFE01
-#define HERMES_AUX_PW1 0xDC23
-#define HERMES_AUX_PW2 0xBA45
-
-/* End markers */
-#define PDI_END                0x00000000      /* End of PDA */
-#define BLOCK_END      0xFFFFFFFF      /* Last image block */
-#define TEXT_END       0x1A            /* End of text header */
-
-/*
- * The following structures have little-endian fields denoted by
- * the leading underscore.  Don't access them directly - use inline
- * functions defined below.
- */
-
-/*
- * The binary image to be downloaded consists of series of data blocks.
- * Each block has the following structure.
- */
-struct dblock {
-       __le32 addr;            /* adapter address where to write the block */
-       __le16 len;             /* length of the data only, in bytes */
-       char data[0];           /* data to be written */
-} __attribute__ ((packed));
-
-/*
- * Plug Data References are located in in the image after the last data
- * block.  They refer to areas in the adapter memory where the plug data
- * items with matching ID should be written.
- */
-struct pdr {
-       __le32 id;              /* record ID */
-       __le32 addr;            /* adapter address where to write the data */
-       __le32 len;             /* expected length of the data, in bytes */
-       char next[0];           /* next PDR starts here */
-} __attribute__ ((packed));
-
-
-/*
- * Plug Data Items are located in the EEPROM read from the adapter by
- * primary firmware.  They refer to the device-specific data that should
- * be plugged into the secondary firmware.
- */
-struct pdi {
-       __le16 len;             /* length of ID and data, in words */
-       __le16 id;              /* record ID */
-       char data[0];           /* plug data */
-} __attribute__ ((packed));
-
-
-/* Functions for access to little-endian data */
-static inline u32
-dblock_addr(const struct dblock *blk)
-{
-       return le32_to_cpu(blk->addr);
-}
-
-static inline u32
-dblock_len(const struct dblock *blk)
-{
-       return le16_to_cpu(blk->len);
-}
-
-static inline u32
-pdr_id(const struct pdr *pdr)
-{
-       return le32_to_cpu(pdr->id);
-}
-
-static inline u32
-pdr_addr(const struct pdr *pdr)
-{
-       return le32_to_cpu(pdr->addr);
-}
-
-static inline u32
-pdr_len(const struct pdr *pdr)
-{
-       return le32_to_cpu(pdr->len);
-}
-
-static inline u32
-pdi_id(const struct pdi *pdi)
-{
-       return le16_to_cpu(pdi->id);
-}
-
-/* Return length of the data only, in bytes */
-static inline u32
-pdi_len(const struct pdi *pdi)
-{
-       return 2 * (le16_to_cpu(pdi->len) - 1);
-}
-
-
-/* Set address of the auxiliary port */
-static inline void
-spectrum_aux_setaddr(hermes_t *hw, u32 addr)
-{
-       hermes_write_reg(hw, HERMES_AUXPAGE, (u16) (addr >> 7));
-       hermes_write_reg(hw, HERMES_AUXOFFSET, (u16) (addr & 0x7F));
-}
-
-
-/* Open access to the auxiliary port */
-static int
-spectrum_aux_open(hermes_t *hw)
-{
-       int i;
-
-       /* Already open? */
-       if (hermes_read_reg(hw, HERMES_CONTROL) == HERMES_AUX_ENABLED)
-               return 0;
-
-       hermes_write_reg(hw, HERMES_PARAM0, HERMES_AUX_PW0);
-       hermes_write_reg(hw, HERMES_PARAM1, HERMES_AUX_PW1);
-       hermes_write_reg(hw, HERMES_PARAM2, HERMES_AUX_PW2);
-       hermes_write_reg(hw, HERMES_CONTROL, HERMES_AUX_ENABLE);
-
-       for (i = 0; i < 20; i++) {
-               udelay(10);
-               if (hermes_read_reg(hw, HERMES_CONTROL) ==
-                   HERMES_AUX_ENABLED)
-                       return 0;
-       }
-
-       return -EBUSY;
-}
-
 
 #define CS_CHECK(fn, ret) \
   do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
@@ -292,275 +138,29 @@ spectrum_reset(struct pcmcia_device *link, int idle)
        return -ENODEV;
 }
 
+/********************************************************************/
+/* Device methods                                                  */
+/********************************************************************/
 
-/*
- * Scan PDR for the record with the specified RECORD_ID.
- * If it's not found, return NULL.
- */
-static struct pdr *
-spectrum_find_pdr(struct pdr *first_pdr, u32 record_id)
-{
-       struct pdr *pdr = first_pdr;
-
-       while (pdr_id(pdr) != PDI_END) {
-               /*
-                * PDR area is currently not terminated by PDI_END.
-                * It's followed by CRC records, which have the type
-                * field where PDR has length.  The type can be 0 or 1.
-                */
-               if (pdr_len(pdr) < 2)
-                       return NULL;
-
-               /* If the record ID matches, we are done */
-               if (pdr_id(pdr) == record_id)
-                       return pdr;
-
-               pdr = (struct pdr *) pdr->next;
-       }
-       return NULL;
-}
-
-
-/* Process one Plug Data Item - find corresponding PDR and plug it */
-static int
-spectrum_plug_pdi(hermes_t *hw, struct pdr *first_pdr, struct pdi *pdi)
-{
-       struct pdr *pdr;
-
-       /* Find the PDI corresponding to this PDR */
-       pdr = spectrum_find_pdr(first_pdr, pdi_id(pdi));
-
-       /* No match is found, safe to ignore */
-       if (!pdr)
-               return 0;
-
-       /* Lengths of the data in PDI and PDR must match */
-       if (pdi_len(pdi) != pdr_len(pdr))
-               return -EINVAL;
-
-       /* do the actual plugging */
-       spectrum_aux_setaddr(hw, pdr_addr(pdr));
-       hermes_write_bytes(hw, HERMES_AUXDATA, pdi->data, pdi_len(pdi));
-
-       return 0;
-}
-
-
-/* Read PDA from the adapter */
-static int
-spectrum_read_pda(hermes_t *hw, __le16 *pda, int pda_len)
-{
-       int ret;
-       int pda_size;
-
-       /* Issue command to read EEPROM */
-       ret = hermes_docmd_wait(hw, HERMES_CMD_READMIF, 0, NULL);
-       if (ret)
-               return ret;
-
-       /* Open auxiliary port */
-       ret = spectrum_aux_open(hw);
-       if (ret)
-               return ret;
-
-       /* read PDA from EEPROM */
-       spectrum_aux_setaddr(hw, PDA_ADDR);
-       hermes_read_words(hw, HERMES_AUXDATA, pda, pda_len / 2);
-
-       /* Check PDA length */
-       pda_size = le16_to_cpu(pda[0]);
-       if (pda_size > pda_len)
-               return -EINVAL;
-
-       return 0;
-}
-
-
-/* Parse PDA and write the records into the adapter */
-static int
-spectrum_apply_pda(hermes_t *hw, const struct dblock *first_block,
-                  __le16 *pda)
-{
-       int ret;
-       struct pdi *pdi;
-       struct pdr *first_pdr;
-       const struct dblock *blk = first_block;
-
-       /* Skip all blocks to locate Plug Data References */
-       while (dblock_addr(blk) != BLOCK_END)
-               blk = (struct dblock *) &blk->data[dblock_len(blk)];
-
-       first_pdr = (struct pdr *) blk;
-
-       /* Go through every PDI and plug them into the adapter */
-       pdi = (struct pdi *) (pda + 2);
-       while (pdi_id(pdi) != PDI_END) {
-               ret = spectrum_plug_pdi(hw, first_pdr, pdi);
-               if (ret)
-                       return ret;
-
-               /* Increment to the next PDI */
-               pdi = (struct pdi *) &pdi->data[pdi_len(pdi)];
-       }
-       return 0;
-}
-
-
-/* Load firmware blocks into the adapter */
-static int
-spectrum_load_blocks(hermes_t *hw, const struct dblock *first_block)
-{
-       const struct dblock *blk;
-       u32 blkaddr;
-       u32 blklen;
-
-       blk = first_block;
-       blkaddr = dblock_addr(blk);
-       blklen = dblock_len(blk);
-
-       while (dblock_addr(blk) != BLOCK_END) {
-               spectrum_aux_setaddr(hw, blkaddr);
-               hermes_write_bytes(hw, HERMES_AUXDATA, blk->data,
-                                  blklen);
-
-               blk = (struct dblock *) &blk->data[blklen];
-               blkaddr = dblock_addr(blk);
-               blklen = dblock_len(blk);
-       }
-       return 0;
-}
-
-
-/*
- * Process a firmware image - stop the card, load the firmware, reset
- * the card and make sure it responds.  For the secondary firmware take
- * care of the PDA - read it and then write it on top of the firmware.
- */
 static int
-spectrum_dl_image(hermes_t *hw, struct pcmcia_device *link,
-                 const unsigned char *image, int secondary)
+spectrum_cs_hard_reset(struct orinoco_private *priv)
 {
-       int ret;
-       const unsigned char *ptr;
-       const struct dblock *first_block;
-
-       /* Plug Data Area (PDA) */
-       __le16 pda[PDA_WORDS];
-
-       /* Binary block begins after the 0x1A marker */
-       ptr = image;
-       while (*ptr++ != TEXT_END);
-       first_block = (const struct dblock *) ptr;
-
-       /* Read the PDA */
-       if (secondary) {
-               ret = spectrum_read_pda(hw, pda, sizeof(pda));
-               if (ret)
-                       return ret;
-       }
-
-       /* Stop the firmware, so that it can be safely rewritten */
-       ret = spectrum_reset(link, 1);
-       if (ret)
-               return ret;
-
-       /* Program the adapter with new firmware */
-       ret = spectrum_load_blocks(hw, first_block);
-       if (ret)
-               return ret;
-
-       /* Write the PDA to the adapter */
-       if (secondary) {
-               ret = spectrum_apply_pda(hw, first_block, pda);
-               if (ret)
-                       return ret;
-       }
-
-       /* Run the firmware */
-       ret = spectrum_reset(link, 0);
-       if (ret)
-               return ret;
-
-       /* Reset hermes chip and make sure it responds */
-       ret = hermes_init(hw);
-
-       /* hermes_reset() should return 0 with the secondary firmware */
-       if (secondary && ret != 0)
-               return -ENODEV;
+       struct orinoco_pccard *card = priv->card;
+       struct pcmcia_device *link = card->p_dev;
 
-       /* And this should work with any firmware */
-       if (!hermes_present(hw))
-               return -ENODEV;
+       /* Soft reset using COR and HCR */
+       spectrum_reset(link, 0);
 
        return 0;
 }
 
-
-/*
- * Download the firmware into the card, this also does a PCMCIA soft
- * reset on the card, to make sure it's in a sane state.
- */
 static int
-spectrum_dl_firmware(hermes_t *hw, struct pcmcia_device *link)
-{
-       int ret;
-       const struct firmware *fw_entry;
-
-       if (request_firmware(&fw_entry, primary_fw_name,
-                            &handle_to_dev(link)) != 0) {
-               printk(KERN_ERR PFX "Cannot find firmware: %s\n",
-                      primary_fw_name);
-               return -ENOENT;
-       }
-
-       /* Load primary firmware */
-       ret = spectrum_dl_image(hw, link, fw_entry->data, 0);
-       release_firmware(fw_entry);
-       if (ret) {
-               printk(KERN_ERR PFX "Primary firmware download failed\n");
-               return ret;
-       }
-
-       if (request_firmware(&fw_entry, secondary_fw_name,
-                            &handle_to_dev(link)) != 0) {
-               printk(KERN_ERR PFX "Cannot find firmware: %s\n",
-                      secondary_fw_name);
-               return -ENOENT;
-       }
-
-       /* Load secondary firmware */
-       ret = spectrum_dl_image(hw, link, fw_entry->data, 1);
-       release_firmware(fw_entry);
-       if (ret) {
-               printk(KERN_ERR PFX "Secondary firmware download failed\n");
-       }
-
-       return ret;
-}
-
-/********************************************************************/
-/* Device methods                                                  */
-/********************************************************************/
-
-static int
-spectrum_cs_hard_reset(struct orinoco_private *priv)
+spectrum_cs_stop_firmware(struct orinoco_private *priv, int idle)
 {
        struct orinoco_pccard *card = priv->card;
        struct pcmcia_device *link = card->p_dev;
-       int err;
 
-       if (!hermes_present(&priv->hw)) {
-               /* The firmware needs to be reloaded */
-               if (spectrum_dl_firmware(&priv->hw, link) != 0) {
-                       printk(KERN_ERR PFX "Firmware download failed\n");
-                       err = -ENODEV;
-               }
-       } else {
-               /* Soft reset using COR and HCR */
-               spectrum_reset(link, 0);
-       }
-
-       return 0;
+       return spectrum_reset(link, idle);
 }
 
 /********************************************************************/
@@ -582,7 +182,9 @@ spectrum_cs_probe(struct pcmcia_device *link)
        struct orinoco_private *priv;
        struct orinoco_pccard *card;
 
-       dev = alloc_orinocodev(sizeof(*card), spectrum_cs_hard_reset);
+       dev = alloc_orinocodev(sizeof(*card), &handle_to_dev(link),
+                              spectrum_cs_hard_reset,
+                              spectrum_cs_stop_firmware);
        if (! dev)
                return -ENOMEM;
        priv = netdev_priv(dev);
@@ -784,7 +386,7 @@ spectrum_cs_config(struct pcmcia_device *link)
        dev->irq = link->irq.AssignedIRQ;
        card->node.major = card->node.minor = 0;
 
-       /* Reset card and download firmware */
+       /* Reset card */
        if (spectrum_cs_hard_reset(priv) != 0) {
                goto failed;
        }
index 377141995e36ca70132ecbe7e6ff857d7fe262a1..b6d4e04b8ab4765991fcf22d536349236894dbc7 100644 (file)
@@ -79,7 +79,7 @@ static int pc_debug = PCMCIA_DEBUG;
 module_param(pc_debug, int, 0);
 #define dprintk(n, format, args...) \
        { if (pc_debug > (n)) \
-               printk(KERN_INFO "%s: " format "\n", __FUNCTION__ , ##args); }
+               printk(KERN_INFO "%s: " format "\n", __func__ , ##args); }
 #else
 #define dprintk(n, format, args...)
 #endif
@@ -470,7 +470,7 @@ static int wl3501_pwr_mgmt(struct wl3501_card *this, int suspend)
                        spin_unlock_irqrestore(&this->lock, flags);
                        rc = wait_event_interruptible(this->wait,
                                this->sig_pwr_mgmt_confirm.status != 255);
-                       printk(KERN_INFO "%s: %s status=%d\n", __FUNCTION__,
+                       printk(KERN_INFO "%s: %s status=%d\n", __func__,
                               suspend ? "suspend" : "resume",
                               this->sig_pwr_mgmt_confirm.status);
                        goto out;
@@ -1199,7 +1199,7 @@ static int wl3501_reset_board(struct wl3501_card *this)
                }
                WL3501_NOPLOOP(10);
        }
-       printk(KERN_WARNING "%s: failed to reset the board!\n", __FUNCTION__);
+       printk(KERN_WARNING "%s: failed to reset the board!\n", __func__);
        rc = -ENODEV;
 out:
        return rc;
@@ -1250,7 +1250,7 @@ static int wl3501_init_firmware(struct wl3501_card *this)
 out:
        return rc;
 fail:
-       printk(KERN_WARNING "%s: failed!\n", __FUNCTION__);
+       printk(KERN_WARNING "%s: failed!\n", __func__);
        goto out;
 }
 
index 8a1d93a2bb815c380bb18710369912834c2d2f06..51e5214071da9f32b370c48622d70f9a62f55e5b 100644 (file)
@@ -57,6 +57,15 @@ static ssize_t devspec_show(struct device *dev,
        return sprintf(buf, "%s\n", ofdev->node->full_name);
 }
 
+static ssize_t name_show(struct device *dev,
+                               struct device_attribute *attr, char *buf)
+{
+       struct of_device *ofdev;
+
+       ofdev = to_of_device(dev);
+       return sprintf(buf, "%s\n", ofdev->node->name);
+}
+
 static ssize_t modalias_show(struct device *dev,
                                struct device_attribute *attr, char *buf)
 {
@@ -71,6 +80,7 @@ static ssize_t modalias_show(struct device *dev,
 
 struct device_attribute of_platform_device_attrs[] = {
        __ATTR_RO(devspec),
+       __ATTR_RO(name),
        __ATTR_RO(modalias),
        __ATTR_NULL
 };
index 93e37f0666ab5e2786484a775f107bbffd9b3ecd..e17ef54f0efced2d0173a9f5af250c2f0fa93517 100644 (file)
@@ -382,7 +382,7 @@ EXPORT_SYMBOL_GPL(acpi_get_hp_params_from_firmware);
 int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags)
 {
        acpi_status status;
-       acpi_handle chandle, handle = DEVICE_ACPI_HANDLE(&(dev->dev));
+       acpi_handle chandle, handle;
        struct pci_dev *pdev = dev;
        struct pci_bus *parent;
        struct acpi_buffer string = { ACPI_ALLOCATE_BUFFER, NULL };
@@ -399,10 +399,25 @@ int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags)
         * Per PCI firmware specification, we should run the ACPI _OSC
         * method to get control of hotplug hardware before using it. If
         * an _OSC is missing, we look for an OSHP to do the same thing.
-        * To handle different BIOS behavior, we look for _OSC and OSHP
-        * within the scope of the hotplug controller and its parents,
+        * To handle different BIOS behavior, we look for _OSC on a root
+        * bridge preferentially (according to PCI fw spec). Later for
+        * OSHP within the scope of the hotplug controller and its parents,
         * upto the host bridge under which this controller exists.
         */
+       handle = acpi_find_root_bridge_handle(pdev);
+       if (handle) {
+               acpi_get_name(handle, ACPI_FULL_PATHNAME, &string);
+               dbg("Trying to get hotplug control for %s\n",
+                               (char *)string.pointer);
+               status = pci_osc_control_set(handle, flags);
+               if (ACPI_SUCCESS(status))
+                       goto got_one;
+               kfree(string.pointer);
+               string = (struct acpi_buffer){ ACPI_ALLOCATE_BUFFER, NULL };
+       }
+
+       pdev = dev;
+       handle = DEVICE_ACPI_HANDLE(&dev->dev);
        while (!handle) {
                /*
                 * This hotplug controller was not listed in the ACPI name
@@ -427,15 +442,9 @@ int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags)
                acpi_get_name(handle, ACPI_FULL_PATHNAME, &string);
                dbg("Trying to get hotplug control for %s \n",
                    (char *)string.pointer);
-               status = pci_osc_control_set(handle, flags);
-               if (status == AE_NOT_FOUND)
-                       status = acpi_run_oshp(handle);
-               if (ACPI_SUCCESS(status)) {
-                       dbg("Gained control for hotplug HW for pci %s (%s)\n",
-                           pci_name(dev), (char *)string.pointer);
-                       kfree(string.pointer);
-                       return 0;
-               }
+               status = acpi_run_oshp(handle);
+               if (ACPI_SUCCESS(status))
+                       goto got_one;
                if (acpi_root_bridge(handle))
                        break;
                chandle = handle;
@@ -449,6 +458,11 @@ int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags)
 
        kfree(string.pointer);
        return -ENODEV;
+got_one:
+       dbg("Gained control for hotplug HW for pci %s (%s)\n", pci_name(dev),
+                       (char *)string.pointer);
+       kfree(string.pointer);
+       return 0;
 }
 EXPORT_SYMBOL(acpi_get_hp_hw_control_from_firmware);
 
index 30f581b8791f5f84c6ab72a1f76bf1de8a5a2c87..6dd7b13e9808072bab1bf605ab997d817592efb1 100644 (file)
@@ -36,12 +36,7 @@ int aer_osc_setup(struct pcie_device *pciedev)
        if (acpi_pci_disabled)
                return -1;
 
-       /* Find root host bridge */
-       while (pdev->bus->self)
-               pdev = pdev->bus->self;
-       handle = acpi_get_pci_rootbridge_handle(
-               pci_domain_nr(pdev->bus), pdev->bus->number);
-
+       handle = acpi_find_root_bridge_handle(pdev);
        if (handle) {
                pcie_osc_support_set(OSC_EXT_PCI_CONFIG_SUPPORT);
                status = pci_osc_control_set(handle,
index a04498d390c85fbac5c4ec940b06f501bb076d2d..cce2f4cb1fbf37985d7303ec2e34d9f507d92aee 100644 (file)
@@ -383,6 +383,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
                        res->start = base;
                if (!res->end)
                        res->end = limit + 0xfff;
+               printk(KERN_INFO "PCI: bridge %s io port: [%llx, %llx]\n", pci_name(dev), res->start, res->end);
        }
 
        res = child->resource[1];
@@ -394,6 +395,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
                res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
                res->start = base;
                res->end = limit + 0xfffff;
+               printk(KERN_INFO "PCI: bridge %s 32bit mmio: [%llx, %llx]\n", pci_name(dev), res->start, res->end);
        }
 
        res = child->resource[2];
@@ -429,6 +431,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
                res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH;
                res->start = base;
                res->end = limit + 0xfffff;
+               printk(KERN_INFO "PCI: bridge %s %sbit mmio pref: [%llx, %llx]\n", pci_name(dev), (res->flags & PCI_PREF_RANGE_TYPE_64)?"64":"32",res->start, res->end);
        }
 }
 
index 827c0a520e2b3aec87bcc2a160720fbd48e836b2..82634a2f1b1d82da305e73ef1287330ea0cf01ed 100644 (file)
@@ -530,6 +530,36 @@ void __ref pci_bus_assign_resources(struct pci_bus *bus)
 }
 EXPORT_SYMBOL(pci_bus_assign_resources);
 
+static void pci_bus_dump_res(struct pci_bus *bus)
+{
+        int i;
+
+        for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
+                struct resource *res = bus->resource[i];
+                if (!res)
+                        continue;
+
+               printk(KERN_INFO "bus: %02x index %x %s: [%llx, %llx]\n", bus->number, i, (res->flags & IORESOURCE_IO)? "io port":"mmio", res->start, res->end);
+        }
+}
+
+static void pci_bus_dump_resources(struct pci_bus *bus)
+{
+       struct pci_bus *b;
+       struct pci_dev *dev;
+
+
+       pci_bus_dump_res(bus);
+
+       list_for_each_entry(dev, &bus->devices, bus_list) {
+               b = dev->subordinate;
+               if (!b)
+                       continue;
+
+               pci_bus_dump_resources(b);
+       }
+}
+
 void __init
 pci_assign_unassigned_resources(void)
 {
@@ -545,4 +575,9 @@ pci_assign_unassigned_resources(void)
                pci_bus_assign_resources(bus);
                pci_enable_bridges(bus);
        }
+
+       /* dump the resource on buses */
+       list_for_each_entry(bus, &pci_root_buses, node) {
+               pci_bus_dump_resources(bus);
+       }
 }
index a8771ffc61e843451b5dd4879553111aa161a3ff..e07b5c51ec5bbda422c27bb99c9743b9a1af4b7c 100644 (file)
 
 static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
 {
-       skt->irq = IRQ_GPIO(GPIO_NR_PALMTX_PCMCIA_READY);
+       int ret;
+
+       ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_POWER1, "PCMCIA PWR1");
+       if (ret)
+               goto err1;
+       ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_POWER1, 0);
+       if (ret)
+               goto err2;
+
+       ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_POWER2, "PCMCIA PWR2");
+       if (ret)
+               goto err2;
+       ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_POWER2, 0);
+       if (ret)
+               goto err3;
+
+       ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_RESET, "PCMCIA RST");
+       if (ret)
+               goto err3;
+       ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_RESET, 1);
+       if (ret)
+               goto err4;
+
+       ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_READY, "PCMCIA RDY");
+       if (ret)
+               goto err4;
+       ret = gpio_direction_input(GPIO_NR_PALMTX_PCMCIA_READY);
+       if (ret)
+               goto err5;
+
+       skt->irq = gpio_to_irq(GPIO_NR_PALMTX_PCMCIA_READY);
        return 0;
+
+err5:
+       gpio_free(GPIO_NR_PALMTX_PCMCIA_READY);
+err4:
+       gpio_free(GPIO_NR_PALMTX_PCMCIA_RESET);
+err3:
+       gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER2);
+err2:
+       gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER1);
+err1:
+       return ret;
 }
 
 static void palmtx_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
 {
+       gpio_free(GPIO_NR_PALMTX_PCMCIA_READY);
+       gpio_free(GPIO_NR_PALMTX_PCMCIA_RESET);
+       gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER2);
+       gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER1);
 }
 
 static void palmtx_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
@@ -109,7 +154,7 @@ static void __exit palmtx_pcmcia_exit(void)
        platform_device_unregister(palmtx_pcmcia_device);
 }
 
-fs_initcall(palmtx_pcmcia_init);
+module_init(palmtx_pcmcia_init);
 module_exit(palmtx_pcmcia_exit);
 
 MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>");
index 90ab73825401a0b5f4c0b7de15c5ff755a4edb7d..9a9755c92fada3268f03f69ee7270964bf322818 100644 (file)
@@ -561,7 +561,7 @@ config RTC_DRV_AT91SAM9_GPBR
 
 config RTC_DRV_BFIN
        tristate "Blackfin On-Chip RTC"
-       depends on BLACKFIN
+       depends on BLACKFIN && !BF561
        help
          If you say yes here you will get support for the
          Blackfin On-Chip Real Time Clock.
index a1af4c27939b446b0de1f43d8d61c7a51b610d21..34439ce3967e1844c552091fb72a0555b904644d 100644 (file)
@@ -218,26 +218,6 @@ static irqreturn_t bfin_rtc_interrupt(int irq, void *dev_id)
                return IRQ_NONE;
 }
 
-static int bfin_rtc_open(struct device *dev)
-{
-       int ret;
-
-       dev_dbg_stamp(dev);
-
-       ret = request_irq(IRQ_RTC, bfin_rtc_interrupt, IRQF_SHARED, to_platform_device(dev)->name, dev);
-       if (!ret)
-               bfin_rtc_reset(dev, RTC_ISTAT_WRITE_COMPLETE);
-
-       return ret;
-}
-
-static void bfin_rtc_release(struct device *dev)
-{
-       dev_dbg_stamp(dev);
-       bfin_rtc_reset(dev, 0);
-       free_irq(IRQ_RTC, dev);
-}
-
 static void bfin_rtc_int_set(u16 rtc_int)
 {
        bfin_write_RTC_ISTAT(rtc_int);
@@ -370,8 +350,6 @@ static int bfin_rtc_proc(struct device *dev, struct seq_file *seq)
 }
 
 static struct rtc_class_ops bfin_rtc_ops = {
-       .open          = bfin_rtc_open,
-       .release       = bfin_rtc_release,
        .ioctl         = bfin_rtc_ioctl,
        .read_time     = bfin_rtc_read_time,
        .set_time      = bfin_rtc_set_time,
@@ -383,29 +361,44 @@ static struct rtc_class_ops bfin_rtc_ops = {
 static int __devinit bfin_rtc_probe(struct platform_device *pdev)
 {
        struct bfin_rtc *rtc;
+       struct device *dev = &pdev->dev;
        int ret = 0;
+       unsigned long timeout;
 
-       dev_dbg_stamp(&pdev->dev);
+       dev_dbg_stamp(dev);
 
+       /* Allocate memory for our RTC struct */
        rtc = kzalloc(sizeof(*rtc), GFP_KERNEL);
        if (unlikely(!rtc))
                return -ENOMEM;
+       platform_set_drvdata(pdev, rtc);
+       device_init_wakeup(dev, 1);
 
-       rtc->rtc_dev = rtc_device_register(pdev->name, &pdev->dev, &bfin_rtc_ops, THIS_MODULE);
-       if (IS_ERR(rtc)) {
-               ret = PTR_ERR(rtc->rtc_dev);
+       /* Grab the IRQ and init the hardware */
+       ret = request_irq(IRQ_RTC, bfin_rtc_interrupt, IRQF_SHARED, pdev->name, dev);
+       if (unlikely(ret))
                goto err;
-       }
-
-       /* see comment at top of file about stopwatch/PIE */
+       /* sometimes the bootloader touched things, but the write complete was not
+        * enabled, so let's just do a quick timeout here since the IRQ will not fire ...
+        */
+       timeout = jiffies + HZ;
+       while (bfin_read_RTC_ISTAT() & RTC_ISTAT_WRITE_PENDING)
+               if (time_after(jiffies, timeout))
+                       break;
+       bfin_rtc_reset(dev, RTC_ISTAT_WRITE_COMPLETE);
        bfin_write_RTC_SWCNT(0);
 
-       platform_set_drvdata(pdev, rtc);
-
-       device_init_wakeup(&pdev->dev, 1);
+       /* Register our RTC with the RTC framework */
+       rtc->rtc_dev = rtc_device_register(pdev->name, dev, &bfin_rtc_ops, THIS_MODULE);
+       if (unlikely(IS_ERR(rtc))) {
+               ret = PTR_ERR(rtc->rtc_dev);
+               goto err_irq;
+       }
 
        return 0;
 
+ err_irq:
+       free_irq(IRQ_RTC, dev);
  err:
        kfree(rtc);
        return ret;
@@ -414,7 +407,10 @@ static int __devinit bfin_rtc_probe(struct platform_device *pdev)
 static int __devexit bfin_rtc_remove(struct platform_device *pdev)
 {
        struct bfin_rtc *rtc = platform_get_drvdata(pdev);
+       struct device *dev = &pdev->dev;
 
+       bfin_rtc_reset(dev, 0);
+       free_irq(IRQ_RTC, dev);
        rtc_device_unregister(rtc->rtc_dev);
        platform_set_drvdata(pdev, NULL);
        kfree(rtc);
index 35dcc06eb3e2dab77b16e27881f2b6bd6250c372..f118252f3a9f2b921cef3fff96fd1ef890d65b3c 100644 (file)
@@ -403,11 +403,14 @@ static long rtc_dev_ioctl(struct file *file,
 
 #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
        case RTC_UIE_OFF:
+               mutex_unlock(&rtc->ops_lock);
                clear_uie(rtc);
-               break;
+               return 0;
 
        case RTC_UIE_ON:
+               mutex_unlock(&rtc->ops_lock);
                err = set_uie(rtc);
+               return err;
 #endif
        default:
                err = -ENOTTY;
index 640acd20fdde43c2751f2be4d6d0a63198bf7b7d..a150418fba765d5db942db7bd2ffdb525716367e 100644 (file)
@@ -173,7 +173,7 @@ static int ds1374_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
        int cr, sr;
        int ret = 0;
 
-       if (client->irq < 0)
+       if (client->irq <= 0)
                return -EINVAL;
 
        mutex_lock(&ds1374->mutex);
@@ -212,7 +212,7 @@ static int ds1374_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
        int cr;
        int ret = 0;
 
-       if (client->irq < 0)
+       if (client->irq <= 0)
                return -EINVAL;
 
        ret = ds1374_read_time(dev, &now);
@@ -381,7 +381,7 @@ static int ds1374_probe(struct i2c_client *client,
        if (ret)
                goto out_free;
 
-       if (client->irq >= 0) {
+       if (client->irq > 0) {
                ret = request_irq(client->irq, ds1374_irq, 0,
                                  "ds1374", client);
                if (ret) {
@@ -401,7 +401,7 @@ static int ds1374_probe(struct i2c_client *client,
        return 0;
 
 out_irq:
-       if (client->irq >= 0)
+       if (client->irq > 0)
                free_irq(client->irq, client);
 
 out_free:
@@ -414,7 +414,7 @@ static int __devexit ds1374_remove(struct i2c_client *client)
 {
        struct ds1374 *ds1374 = i2c_get_clientdata(client);
 
-       if (client->irq >= 0) {
+       if (client->irq > 0) {
                mutex_lock(&ds1374->mutex);
                ds1374->exiting = 1;
                mutex_unlock(&ds1374->mutex);
index e7c7b4ebc1fe3c3cebbcce6c1342a2e54145e7f2..2dee69da35cf67f412143dd2c5f190bffcc43cbc 100644 (file)
@@ -376,7 +376,7 @@ static int get_lun(struct scsi_device *sdev, struct rdac_dh_data *h)
                if (inqp->page_id[0] != 'e' || inqp->page_id[1] != 'd' ||
                    inqp->page_id[2] != 'i' || inqp->page_id[3] != 'd')
                        return SCSI_DH_NOSYS;
-               h->lun = scsilun_to_int((struct scsi_lun *)inqp->lun);
+               h->lun = inqp->lun[7]; /* Uses only the last byte */
        }
        return err;
 }
@@ -386,6 +386,7 @@ static int check_ownership(struct scsi_device *sdev, struct rdac_dh_data *h)
        int err;
        struct c9_inquiry *inqp;
 
+       h->lun_state = RDAC_LUN_UNOWNED;
        err = submit_inquiry(sdev, 0xC9, sizeof(struct c9_inquiry), h);
        if (err == SCSI_DH_OK) {
                inqp = &h->inq.c9;
index ae560bc04f9d4df009ad8aef36abfa288dfca2f2..4e0b7c8eb32e731a535b9d2110af3b52f494d78b 100644 (file)
@@ -556,11 +556,12 @@ static void ibmvfc_link_down(struct ibmvfc_host *vhost,
 /**
  * ibmvfc_init_host - Start host initialization
  * @vhost:             ibmvfc host struct
+ * @relogin:   is this a re-login?
  *
  * Return value:
  *     nothing
  **/
-static void ibmvfc_init_host(struct ibmvfc_host *vhost)
+static void ibmvfc_init_host(struct ibmvfc_host *vhost, int relogin)
 {
        struct ibmvfc_target *tgt;
 
@@ -574,6 +575,11 @@ static void ibmvfc_init_host(struct ibmvfc_host *vhost)
        }
 
        if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) {
+               if (!relogin) {
+                       memset(vhost->async_crq.msgs, 0, PAGE_SIZE);
+                       vhost->async_crq.cur = 0;
+               }
+
                list_for_each_entry(tgt, &vhost->targets, queue)
                        tgt->need_login = 1;
                scsi_block_requests(vhost->host);
@@ -1059,9 +1065,10 @@ static void ibmvfc_get_starget_port_id(struct scsi_target *starget)
 static int ibmvfc_wait_while_resetting(struct ibmvfc_host *vhost)
 {
        long timeout = wait_event_timeout(vhost->init_wait_q,
-                                         (vhost->state == IBMVFC_ACTIVE ||
-                                          vhost->state == IBMVFC_HOST_OFFLINE ||
-                                          vhost->state == IBMVFC_LINK_DEAD),
+                                         ((vhost->state == IBMVFC_ACTIVE ||
+                                           vhost->state == IBMVFC_HOST_OFFLINE ||
+                                           vhost->state == IBMVFC_LINK_DEAD) &&
+                                          vhost->action == IBMVFC_HOST_ACTION_NONE),
                                          (init_timeout * HZ));
 
        return timeout ? 0 : -EIO;
@@ -1450,8 +1457,8 @@ static void ibmvfc_scsi_done(struct ibmvfc_event *evt)
        struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd;
        struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->rsp;
        struct scsi_cmnd *cmnd = evt->cmnd;
-       int rsp_len = 0;
-       int sense_len = rsp->fcp_sense_len;
+       u32 rsp_len = 0;
+       u32 sense_len = rsp->fcp_sense_len;
 
        if (cmnd) {
                if (vfc_cmd->response_flags & IBMVFC_ADAPTER_RESID_VALID)
@@ -1468,7 +1475,7 @@ static void ibmvfc_scsi_done(struct ibmvfc_event *evt)
                                rsp_len = rsp->fcp_rsp_len;
                        if ((sense_len + rsp_len) > SCSI_SENSE_BUFFERSIZE)
                                sense_len = SCSI_SENSE_BUFFERSIZE - rsp_len;
-                       if ((rsp->flags & FCP_SNS_LEN_VALID) && rsp->fcp_sense_len)
+                       if ((rsp->flags & FCP_SNS_LEN_VALID) && rsp->fcp_sense_len && rsp_len <= 8)
                                memcpy(cmnd->sense_buffer, rsp->data.sense + rsp_len, sense_len);
 
                        ibmvfc_log_error(evt);
@@ -2077,17 +2084,18 @@ static void ibmvfc_handle_async(struct ibmvfc_async_crq *crq,
 {
        const char *desc = ibmvfc_get_ae_desc(crq->event);
 
-       ibmvfc_log(vhost, 3, "%s event received\n", desc);
+       ibmvfc_log(vhost, 3, "%s event received. scsi_id: %lx, wwpn: %lx,"
+                  " node_name: %lx\n", desc, crq->scsi_id, crq->wwpn, crq->node_name);
 
        switch (crq->event) {
        case IBMVFC_AE_LINK_UP:
        case IBMVFC_AE_RESUME:
                vhost->events_to_log |= IBMVFC_AE_LINKUP;
-               ibmvfc_init_host(vhost);
+               ibmvfc_init_host(vhost, 1);
                break;
        case IBMVFC_AE_SCN_FABRIC:
                vhost->events_to_log |= IBMVFC_AE_RSCN;
-               ibmvfc_init_host(vhost);
+               ibmvfc_init_host(vhost, 1);
                break;
        case IBMVFC_AE_SCN_NPORT:
        case IBMVFC_AE_SCN_GROUP:
@@ -2133,13 +2141,13 @@ static void ibmvfc_handle_crq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost)
                        /* Send back a response */
                        rc = ibmvfc_send_crq_init_complete(vhost);
                        if (rc == 0)
-                               ibmvfc_init_host(vhost);
+                               ibmvfc_init_host(vhost, 0);
                        else
                                dev_err(vhost->dev, "Unable to send init rsp. rc=%ld\n", rc);
                        break;
                case IBMVFC_CRQ_INIT_COMPLETE:
                        dev_info(vhost->dev, "Partner initialization complete\n");
-                       ibmvfc_init_host(vhost);
+                       ibmvfc_init_host(vhost, 0);
                        break;
                default:
                        dev_err(vhost->dev, "Unknown crq message type: %d\n", crq->format);
@@ -3357,8 +3365,6 @@ static void ibmvfc_npiv_login(struct ibmvfc_host *vhost)
        mad->buffer.va = vhost->login_buf_dma;
        mad->buffer.len = sizeof(*vhost->login_buf);
 
-       memset(vhost->async_crq.msgs, 0, PAGE_SIZE);
-       vhost->async_crq.cur = 0;
        ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT);
 
        if (!ibmvfc_send_event(evt, vhost, default_timeout))
@@ -3601,8 +3607,9 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
                        }
                }
 
-               if (vhost->reinit) {
+               if (vhost->reinit && !ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) {
                        vhost->reinit = 0;
+                       scsi_block_requests(vhost->host);
                        ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY);
                } else {
                        ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE);
index 4bf6e374f076b854babc1eae897bd3500cdbed8a..fb3177ab66918382c878fc0289c8bbf4cce9ff95 100644 (file)
@@ -29,8 +29,8 @@
 #include "viosrp.h"
 
 #define IBMVFC_NAME    "ibmvfc"
-#define IBMVFC_DRIVER_VERSION          "1.0.1"
-#define IBMVFC_DRIVER_DATE             "(July 11, 2008)"
+#define IBMVFC_DRIVER_VERSION          "1.0.2"
+#define IBMVFC_DRIVER_DATE             "(August 14, 2008)"
 
 #define IBMVFC_DEFAULT_TIMEOUT 15
 #define IBMVFC_INIT_TIMEOUT            30
index 6b24b9cdb04cda6666837684cd232d271dfc4b10..7b1502c0ab6e5e049a66058be068478ebc5886ec 100644 (file)
@@ -1636,7 +1636,7 @@ static unsigned long ibmvscsi_get_desired_dma(struct vio_dev *vdev)
        unsigned long desired_io = max_requests * sizeof(union viosrp_iu);
 
        /* add io space for sg data */
-       desired_io += (IBMVSCSI_MAX_SECTORS_DEFAULT *
+       desired_io += (IBMVSCSI_MAX_SECTORS_DEFAULT * 512 *
                             IBMVSCSI_CMDS_PER_LUN_DEFAULT);
 
        return desired_io;
index fc7ac158476c5d4bc94ecf08a46f1c8604c032ae..97b763378e7dca9e8de4678eeb013f25ac2da185 100644 (file)
@@ -10,7 +10,7 @@
  *        2 of the License, or (at your option) any later version.
  *
  * FILE                : megaraid_sas.c
- * Version     : v00.00.03.20-rc1
+ * Version     : v00.00.04.01-rc1
  *
  * Authors:
  *     (email-id : megaraidlinux@lsi.com)
@@ -71,6 +71,10 @@ static struct pci_device_id megasas_pci_table[] = {
        /* ppc IOP */
        {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078DE)},
        /* ppc IOP */
+       {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078GEN2)},
+       /* gen2*/
+       {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS0079GEN2)},
+       /* gen2*/
        {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_VERDE_ZCR)},
        /* xscale IOP, vega */
        {PCI_DEVICE(PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DELL_PERC5)},
@@ -198,6 +202,9 @@ megasas_clear_intr_xscale(struct megasas_register_set __iomem * regs)
         */
        writel(status, &regs->outbound_intr_status);
 
+       /* Dummy readl to force pci flush */
+       readl(&regs->outbound_intr_status);
+
        return 0;
 }
 
@@ -293,6 +300,9 @@ megasas_clear_intr_ppc(struct megasas_register_set __iomem * regs)
         */
        writel(status, &regs->outbound_doorbell_clear);
 
+       /* Dummy readl to force pci flush */
+       readl(&regs->outbound_doorbell_clear);
+
        return 0;
 }
 /**
@@ -317,6 +327,99 @@ static struct megasas_instance_template megasas_instance_template_ppc = {
        .read_fw_status_reg = megasas_read_fw_status_reg_ppc,
 };
 
+/**
+*      The following functions are defined for gen2 (deviceid : 0x78 0x79)
+*      controllers
+*/
+
+/**
+ * megasas_enable_intr_gen2 -  Enables interrupts
+ * @regs:                      MFI register set
+ */
+static inline void
+megasas_enable_intr_gen2(struct megasas_register_set __iomem *regs)
+{
+       writel(0xFFFFFFFF, &(regs)->outbound_doorbell_clear);
+
+       /* write ~0x00000005 (4 & 1) to the intr mask*/
+       writel(~MFI_GEN2_ENABLE_INTERRUPT_MASK, &(regs)->outbound_intr_mask);
+
+       /* Dummy readl to force pci flush */
+       readl(&regs->outbound_intr_mask);
+}
+
+/**
+ * megasas_disable_intr_gen2 - Disables interrupt
+ * @regs:                      MFI register set
+ */
+static inline void
+megasas_disable_intr_gen2(struct megasas_register_set __iomem *regs)
+{
+       u32 mask = 0xFFFFFFFF;
+       writel(mask, &regs->outbound_intr_mask);
+       /* Dummy readl to force pci flush */
+       readl(&regs->outbound_intr_mask);
+}
+
+/**
+ * megasas_read_fw_status_reg_gen2 - returns the current FW status value
+ * @regs:                      MFI register set
+ */
+static u32
+megasas_read_fw_status_reg_gen2(struct megasas_register_set __iomem *regs)
+{
+       return readl(&(regs)->outbound_scratch_pad);
+}
+
+/**
+ * megasas_clear_interrupt_gen2 -      Check & clear interrupt
+ * @regs:                              MFI register set
+ */
+static int
+megasas_clear_intr_gen2(struct megasas_register_set __iomem *regs)
+{
+       u32 status;
+       /*
+        * Check if it is our interrupt
+        */
+       status = readl(&regs->outbound_intr_status);
+
+       if (!(status & MFI_GEN2_ENABLE_INTERRUPT_MASK))
+               return 1;
+
+       /*
+        * Clear the interrupt by writing back the same value
+        */
+       writel(status, &regs->outbound_doorbell_clear);
+
+       /* Dummy readl to force pci flush */
+       readl(&regs->outbound_intr_status);
+
+       return 0;
+}
+/**
+ * megasas_fire_cmd_gen2 -     Sends command to the FW
+ * @frame_phys_addr :          Physical address of cmd
+ * @frame_count :              Number of frames for the command
+ * @regs :                     MFI register set
+ */
+static inline void
+megasas_fire_cmd_gen2(dma_addr_t frame_phys_addr, u32 frame_count,
+                       struct megasas_register_set __iomem *regs)
+{
+       writel((frame_phys_addr | (frame_count<<1))|1,
+                       &(regs)->inbound_queue_port);
+}
+
+static struct megasas_instance_template megasas_instance_template_gen2 = {
+
+       .fire_cmd = megasas_fire_cmd_gen2,
+       .enable_intr = megasas_enable_intr_gen2,
+       .disable_intr = megasas_disable_intr_gen2,
+       .clear_intr = megasas_clear_intr_gen2,
+       .read_fw_status_reg = megasas_read_fw_status_reg_gen2,
+};
+
 /**
 *      This is the end of set of functions & definitions
 *      specific to ppc (deviceid : 0x60) controllers
@@ -1976,7 +2079,12 @@ static int megasas_init_mfi(struct megasas_instance *instance)
        /*
         * Map the message registers
         */
-       instance->base_addr = pci_resource_start(instance->pdev, 0);
+       if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS1078GEN2) ||
+               (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0079GEN2)) {
+               instance->base_addr = pci_resource_start(instance->pdev, 1);
+       } else {
+               instance->base_addr = pci_resource_start(instance->pdev, 0);
+       }
 
        if (pci_request_regions(instance->pdev, "megasas: LSI")) {
                printk(KERN_DEBUG "megasas: IO memory region busy!\n");
@@ -1998,6 +2106,10 @@ static int megasas_init_mfi(struct megasas_instance *instance)
                case PCI_DEVICE_ID_LSI_SAS1078DE:
                        instance->instancet = &megasas_instance_template_ppc;
                        break;
+               case PCI_DEVICE_ID_LSI_SAS1078GEN2:
+               case PCI_DEVICE_ID_LSI_SAS0079GEN2:
+                       instance->instancet = &megasas_instance_template_gen2;
+                       break;
                case PCI_DEVICE_ID_LSI_SAS1064R:
                case PCI_DEVICE_ID_DELL_PERC5:
                default:
@@ -2857,6 +2969,7 @@ static void megasas_shutdown(struct pci_dev *pdev)
 {
        struct megasas_instance *instance = pci_get_drvdata(pdev);
        megasas_flush_cache(instance);
+       megasas_shutdown_controller(instance, MR_DCMD_CTRL_SHUTDOWN);
 }
 
 /**
@@ -3292,7 +3405,7 @@ megasas_sysfs_set_dbg_lvl(struct device_driver *dd, const char *buf, size_t coun
        return retval;
 }
 
-static DRIVER_ATTR(dbg_lvl, S_IRUGO|S_IWUGO, megasas_sysfs_show_dbg_lvl,
+static DRIVER_ATTR(dbg_lvl, S_IRUGO|S_IWUSR, megasas_sysfs_show_dbg_lvl,
                megasas_sysfs_set_dbg_lvl);
 
 static ssize_t
index b0c41e67170281428b5725437524826a7a10fd6f..0d033248fdf1dffe5cefc162901aec3fcd487b59 100644 (file)
@@ -18,9 +18,9 @@
 /*
  * MegaRAID SAS Driver meta data
  */
-#define MEGASAS_VERSION                        "00.00.03.20-rc1"
-#define MEGASAS_RELDATE                        "March 10, 2008"
-#define MEGASAS_EXT_VERSION            "Mon. March 10 11:02:31 PDT 2008"
+#define MEGASAS_VERSION                                "00.00.04.01"
+#define MEGASAS_RELDATE                                "July 24, 2008"
+#define MEGASAS_EXT_VERSION                    "Thu July 24 11:41:51 PST 2008"
 
 /*
  * Device IDs
@@ -28,6 +28,8 @@
 #define        PCI_DEVICE_ID_LSI_SAS1078R              0x0060
 #define        PCI_DEVICE_ID_LSI_SAS1078DE             0x007C
 #define        PCI_DEVICE_ID_LSI_VERDE_ZCR             0x0413
+#define        PCI_DEVICE_ID_LSI_SAS1078GEN2           0x0078
+#define        PCI_DEVICE_ID_LSI_SAS0079GEN2           0x0079
 
 /*
  * =====================================
@@ -580,6 +582,8 @@ struct megasas_ctrl_info {
 #define MEGASAS_COMPLETION_TIMER_INTERVAL      (HZ/10)
 
 #define MFI_REPLY_1078_MESSAGE_INTERRUPT       0x80000000
+#define MFI_REPLY_GEN2_MESSAGE_INTERRUPT       0x00000001
+#define MFI_GEN2_ENABLE_INTERRUPT_MASK         (0x00000001 | 0x00000004)
 
 /*
 * register set for both 1068 and 1078 controllers
index a319a20ed440748da301b5a268941d5e57d00294..45e7dcb4b34d8b276edae17cf56a13c749317fa3 100644 (file)
@@ -993,6 +993,17 @@ qla2x00_terminate_rport_io(struct fc_rport *rport)
 {
        fc_port_t *fcport = *(fc_port_t **)rport->dd_data;
 
+       /*
+        * At this point all fcport's software-states are cleared.  Perform any
+        * final cleanup of firmware resources (PCBs and XCBs).
+        */
+       if (fcport->loop_id != FC_NO_LOOP_ID) {
+               fcport->ha->isp_ops->fabric_logout(fcport->ha, fcport->loop_id,
+                   fcport->d_id.b.domain, fcport->d_id.b.area,
+                   fcport->d_id.b.al_pa);
+               fcport->loop_id = FC_NO_LOOP_ID;
+       }
+
        qla2x00_abort_fcport_cmds(fcport);
        scsi_target_unblock(&rport->dev);
 }
index 6da31ba94404f7bf6b48f418a3ba18829569adb8..94a720eabfd83cc491601ba7b53d5bfef82f4ae2 100644 (file)
@@ -2237,6 +2237,7 @@ typedef struct scsi_qla_host {
 #define REGISTER_FDMI_NEEDED   26
 #define FCPORT_UPDATE_NEEDED   27
 #define VP_DPC_NEEDED          28      /* wake up for VP dpc handling */
+#define UNLOADING              29
 
        uint32_t        device_flags;
 #define DFLG_LOCAL_DEVICES             BIT_0
index 601a6b29750c5beec1d52cc1b5638b396073f7f2..ee89ddd64aae17d7098c3aae9614593f7e2c6e03 100644 (file)
@@ -976,8 +976,9 @@ qla2x00_setup_chip(scsi_qla_host_t *ha)
                                    &ha->fw_attributes, &ha->fw_memory_size);
                                qla2x00_resize_request_q(ha);
                                ha->flags.npiv_supported = 0;
-                               if ((IS_QLA24XX(ha) || IS_QLA25XX(ha)) &&
-                                   (ha->fw_attributes & BIT_2)) {
+                               if ((IS_QLA24XX(ha) || IS_QLA25XX(ha) ||
+                                    IS_QLA84XX(ha)) &&
+                                        (ha->fw_attributes & BIT_2)) {
                                        ha->flags.npiv_supported = 1;
                                        if ((!ha->max_npiv_vports) ||
                                            ((ha->max_npiv_vports + 1) %
@@ -3251,6 +3252,7 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
 {
        int rval;
        uint8_t        status = 0;
+       scsi_qla_host_t *vha;
 
        if (ha->flags.online) {
                ha->flags.online = 0;
@@ -3265,6 +3267,8 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
                if (atomic_read(&ha->loop_state) != LOOP_DOWN) {
                        atomic_set(&ha->loop_state, LOOP_DOWN);
                        qla2x00_mark_all_devices_lost(ha, 0);
+                       list_for_each_entry(vha, &ha->vp_list, vp_list)
+                              qla2x00_mark_all_devices_lost(vha, 0);
                } else {
                        if (!atomic_read(&ha->loop_down_timer))
                                atomic_set(&ha->loop_down_timer,
index 874d802edb7de482c79774bd760bdf61a7210ca4..45a3b93eed57aac2617617a79a449df231f51f8f 100644 (file)
@@ -879,11 +879,12 @@ qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t sense_len)
        sp->request_sense_ptr += sense_len;
        sp->request_sense_length -= sense_len;
        if (sp->request_sense_length != 0)
-               sp->ha->status_srb = sp;
+               sp->fcport->ha->status_srb = sp;
 
        DEBUG5(printk("%s(): Check condition Sense data, scsi(%ld:%d:%d:%d) "
-           "cmd=%p pid=%ld\n", __func__, sp->ha->host_no, cp->device->channel,
-           cp->device->id, cp->device->lun, cp, cp->serial_number));
+           "cmd=%p pid=%ld\n", __func__, sp->fcport->ha->host_no,
+           cp->device->channel, cp->device->id, cp->device->lun, cp,
+           cp->serial_number));
        if (sense_len)
                DEBUG5(qla2x00_dump_buffer(cp->sense_buffer,
                    CMD_ACTUAL_SNSLEN(cp)));
@@ -1184,9 +1185,8 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
                    atomic_read(&fcport->state)));
 
                cp->result = DID_BUS_BUSY << 16;
-               if (atomic_read(&fcport->state) == FCS_ONLINE) {
-                       qla2x00_mark_device_lost(ha, fcport, 1, 1);
-               }
+               if (atomic_read(&fcport->state) == FCS_ONLINE)
+                       qla2x00_mark_device_lost(fcport->ha, fcport, 1, 1);
                break;
 
        case CS_RESET:
@@ -1229,7 +1229,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
 
                /* Check to see if logout occurred. */
                if ((le16_to_cpu(sts->status_flags) & SF_LOGOUT_SENT))
-                       qla2x00_mark_device_lost(ha, fcport, 1, 1);
+                       qla2x00_mark_device_lost(fcport->ha, fcport, 1, 1);
                break;
 
        default:
index bc90d6b8d0a0d940bf1114c79c818cebc7ee81c5..813bc7784c0aa8fc6542fbce86ec7e5d8e586662 100644 (file)
@@ -2686,7 +2686,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *ha,
                set_bit(VP_IDX_ACQUIRED, &vha->vp_flags);
                set_bit(VP_DPC_NEEDED, &ha->dpc_flags);
 
-               wake_up_process(ha->dpc_thread);
+               qla2xxx_wake_dpc(ha);
        }
 }
 
index 7c8af7ed2a5dc0d841fa797050d82fd5baefdfb1..26afe44265c794177380eea2b25433d2277761f5 100644 (file)
@@ -780,7 +780,8 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *ha, unsigned int t,
                sp = pha->outstanding_cmds[cnt];
                if (!sp)
                        continue;
-               if (ha->vp_idx != sp->ha->vp_idx)
+
+               if (ha->vp_idx != sp->fcport->ha->vp_idx)
                        continue;
                match = 0;
                switch (type) {
@@ -1080,9 +1081,7 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *ha, int res)
                sp = ha->outstanding_cmds[cnt];
                if (sp) {
                        ha->outstanding_cmds[cnt] = NULL;
-                       sp->flags = 0;
                        sp->cmd->result = res;
-                       sp->cmd->host_scribble = (unsigned char *)NULL;
                        qla2x00_sp_compl(ha, sp);
                }
        }
@@ -1776,10 +1775,15 @@ probe_out:
 static void
 qla2x00_remove_one(struct pci_dev *pdev)
 {
-       scsi_qla_host_t *ha;
+       scsi_qla_host_t *ha, *vha, *temp;
 
        ha = pci_get_drvdata(pdev);
 
+       list_for_each_entry_safe(vha, temp, &ha->vp_list, vp_list)
+               fc_vport_terminate(vha->fc_vport);
+
+       set_bit(UNLOADING, &ha->dpc_flags);
+
        qla2x00_dfs_remove(ha);
 
        qla84xx_put_chip(ha);
@@ -2451,8 +2455,10 @@ qla2x00_do_dpc(void *data)
 void
 qla2xxx_wake_dpc(scsi_qla_host_t *ha)
 {
-       if (ha->dpc_thread)
-               wake_up_process(ha->dpc_thread);
+       struct task_struct *t = ha->dpc_thread;
+
+       if (!test_bit(UNLOADING, &ha->dpc_flags) && t)
+               wake_up_process(t);
 }
 
 /*
index 676c390db354c18c58d816154be7d41f3c8811c8..4160e4caa7b97af229f03b74bb472fb7a4dd53b3 100644 (file)
@@ -7,7 +7,7 @@
 /*
  * Driver version
  */
-#define QLA2XXX_VERSION      "8.02.01-k6"
+#define QLA2XXX_VERSION      "8.02.01-k7"
 
 #define QLA_DRIVER_MAJOR_VER   8
 #define QLA_DRIVER_MINOR_VER   2
index 3b4a14e355c1ac386a39c96ce0993d39ccf9e6b6..77cb34270fc18699ad754c4d848bf27cc7e27942 100644 (file)
@@ -449,6 +449,7 @@ config SERIAL_CLPS711X_CONSOLE
 config SERIAL_SAMSUNG
        tristate "Samsung SoC serial support"
        depends on ARM && PLAT_S3C24XX
+       select SERIAL_CORE
        help
          Support for the on-chip UARTs on the Samsung S3C24XX series CPUs,
          providing /dev/ttySAC0, 1 and 2 (note, some machines may not
index 964124b60db2560b12f15d08dbdeeff43a058e16..75e86865234c924a67bb94d39c3fc259a6925b5a 100644 (file)
@@ -226,10 +226,11 @@ EXPORT_SYMBOL_GPL(spi_alloc_device);
  * Companion function to spi_alloc_device.  Devices allocated with
  * spi_alloc_device can be added onto the spi bus with this function.
  *
- * Returns 0 on success; non-zero on failure
+ * Returns 0 on success; negative errno on failure
  */
 int spi_add_device(struct spi_device *spi)
 {
+       static DEFINE_MUTEX(spi_add_lock);
        struct device *dev = spi->master->dev.parent;
        int status;
 
@@ -246,26 +247,43 @@ int spi_add_device(struct spi_device *spi)
                        "%s.%u", spi->master->dev.bus_id,
                        spi->chip_select);
 
-       /* drivers may modify this initial i/o setup */
+
+       /* We need to make sure there's no other device with this
+        * chipselect **BEFORE** we call setup(), else we'll trash
+        * its configuration.  Lock against concurrent add() calls.
+        */
+       mutex_lock(&spi_add_lock);
+
+       if (bus_find_device_by_name(&spi_bus_type, NULL, spi->dev.bus_id)
+                       != NULL) {
+               dev_err(dev, "chipselect %d already in use\n",
+                               spi->chip_select);
+               status = -EBUSY;
+               goto done;
+       }
+
+       /* Drivers may modify this initial i/o setup, but will
+        * normally rely on the device being setup.  Devices
+        * using SPI_CS_HIGH can't coexist well otherwise...
+        */
        status = spi->master->setup(spi);
        if (status < 0) {
                dev_err(dev, "can't %s %s, status %d\n",
                                "setup", spi->dev.bus_id, status);
-               return status;
+               goto done;
        }
 
-       /* driver core catches callers that misbehave by defining
-        * devices that already exist.
-        */
+       /* Device may be bound to an active driver when this returns */
        status = device_add(&spi->dev);
-       if (status < 0) {
+       if (status < 0)
                dev_err(dev, "can't %s %s, status %d\n",
                                "add", spi->dev.bus_id, status);
-               return status;
-       }
+       else
+               dev_dbg(dev, "registered child %s\n", spi->dev.bus_id);
 
-       dev_dbg(dev, "registered child %s\n", spi->dev.bus_id);
-       return 0;
+done:
+       mutex_unlock(&spi_add_lock);
+       return status;
 }
 EXPORT_SYMBOL_GPL(spi_add_device);
 
index 5fbdc14e63b32d7d5f6df1ebf314df6bdbb35b5b..5416cf9690056a3f72c526255914fe992f00c0f0 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/mbus.h>
-#include <asm/plat-orion/ehci-orion.h>
+#include <plat/ehci-orion.h>
 
 #define rdl(off)       __raw_readl(hcd->regs + (off))
 #define wrl(off, val)  __raw_writel((val), hcd->regs + (off))
index 940467aed13f27864849db15ba36b70e4ad2b846..6d5aa806777e0826b187e8786ee7633d425b83f4 100644 (file)
@@ -733,7 +733,6 @@ static int bfin_bf54x_remove(struct platform_device *pdev)
 static int bfin_bf54x_suspend(struct platform_device *pdev, pm_message_t state)
 {
        struct fb_info *fbinfo = platform_get_drvdata(pdev);
-       struct bfin_bf54xfb_info *info = fbinfo->par;
 
        bfin_write_EPPI0_CONTROL(bfin_read_EPPI0_CONTROL() & ~EPPI_EN);
        disable_dma(CH_EPPI0);
@@ -747,8 +746,18 @@ static int bfin_bf54x_resume(struct platform_device *pdev)
        struct fb_info *fbinfo = platform_get_drvdata(pdev);
        struct bfin_bf54xfb_info *info = fbinfo->par;
 
-       enable_dma(CH_EPPI0);
-       bfin_write_EPPI0_CONTROL(bfin_read_EPPI0_CONTROL() | EPPI_EN);
+       if (info->lq043_open_cnt) {
+
+               bfin_write_EPPI0_CONTROL(0);
+               SSYNC();
+
+               config_dma(info);
+               config_ppi(info);
+
+               /* start dma */
+               enable_dma(CH_EPPI0);
+               bfin_write_EPPI0_CONTROL(bfin_read_EPPI0_CONTROL() | EPPI_EN);
+       }
 
        return 0;
 }
index 59df132cc3756deda96bfcce5d453a309e803a15..4835bdc4e9f1819615ab2454549f9a637d01a0e1 100644 (file)
@@ -114,6 +114,17 @@ static struct vm_operations_struct fb_deferred_io_vm_ops = {
        .page_mkwrite   = fb_deferred_io_mkwrite,
 };
 
+static int fb_deferred_io_set_page_dirty(struct page *page)
+{
+       if (!PageDirty(page))
+               SetPageDirty(page);
+       return 0;
+}
+
+static const struct address_space_operations fb_deferred_io_aops = {
+       .set_page_dirty = fb_deferred_io_set_page_dirty,
+};
+
 static int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma)
 {
        vma->vm_ops = &fb_deferred_io_vm_ops;
@@ -163,6 +174,14 @@ void fb_deferred_io_init(struct fb_info *info)
 }
 EXPORT_SYMBOL_GPL(fb_deferred_io_init);
 
+void fb_deferred_io_open(struct fb_info *info,
+                        struct inode *inode,
+                        struct file *file)
+{
+       file->f_mapping->a_ops = &fb_deferred_io_aops;
+}
+EXPORT_SYMBOL_GPL(fb_deferred_io_open);
+
 void fb_deferred_io_cleanup(struct fb_info *info)
 {
        void *screen_base = (void __force *) info->screen_base;
index 6b487801eeaedc96e8b65a330363156e32452f6c..98843c2ecf733a17e0742109fa63009d47c9b405 100644 (file)
@@ -1344,6 +1344,10 @@ fb_open(struct inode *inode, struct file *file)
                if (res)
                        module_put(info->fbops->owner);
        }
+#ifdef CONFIG_FB_DEFERRED_IO
+       if (info->fbdefio)
+               fb_deferred_io_open(info, inode, file);
+#endif
 out:
        unlock_kernel();
        return res;
index bd320a2bfb7c5ef92b5e803aa30bbb648979da4a..fb51197d1c98e227cabb96e8244585851a366ff2 100644 (file)
@@ -479,6 +479,10 @@ static void adjust_aoi_size_position(struct fb_var_screeninfo *var,
        base_plane_width = machine_data->fsl_diu_info[0]->var.xres;
        base_plane_height = machine_data->fsl_diu_info[0]->var.yres;
 
+       if (mfbi->x_aoi_d < 0)
+               mfbi->x_aoi_d = 0;
+       if (mfbi->y_aoi_d < 0)
+               mfbi->y_aoi_d = 0;
        switch (index) {
        case 0:
                if (mfbi->x_aoi_d != 0)
@@ -777,6 +781,22 @@ static void unmap_video_memory(struct fb_info *info)
        info->fix.smem_len = 0;
 }
 
+/*
+ * Using the fb_var_screeninfo in fb_info we set the aoi of this
+ * particular framebuffer. It is a light version of fsl_diu_set_par.
+ */
+static int fsl_diu_set_aoi(struct fb_info *info)
+{
+       struct fb_var_screeninfo *var = &info->var;
+       struct mfb_info *mfbi = info->par;
+       struct diu_ad *ad = mfbi->ad;
+
+       /* AOI should not be greater than display size */
+       ad->offset_xyi = cpu_to_le32((var->yoffset << 16) | var->xoffset);
+       ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d);
+       return 0;
+}
+
 /*
  * Using the fb_var_screeninfo in fb_info we set the resolution of this
  * particular framebuffer. This function alters the fb_fix_screeninfo stored
@@ -817,11 +837,11 @@ static int fsl_diu_set_par(struct fb_info *info)
                diu_ops.get_pixel_format(var->bits_per_pixel,
                                         machine_data->monitor_port);
        ad->addr    = cpu_to_le32(info->fix.smem_start);
-       ad->src_size_g_alpha = cpu_to_le32((var->yres << 12) |
-                               var->xres) | mfbi->g_alpha;
-       /* fix me. AOI should not be greater than display size */
+       ad->src_size_g_alpha = cpu_to_le32((var->yres_virtual << 12) |
+                               var->xres_virtual) | mfbi->g_alpha;
+       /* AOI should not be greater than display size */
        ad->aoi_size    = cpu_to_le32((var->yres << 16) | var->xres);
-       ad->offset_xyi = 0;
+       ad->offset_xyi = cpu_to_le32((var->yoffset << 16) | var->xoffset);
        ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d);
 
        /* Disable chroma keying function */
@@ -921,6 +941,8 @@ static int fsl_diu_pan_display(struct fb_var_screeninfo *var,
        else
                info->var.vmode &= ~FB_VMODE_YWRAP;
 
+       fsl_diu_set_aoi(info);
+
        return 0;
 }
 
@@ -989,7 +1011,7 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd,
                pr_debug("set AOI display offset of index %d to (%d,%d)\n",
                                 mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d);
                fsl_diu_check_var(&info->var, info);
-               fsl_diu_set_par(info);
+               fsl_diu_set_aoi(info);
                break;
        case MFB_GET_AOID:
                aoi_d.x_aoi_d = mfbi->x_aoi_d;
index 3f1ca2adda3d7353fe41529bb9fa59c1085affa3..c6dd924976a4f105457bd15c205a2938a07eeee3 100644 (file)
@@ -1746,6 +1746,7 @@ static void __devexit pm2fb_remove(struct pci_dev *pdev)
        release_mem_region(fix->mmio_start, fix->mmio_len);
 
        pci_set_drvdata(pdev, NULL);
+       fb_dealloc_cmap(&info->cmap);
        kfree(info->pixmap.addr);
        kfree(info);
 }
index e7aa7ae8fca8e3d3fe89fb6968ed4073bca3b834..97204497d9f7ed10de17f6290c7ac047fd6fabef 100644 (file)
@@ -1031,7 +1031,9 @@ static void pxafb_setup_gpio(struct pxafb_info *fbi)
        pxa_gpio_mode(GPIO74_LCD_FCLK_MD);
        pxa_gpio_mode(GPIO75_LCD_LCLK_MD);
        pxa_gpio_mode(GPIO76_LCD_PCLK_MD);
-       pxa_gpio_mode(GPIO77_LCD_ACBIAS_MD);
+
+       if ((lccr0 & LCCR0_PAS) == 0)
+               pxa_gpio_mode(GPIO77_LCD_ACBIAS_MD);
 }
 
 static void pxafb_enable_controller(struct pxafb_info *fbi)
@@ -1400,6 +1402,8 @@ static void pxafb_decode_mach_info(struct pxafb_info *fbi,
        if (lcd_conn == LCD_MONO_STN_8BPP)
                fbi->lccr0 |= LCCR0_DPD;
 
+       fbi->lccr0 |= (lcd_conn & LCD_ALTERNATE_MAPPING) ? LCCR0_LDDALT : 0;
+
        fbi->lccr3 = LCCR3_Acb((inf->lcd_conn >> 10) & 0xff);
        fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0;
        fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL)  ? LCCR3_PCP : 0;
@@ -1673,53 +1677,63 @@ MODULE_PARM_DESC(options, "LCD parameters (see Documentation/fb/pxafb.txt)");
 #define pxafb_setup_options()          (0)
 #endif
 
-static int __devinit pxafb_probe(struct platform_device *dev)
-{
-       struct pxafb_info *fbi;
-       struct pxafb_mach_info *inf;
-       struct resource *r;
-       int irq, ret;
-
-       dev_dbg(&dev->dev, "pxafb_probe\n");
-
-       inf = dev->dev.platform_data;
-       ret = -ENOMEM;
-       fbi = NULL;
-       if (!inf)
-               goto failed;
-
-       ret = pxafb_parse_options(&dev->dev, g_options);
-       if (ret < 0)
-               goto failed;
-
 #ifdef DEBUG_VAR
-       /* Check for various illegal bit-combinations. Currently only
-        * a warning is given. */
+/* Check for various illegal bit-combinations. Currently only
+ * a warning is given. */
+static void __devinit pxafb_check_options(struct device *dev,
+                                         struct pxafb_mach_info *inf)
+{
+       if (inf->lcd_conn)
+               return;
 
        if (inf->lccr0 & LCCR0_INVALID_CONFIG_MASK)
-               dev_warn(&dev->dev, "machine LCCR0 setting contains "
+               dev_warn(dev, "machine LCCR0 setting contains "
                                "illegal bits: %08x\n",
                        inf->lccr0 & LCCR0_INVALID_CONFIG_MASK);
        if (inf->lccr3 & LCCR3_INVALID_CONFIG_MASK)
-               dev_warn(&dev->dev, "machine LCCR3 setting contains "
+               dev_warn(dev, "machine LCCR3 setting contains "
                                "illegal bits: %08x\n",
                        inf->lccr3 & LCCR3_INVALID_CONFIG_MASK);
        if (inf->lccr0 & LCCR0_DPD &&
            ((inf->lccr0 & LCCR0_PAS) != LCCR0_Pas ||
             (inf->lccr0 & LCCR0_SDS) != LCCR0_Sngl ||
             (inf->lccr0 & LCCR0_CMS) != LCCR0_Mono))
-               dev_warn(&dev->dev, "Double Pixel Data (DPD) mode is "
+               dev_warn(dev, "Double Pixel Data (DPD) mode is "
                                "only valid in passive mono"
                                " single panel mode\n");
        if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Act &&
            (inf->lccr0 & LCCR0_SDS) == LCCR0_Dual)
-               dev_warn(&dev->dev, "Dual panel only valid in passive mode\n");
+               dev_warn(dev, "Dual panel only valid in passive mode\n");
        if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Pas &&
             (inf->modes->upper_margin || inf->modes->lower_margin))
-               dev_warn(&dev->dev, "Upper and lower margins must be 0 in "
+               dev_warn(dev, "Upper and lower margins must be 0 in "
                                "passive mode\n");
+}
+#else
+#define pxafb_check_options(...)       do {} while (0)
 #endif
 
+static int __devinit pxafb_probe(struct platform_device *dev)
+{
+       struct pxafb_info *fbi;
+       struct pxafb_mach_info *inf;
+       struct resource *r;
+       int irq, ret;
+
+       dev_dbg(&dev->dev, "pxafb_probe\n");
+
+       inf = dev->dev.platform_data;
+       ret = -ENOMEM;
+       fbi = NULL;
+       if (!inf)
+               goto failed;
+
+       ret = pxafb_parse_options(&dev->dev, g_options);
+       if (ret < 0)
+               goto failed;
+
+       pxafb_check_options(&dev->dev, inf);
+
        dev_dbg(&dev->dev, "got a %dx%dx%d LCD\n",
                        inf->modes->xres,
                        inf->modes->yres,
index f6ef6cca73cd5390fbde0f2c805893096a9aac08..4c32c06579a04c7826e56f5f5b4f87acf95eeab6 100644 (file)
@@ -595,6 +595,8 @@ static int __init sh_mobile_lcdc_probe(struct platform_device *pdev)
                info->fbops = &sh_mobile_lcdc_ops;
                info->var.xres = info->var.xres_virtual = cfg->lcd_cfg.xres;
                info->var.yres = info->var.yres_virtual = cfg->lcd_cfg.yres;
+               info->var.width = cfg->lcd_size_cfg.width;
+               info->var.height = cfg->lcd_size_cfg.height;
                info->var.activate = FB_ACTIVATE_NOW;
                error = sh_mobile_lcdc_set_bpp(&info->var, cfg->bpp);
                if (error)
index 3da2b90d2fe6add80192c275fc8c8f7d59a1db55..22715e3be5e7558ecc152aa1fdde49b7798d03b3 100644 (file)
@@ -157,8 +157,6 @@ static void s3c2410wdt_start(void)
        writel(wdt_count, wdt_base + S3C2410_WTCNT);
        writel(wtcon, wdt_base + S3C2410_WTCON);
        spin_unlock(&wdt_lock);
-
-       return 0;
 }
 
 static int s3c2410wdt_set_heartbeat(int timeout)
index 56372ecf16909d8dd7c2e37062c044d2aa147c23..dfc0197905ca1e9d50ce8ff613261b141d6f8439 100644 (file)
@@ -914,7 +914,9 @@ static int load_flat_binary(struct linux_binprm * bprm, struct pt_regs * regs)
        /* Stash our initial stack pointer into the mm structure */
        current->mm->start_stack = (unsigned long )sp;
 
-       
+#ifdef FLAT_PLAT_INIT
+       FLAT_PLAT_INIT(regs);
+#endif
        DBG_FLT("start_thread(regs=0x%x, entry=0x%x, start_stack=0x%x)\n",
                (int)regs, (int)start_addr, (int)current->mm->start_stack);
        
index 756205314c24401fc31ebbb6eb7c479aa4c92145..8d7e88e02e0f9cc13207d86ee090a2594f79497b 100644 (file)
@@ -120,8 +120,6 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs)
        if (bprm->misc_bang)
                goto _ret;
 
-       bprm->misc_bang = 1;
-
        /* to keep locking time low, we copy the interpreter string */
        read_lock(&entries_lock);
        fmt = check_file(bprm);
@@ -199,6 +197,8 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs)
        if (retval < 0)
                goto _error;
 
+       bprm->misc_bang = 1;
+
        retval = search_binary_handler (bprm, regs);
        if (retval < 0)
                goto _error;
index e8da4ee761b512af8744c69f3b3361eb9edffef8..25ecbd5b040476bf13716ccfbebc5e8032905bd2 100644 (file)
@@ -175,6 +175,8 @@ out_no_root:
        if (inode)
                iput(inode);
 
+       cifs_umount(sb, cifs_sb);
+
 out_mount_failed:
        if (cifs_sb) {
 #ifdef CONFIG_CIFS_DFS_UPCALL
index 28a22092d4502709fa6d339c40ac2872aca482fa..848286861c314737961cc91f55f3e574930a17a7 100644 (file)
@@ -649,6 +649,7 @@ struct inode *cifs_iget(struct super_block *sb, unsigned long ino)
                inode->i_fop = &simple_dir_operations;
                inode->i_uid = cifs_sb->mnt_uid;
                inode->i_gid = cifs_sb->mnt_gid;
+       } else if (rc) {
                _FreeXid(xid);
                iget_failed(inode);
                return ERR_PTR(rc);
index 0c3b618c15b3f05bd1adee50fada78b7561a36dc..f40423eb1a14e66b73693f5505a54f00b3bd6f4a 100644 (file)
@@ -43,58 +43,13 @@ static DEFINE_MUTEX(read_mutex);
 static int cramfs_iget5_test(struct inode *inode, void *opaque)
 {
        struct cramfs_inode *cramfs_inode = opaque;
-
-       if (inode->i_ino != CRAMINO(cramfs_inode))
-               return 0; /* does not match */
-
-       if (inode->i_ino != 1)
-               return 1;
-
-       /* all empty directories, char, block, pipe, and sock, share inode #1 */
-
-       if ((inode->i_mode != cramfs_inode->mode) ||
-           (inode->i_gid != cramfs_inode->gid) ||
-           (inode->i_uid != cramfs_inode->uid))
-               return 0; /* does not match */
-
-       if ((S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) &&
-           (inode->i_rdev != old_decode_dev(cramfs_inode->size)))
-               return 0; /* does not match */
-
-       return 1; /* matches */
+       return inode->i_ino == CRAMINO(cramfs_inode) && inode->i_ino != 1;
 }
 
 static int cramfs_iget5_set(struct inode *inode, void *opaque)
 {
-       static struct timespec zerotime;
        struct cramfs_inode *cramfs_inode = opaque;
-       inode->i_mode = cramfs_inode->mode;
-       inode->i_uid = cramfs_inode->uid;
-       inode->i_size = cramfs_inode->size;
-       inode->i_blocks = (cramfs_inode->size - 1) / 512 + 1;
-       inode->i_gid = cramfs_inode->gid;
-       /* Struct copy intentional */
-       inode->i_mtime = inode->i_atime = inode->i_ctime = zerotime;
        inode->i_ino = CRAMINO(cramfs_inode);
-       /* inode->i_nlink is left 1 - arguably wrong for directories,
-          but it's the best we can do without reading the directory
-           contents.  1 yields the right result in GNU find, even
-          without -noleaf option. */
-       if (S_ISREG(inode->i_mode)) {
-               inode->i_fop = &generic_ro_fops;
-               inode->i_data.a_ops = &cramfs_aops;
-       } else if (S_ISDIR(inode->i_mode)) {
-               inode->i_op = &cramfs_dir_inode_operations;
-               inode->i_fop = &cramfs_directory_operations;
-       } else if (S_ISLNK(inode->i_mode)) {
-               inode->i_op = &page_symlink_inode_operations;
-               inode->i_data.a_ops = &cramfs_aops;
-       } else {
-               inode->i_size = 0;
-               inode->i_blocks = 0;
-               init_special_inode(inode, inode->i_mode,
-                       old_decode_dev(cramfs_inode->size));
-       }
        return 0;
 }
 
@@ -104,12 +59,48 @@ static struct inode *get_cramfs_inode(struct super_block *sb,
        struct inode *inode = iget5_locked(sb, CRAMINO(cramfs_inode),
                                            cramfs_iget5_test, cramfs_iget5_set,
                                            cramfs_inode);
+       static struct timespec zerotime;
+
        if (inode && (inode->i_state & I_NEW)) {
+               inode->i_mode = cramfs_inode->mode;
+               inode->i_uid = cramfs_inode->uid;
+               inode->i_size = cramfs_inode->size;
+               inode->i_blocks = (cramfs_inode->size - 1) / 512 + 1;
+               inode->i_gid = cramfs_inode->gid;
+               /* Struct copy intentional */
+               inode->i_mtime = inode->i_atime = inode->i_ctime = zerotime;
+               /* inode->i_nlink is left 1 - arguably wrong for directories,
+                  but it's the best we can do without reading the directory
+                  contents.  1 yields the right result in GNU find, even
+                  without -noleaf option. */
+               if (S_ISREG(inode->i_mode)) {
+                       inode->i_fop = &generic_ro_fops;
+                       inode->i_data.a_ops = &cramfs_aops;
+               } else if (S_ISDIR(inode->i_mode)) {
+                       inode->i_op = &cramfs_dir_inode_operations;
+                       inode->i_fop = &cramfs_directory_operations;
+               } else if (S_ISLNK(inode->i_mode)) {
+                       inode->i_op = &page_symlink_inode_operations;
+                       inode->i_data.a_ops = &cramfs_aops;
+               } else {
+                       inode->i_size = 0;
+                       inode->i_blocks = 0;
+                       init_special_inode(inode, inode->i_mode,
+                               old_decode_dev(cramfs_inode->size));
+               }
                unlock_new_inode(inode);
        }
        return inode;
 }
 
+static void cramfs_drop_inode(struct inode *inode)
+{
+       if (inode->i_ino == 1)
+               generic_delete_inode(inode);
+       else
+               generic_drop_inode(inode);
+}
+
 /*
  * We have our own block cache: don't fill up the buffer cache
  * with the rom-image, because the way the filesystem is set
@@ -534,6 +525,7 @@ static const struct super_operations cramfs_ops = {
        .put_super      = cramfs_put_super,
        .remount_fs     = cramfs_remount,
        .statfs         = cramfs_statfs,
+       .drop_inode     = cramfs_drop_inode,
 };
 
 static int cramfs_get_sb(struct file_system_type *fs_type,
index 6d266d793e2caba12ef6b65501ab1db116c50574..80ff3381fa218950b7753db8ac907144f7579e4f 100644 (file)
@@ -562,26 +562,23 @@ static int fat_write_inode(struct inode *inode, int wait)
        struct buffer_head *bh;
        struct msdos_dir_entry *raw_entry;
        loff_t i_pos;
-       int err = 0;
+       int err;
 
 retry:
        i_pos = MSDOS_I(inode)->i_pos;
        if (inode->i_ino == MSDOS_ROOT_INO || !i_pos)
                return 0;
 
-       lock_super(sb);
        bh = sb_bread(sb, i_pos >> sbi->dir_per_block_bits);
        if (!bh) {
                printk(KERN_ERR "FAT: unable to read inode block "
                       "for updating (i_pos %lld)\n", i_pos);
-               err = -EIO;
-               goto out;
+               return -EIO;
        }
        spin_lock(&sbi->inode_hash_lock);
        if (i_pos != MSDOS_I(inode)->i_pos) {
                spin_unlock(&sbi->inode_hash_lock);
                brelse(bh);
-               unlock_super(sb);
                goto retry;
        }
 
@@ -607,11 +604,10 @@ retry:
        }
        spin_unlock(&sbi->inode_hash_lock);
        mark_buffer_dirty(bh);
+       err = 0;
        if (wait)
                err = sync_dirty_buffer(bh);
        brelse(bh);
-out:
-       unlock_super(sb);
        return err;
 }
 
index b6726f6445303fd745ce5faab01aa2d8b924e90e..0487ddba139780a4e0bfabc8f4ef2103358d9713 100644 (file)
@@ -166,6 +166,7 @@ static struct inode *alloc_inode(struct super_block *sb)
                mapping_set_gfp_mask(mapping, GFP_HIGHUSER_PAGECACHE);
                mapping->assoc_mapping = NULL;
                mapping->backing_dev_info = &default_backing_dev_info;
+               mapping->writeback_index = 0;
 
                /*
                 * If the block_device provides a backing_dev_info for client
index c4a1c3c65aac35ba999a4739fb3ed6549b5e1b75..da3cc460d4df4d16f3afb81fea786589948a2c18 100644 (file)
@@ -115,11 +115,11 @@ asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
                                pgrp = task_pgrp(current);
                        else
                                pgrp = find_vpid(who);
-                       do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
+                       do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
                                ret = set_task_ioprio(p, ioprio);
                                if (ret)
                                        break;
-                       } while_each_pid_task(pgrp, PIDTYPE_PGID, p);
+                       } while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
                        break;
                case IOPRIO_WHO_USER:
                        if (!who)
@@ -204,7 +204,7 @@ asmlinkage long sys_ioprio_get(int which, int who)
                                pgrp = task_pgrp(current);
                        else
                                pgrp = find_vpid(who);
-                       do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
+                       do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
                                tmpio = get_task_ioprio(p);
                                if (tmpio < 0)
                                        continue;
@@ -212,7 +212,7 @@ asmlinkage long sys_ioprio_get(int which, int who)
                                        ret = tmpio;
                                else
                                        ret = ioprio_best(ret, tmpio);
-                       } while_each_pid_task(pgrp, PIDTYPE_PGID, p);
+                       } while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
                        break;
                case IOPRIO_WHO_USER:
                        if (!who)
index 697663b01bae5dad4ef557fa3ed62a27c2d38a0c..e1c0ec0ae9892b2610784420d4b080e9f0b154e8 100644 (file)
@@ -92,7 +92,7 @@ int omfs_allocate_block(struct super_block *sb, u64 block)
        struct buffer_head *bh;
        struct omfs_sb_info *sbi = OMFS_SB(sb);
        int bits_per_entry = 8 * sb->s_blocksize;
-       int map, bit;
+       unsigned int map, bit;
        int ret = 0;
        u64 tmp;
 
@@ -176,7 +176,8 @@ int omfs_clear_range(struct super_block *sb, u64 block, int count)
        struct omfs_sb_info *sbi = OMFS_SB(sb);
        int bits_per_entry = 8 * sb->s_blocksize;
        u64 tmp;
-       int map, bit, ret;
+       unsigned int map, bit;
+       int ret;
 
        tmp = block;
        bit = do_div(tmp, bits_per_entry);
index 7e2499053e4d43a08ab07811a44516ab2e61b66d..834b2331f6b3e351fc885d73068632442474494f 100644 (file)
@@ -26,6 +26,13 @@ static int omfs_sync_file(struct file *file, struct dentry *dentry,
        return err ? -EIO : 0;
 }
 
+static u32 omfs_max_extents(struct omfs_sb_info *sbi, int offset)
+{
+       return (sbi->s_sys_blocksize - offset -
+               sizeof(struct omfs_extent)) /
+               sizeof(struct omfs_extent_entry) + 1;
+}
+
 void omfs_make_empty_table(struct buffer_head *bh, int offset)
 {
        struct omfs_extent *oe = (struct omfs_extent *) &bh->b_data[offset];
@@ -45,6 +52,7 @@ int omfs_shrink_inode(struct inode *inode)
        struct buffer_head *bh;
        u64 next, last;
        u32 extent_count;
+       u32 max_extents;
        int ret;
 
        /* traverse extent table, freeing each entry that is greater
@@ -62,15 +70,18 @@ int omfs_shrink_inode(struct inode *inode)
                goto out;
 
        oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]);
+       max_extents = omfs_max_extents(sbi, OMFS_EXTENT_START);
 
        for (;;) {
 
-               if (omfs_is_bad(sbi, (struct omfs_header *) bh->b_data, next)) {
-                       brelse(bh);
-                       goto out;
-               }
+               if (omfs_is_bad(sbi, (struct omfs_header *) bh->b_data, next))
+                       goto out_brelse;
 
                extent_count = be32_to_cpu(oe->e_extent_count);
+
+               if (extent_count > max_extents)
+                       goto out_brelse;
+
                last = next;
                next = be64_to_cpu(oe->e_next);
                entry = &oe->e_entry;
@@ -98,10 +109,14 @@ int omfs_shrink_inode(struct inode *inode)
                if (!bh)
                        goto out;
                oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]);
+               max_extents = omfs_max_extents(sbi, OMFS_EXTENT_CONT);
        }
        ret = 0;
 out:
        return ret;
+out_brelse:
+       brelse(bh);
+       return ret;
 }
 
 static void omfs_truncate(struct inode *inode)
@@ -154,9 +169,7 @@ static int omfs_grow_extent(struct inode *inode, struct omfs_extent *oe,
                        goto out;
                }
        }
-       max_count = (sbi->s_sys_blocksize - OMFS_EXTENT_START -
-               sizeof(struct omfs_extent)) /
-               sizeof(struct omfs_extent_entry) + 1;
+       max_count = omfs_max_extents(sbi, OMFS_EXTENT_START);
 
        /* TODO: add a continuation block here */
        if (be32_to_cpu(oe->e_extent_count) > max_count-1)
@@ -225,6 +238,7 @@ static int omfs_get_block(struct inode *inode, sector_t block,
        sector_t next, offset;
        int ret;
        u64 new_block;
+       u32 max_extents;
        int extent_count;
        struct omfs_extent *oe;
        struct omfs_extent_entry *entry;
@@ -238,6 +252,7 @@ static int omfs_get_block(struct inode *inode, sector_t block,
                goto out;
 
        oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]);
+       max_extents = omfs_max_extents(sbi, OMFS_EXTENT_START);
        next = inode->i_ino;
 
        for (;;) {
@@ -249,6 +264,9 @@ static int omfs_get_block(struct inode *inode, sector_t block,
                next = be64_to_cpu(oe->e_next);
                entry = &oe->e_entry;
 
+               if (extent_count > max_extents)
+                       goto out_brelse;
+
                offset = find_block(inode, entry, block, extent_count, &remain);
                if (offset > 0) {
                        ret = 0;
@@ -266,6 +284,7 @@ static int omfs_get_block(struct inode *inode, sector_t block,
                if (!bh)
                        goto out;
                oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]);
+               max_extents = omfs_max_extents(sbi, OMFS_EXTENT_CONT);
        }
        if (create) {
                ret = omfs_grow_extent(inode, oe, &new_block);
index a95fe5984f4b24b5dc89ee2a94e424d2e97af0d3..d29047b1b9b065a68c6ee7792d8007821736b852 100644 (file)
@@ -232,8 +232,7 @@ struct inode *omfs_iget(struct super_block *sb, ino_t ino)
                inode->i_mode = S_IFDIR | (S_IRWXUGO & ~sbi->s_dmask);
                inode->i_op = &omfs_dir_inops;
                inode->i_fop = &omfs_dir_operations;
-               inode->i_size = be32_to_cpu(oi->i_head.h_body_size) +
-                       sizeof(struct omfs_header);
+               inode->i_size = sbi->s_sys_blocksize;
                inc_nlink(inode);
                break;
        case OMFS_FILE:
index 79ecd281d2cbf1e1db1484ffe4b24413bc6f9e63..3f87d2632947371b47df580c32d041fb39bb91ba 100644 (file)
@@ -52,14 +52,14 @@ int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma)
        }
 
        seq_printf(m,
-                  "%08lx-%08lx %c%c%c%c %08lx %02x:%02x %lu %n",
+                  "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n",
                   vma->vm_start,
                   vma->vm_end,
                   flags & VM_READ ? 'r' : '-',
                   flags & VM_WRITE ? 'w' : '-',
                   flags & VM_EXEC ? 'x' : '-',
                   flags & VM_MAYSHARE ? flags & VM_SHARED ? 'S' : 's' : 'p',
-                  vma->vm_pgoff << PAGE_SHIFT,
+                  ((loff_t)vma->vm_pgoff) << PAGE_SHIFT,
                   MAJOR(dev), MINOR(dev), ino, &len);
 
        if (file) {
index 7546a918f7907612b078c411d8eeb288b099ffc2..73d1891ee6259e41f5be2f1d8d2a16948887097d 100644 (file)
@@ -219,14 +219,14 @@ static int show_map(struct seq_file *m, void *v)
                ino = inode->i_ino;
        }
 
-       seq_printf(m, "%08lx-%08lx %c%c%c%c %08lx %02x:%02x %lu %n",
+       seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n",
                        vma->vm_start,
                        vma->vm_end,
                        flags & VM_READ ? 'r' : '-',
                        flags & VM_WRITE ? 'w' : '-',
                        flags & VM_EXEC ? 'x' : '-',
                        flags & VM_MAYSHARE ? 's' : 'p',
-                       vma->vm_pgoff << PAGE_SHIFT,
+                       ((loff_t)vma->vm_pgoff) << PAGE_SHIFT,
                        MAJOR(dev), MINOR(dev), ino, &len);
 
        /*
index d81fb9ed2b8e28e5e0317d5ca9a626cd08762b3e..1540981574738e45b4585c27d9cf5a8f43df21c9 100644 (file)
@@ -263,8 +263,8 @@ int ubifs_calc_min_idx_lebs(struct ubifs_info *c)
 
        idx_size = c->old_idx_sz + c->budg_idx_growth + c->budg_uncommitted_idx;
 
-       /* And make sure we have twice the index size of space reserved */
-       idx_size <<= 1;
+       /* And make sure we have thrice the index size of space reserved */
+       idx_size = idx_size + (idx_size << 1);
 
        /*
         * We do not maintain 'old_idx_size' as 'old_idx_lebs'/'old_idx_bytes'
@@ -388,11 +388,11 @@ static int can_use_rp(struct ubifs_info *c)
  * This function makes sure UBIFS has enough free eraseblocks for index growth
  * and data.
  *
- * When budgeting index space, UBIFS reserves twice as more LEBs as the index
+ * When budgeting index space, UBIFS reserves thrice as many LEBs as the index
  * would take if it was consolidated and written to the flash. This guarantees
  * that the "in-the-gaps" commit method always succeeds and UBIFS will always
  * be able to commit dirty index. So this function basically adds amount of
- * budgeted index space to the size of the current index, multiplies this by 2,
+ * budgeted index space to the size of the current index, multiplies this by 3,
  * and makes sure this does not exceed the amount of free eraseblocks.
  *
  * Notes about @c->min_idx_lebs and @c->lst.idx_lebs variables:
@@ -543,8 +543,16 @@ int ubifs_budget_space(struct ubifs_info *c, struct ubifs_budget_req *req)
        int err, idx_growth, data_growth, dd_growth;
        struct retries_info ri;
 
+       ubifs_assert(req->new_page <= 1);
+       ubifs_assert(req->dirtied_page <= 1);
+       ubifs_assert(req->new_dent <= 1);
+       ubifs_assert(req->mod_dent <= 1);
+       ubifs_assert(req->new_ino <= 1);
+       ubifs_assert(req->new_ino_d <= UBIFS_MAX_INO_DATA);
        ubifs_assert(req->dirtied_ino <= 4);
        ubifs_assert(req->dirtied_ino_d <= UBIFS_MAX_INO_DATA * 4);
+       ubifs_assert(!(req->new_ino_d & 7));
+       ubifs_assert(!(req->dirtied_ino_d & 7));
 
        data_growth = calc_data_growth(c, req);
        dd_growth = calc_dd_growth(c, req);
@@ -618,8 +626,16 @@ again:
  */
 void ubifs_release_budget(struct ubifs_info *c, struct ubifs_budget_req *req)
 {
+       ubifs_assert(req->new_page <= 1);
+       ubifs_assert(req->dirtied_page <= 1);
+       ubifs_assert(req->new_dent <= 1);
+       ubifs_assert(req->mod_dent <= 1);
+       ubifs_assert(req->new_ino <= 1);
+       ubifs_assert(req->new_ino_d <= UBIFS_MAX_INO_DATA);
        ubifs_assert(req->dirtied_ino <= 4);
        ubifs_assert(req->dirtied_ino_d <= UBIFS_MAX_INO_DATA * 4);
+       ubifs_assert(!(req->new_ino_d & 7));
+       ubifs_assert(!(req->dirtied_ino_d & 7));
        if (!req->recalculate) {
                ubifs_assert(req->idx_growth >= 0);
                ubifs_assert(req->data_growth >= 0);
@@ -647,7 +663,11 @@ void ubifs_release_budget(struct ubifs_info *c, struct ubifs_budget_req *req)
 
        ubifs_assert(c->budg_idx_growth >= 0);
        ubifs_assert(c->budg_data_growth >= 0);
+       ubifs_assert(c->budg_dd_growth >= 0);
        ubifs_assert(c->min_idx_lebs < c->main_lebs);
+       ubifs_assert(!(c->budg_idx_growth & 7));
+       ubifs_assert(!(c->budg_data_growth & 7));
+       ubifs_assert(!(c->budg_dd_growth & 7));
        spin_unlock(&c->space_lock);
 }
 
@@ -686,9 +706,10 @@ void ubifs_convert_page_budget(struct ubifs_info *c)
 void ubifs_release_dirty_inode_budget(struct ubifs_info *c,
                                      struct ubifs_inode *ui)
 {
-       struct ubifs_budget_req req = {.dd_growth = c->inode_budget,
-                                      .dirtied_ino_d = ui->data_len};
+       struct ubifs_budget_req req;
 
+       memset(&req, 0, sizeof(struct ubifs_budget_req));
+       req.dd_growth = c->inode_budget + ALIGN(ui->data_len, 8);
        ubifs_release_budget(c, &req);
 }
 
index 3b516316c9b39cdfab996b8cd6245c9cca6d4a18..0a6aa2cc78f07eb7e0aa4ce6af2dfe8b5fe32ca5 100644 (file)
@@ -74,6 +74,7 @@ static int do_commit(struct ubifs_info *c)
                        goto out_up;
        }
 
+       c->cmt_no += 1;
        err = ubifs_gc_start_commit(c);
        if (err)
                goto out_up;
@@ -115,7 +116,7 @@ static int do_commit(struct ubifs_info *c)
                goto out;
 
        mutex_lock(&c->mst_mutex);
-       c->mst_node->cmt_no      = cpu_to_le64(++c->cmt_no);
+       c->mst_node->cmt_no      = cpu_to_le64(c->cmt_no);
        c->mst_node->log_lnum    = cpu_to_le32(new_ltail_lnum);
        c->mst_node->root_lnum   = cpu_to_le32(zroot.lnum);
        c->mst_node->root_offs   = cpu_to_le32(zroot.offs);
index 4e3aaeba4eca835c0afaac2cfc384edf1428d53f..b9cb77473758563314980e00c5144a84c9ccfdaf 100644 (file)
@@ -568,8 +568,8 @@ void dbg_dump_budget_req(const struct ubifs_budget_req *req)
 void dbg_dump_lstats(const struct ubifs_lp_stats *lst)
 {
        spin_lock(&dbg_lock);
-       printk(KERN_DEBUG "Lprops statistics: empty_lebs %d, idx_lebs  %d\n",
-              lst->empty_lebs, lst->idx_lebs);
+       printk(KERN_DEBUG "(pid %d) Lprops statistics: empty_lebs %d, "
+              "idx_lebs  %d\n", current->pid, lst->empty_lebs, lst->idx_lebs);
        printk(KERN_DEBUG "\ttaken_empty_lebs %d, total_free %lld, "
               "total_dirty %lld\n", lst->taken_empty_lebs, lst->total_free,
               lst->total_dirty);
@@ -587,8 +587,8 @@ void dbg_dump_budg(struct ubifs_info *c)
        struct ubifs_gced_idx_leb *idx_gc;
 
        spin_lock(&dbg_lock);
-       printk(KERN_DEBUG "Budgeting info: budg_data_growth %lld, "
-              "budg_dd_growth %lld, budg_idx_growth %lld\n",
+       printk(KERN_DEBUG "(pid %d) Budgeting info: budg_data_growth %lld, "
+              "budg_dd_growth %lld, budg_idx_growth %lld\n", current->pid,
               c->budg_data_growth, c->budg_dd_growth, c->budg_idx_growth);
        printk(KERN_DEBUG "\tdata budget sum %lld, total budget sum %lld, "
               "freeable_cnt %d\n", c->budg_data_growth + c->budg_dd_growth,
@@ -634,7 +634,7 @@ void dbg_dump_lprops(struct ubifs_info *c)
        struct ubifs_lprops lp;
        struct ubifs_lp_stats lst;
 
-       printk(KERN_DEBUG "Dumping LEB properties\n");
+       printk(KERN_DEBUG "(pid %d) Dumping LEB properties\n", current->pid);
        ubifs_get_lp_stats(c, &lst);
        dbg_dump_lstats(&lst);
 
@@ -655,7 +655,7 @@ void dbg_dump_leb(const struct ubifs_info *c, int lnum)
        if (dbg_failure_mode)
                return;
 
-       printk(KERN_DEBUG "Dumping LEB %d\n", lnum);
+       printk(KERN_DEBUG "(pid %d) Dumping LEB %d\n", current->pid, lnum);
 
        sleb = ubifs_scan(c, lnum, 0, c->dbg_buf);
        if (IS_ERR(sleb)) {
@@ -720,8 +720,8 @@ void dbg_dump_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, int cat)
 {
        int i;
 
-       printk(KERN_DEBUG "Dumping heap cat %d (%d elements)\n",
-              cat, heap->cnt);
+       printk(KERN_DEBUG "(pid %d) Dumping heap cat %d (%d elements)\n",
+              current->pid, cat, heap->cnt);
        for (i = 0; i < heap->cnt; i++) {
                struct ubifs_lprops *lprops = heap->arr[i];
 
@@ -736,7 +736,7 @@ void dbg_dump_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode,
 {
        int i;
 
-       printk(KERN_DEBUG "Dumping pnode:\n");
+       printk(KERN_DEBUG "(pid %d) Dumping pnode:\n", current->pid);
        printk(KERN_DEBUG "\taddress %zx parent %zx cnext %zx\n",
               (size_t)pnode, (size_t)parent, (size_t)pnode->cnext);
        printk(KERN_DEBUG "\tflags %lu iip %d level %d num %d\n",
@@ -755,7 +755,7 @@ void dbg_dump_tnc(struct ubifs_info *c)
        int level;
 
        printk(KERN_DEBUG "\n");
-       printk(KERN_DEBUG "Dumping the TNC tree\n");
+       printk(KERN_DEBUG "(pid %d) Dumping the TNC tree\n", current->pid);
        znode = ubifs_tnc_levelorder_next(c->zroot.znode, NULL);
        level = znode->level;
        printk(KERN_DEBUG "== Level %d ==\n", level);
@@ -2208,16 +2208,17 @@ int dbg_leb_read(struct ubi_volume_desc *desc, int lnum, char *buf, int offset,
 int dbg_leb_write(struct ubi_volume_desc *desc, int lnum, const void *buf,
                  int offset, int len, int dtype)
 {
-       int err;
+       int err, failing;
 
        if (in_failure_mode(desc))
                return -EIO;
-       if (do_fail(desc, lnum, 1))
+       failing = do_fail(desc, lnum, 1);
+       if (failing)
                cut_data(buf, len);
        err = ubi_leb_write(desc, lnum, buf, offset, len, dtype);
        if (err)
                return err;
-       if (in_failure_mode(desc))
+       if (failing)
                return -EIO;
        return 0;
 }
index 3c4f1e93c9e0336c4a4374b0be0b39ed81c9c890..50315fc571859098b34a0de156ea36f77d7e11d1 100644 (file)
@@ -27,7 +27,7 @@
 
 #define UBIFS_DBG(op) op
 
-#define ubifs_assert(expr)  do {                                               \
+#define ubifs_assert(expr) do {                                                \
        if (unlikely(!(expr))) {                                               \
                printk(KERN_CRIT "UBIFS assert failed in %s at %u (pid %d)\n", \
                       __func__, __LINE__, current->pid);                      \
@@ -73,50 +73,50 @@ const char *dbg_key_str1(const struct ubifs_info *c,
                         const union ubifs_key *key);
 
 /*
- * DBGKEY macros require dbg_lock to be held, which it is in the dbg message
+ * DBGKEY macros require @dbg_lock to be held, which it is in the dbg message
  * macros.
  */
 #define DBGKEY(key) dbg_key_str0(c, (key))
 #define DBGKEY1(key) dbg_key_str1(c, (key))
 
 /* General messages */
-#define dbg_gen(fmt, ...)        dbg_do_msg(UBIFS_MSG_GEN, fmt, ##__VA_ARGS__)
+#define dbg_gen(fmt, ...)   dbg_do_msg(UBIFS_MSG_GEN, fmt, ##__VA_ARGS__)
 
 /* Additional journal messages */
-#define dbg_jnl(fmt, ...)        dbg_do_msg(UBIFS_MSG_JNL, fmt, ##__VA_ARGS__)
+#define dbg_jnl(fmt, ...)   dbg_do_msg(UBIFS_MSG_JNL, fmt, ##__VA_ARGS__)
 
 /* Additional TNC messages */
-#define dbg_tnc(fmt, ...)        dbg_do_msg(UBIFS_MSG_TNC, fmt, ##__VA_ARGS__)
+#define dbg_tnc(fmt, ...)   dbg_do_msg(UBIFS_MSG_TNC, fmt, ##__VA_ARGS__)
 
 /* Additional lprops messages */
-#define dbg_lp(fmt, ...)         dbg_do_msg(UBIFS_MSG_LP, fmt, ##__VA_ARGS__)
+#define dbg_lp(fmt, ...)    dbg_do_msg(UBIFS_MSG_LP, fmt, ##__VA_ARGS__)
 
 /* Additional LEB find messages */
-#define dbg_find(fmt, ...)       dbg_do_msg(UBIFS_MSG_FIND, fmt, ##__VA_ARGS__)
+#define dbg_find(fmt, ...)  dbg_do_msg(UBIFS_MSG_FIND, fmt, ##__VA_ARGS__)
 
 /* Additional mount messages */
-#define dbg_mnt(fmt, ...)        dbg_do_msg(UBIFS_MSG_MNT, fmt, ##__VA_ARGS__)
+#define dbg_mnt(fmt, ...)   dbg_do_msg(UBIFS_MSG_MNT, fmt, ##__VA_ARGS__)
 
 /* Additional I/O messages */
-#define dbg_io(fmt, ...)         dbg_do_msg(UBIFS_MSG_IO, fmt, ##__VA_ARGS__)
+#define dbg_io(fmt, ...)    dbg_do_msg(UBIFS_MSG_IO, fmt, ##__VA_ARGS__)
 
 /* Additional commit messages */
-#define dbg_cmt(fmt, ...)        dbg_do_msg(UBIFS_MSG_CMT, fmt, ##__VA_ARGS__)
+#define dbg_cmt(fmt, ...)   dbg_do_msg(UBIFS_MSG_CMT, fmt, ##__VA_ARGS__)
 
 /* Additional budgeting messages */
-#define dbg_budg(fmt, ...)       dbg_do_msg(UBIFS_MSG_BUDG, fmt, ##__VA_ARGS__)
+#define dbg_budg(fmt, ...)  dbg_do_msg(UBIFS_MSG_BUDG, fmt, ##__VA_ARGS__)
 
 /* Additional log messages */
-#define dbg_log(fmt, ...)        dbg_do_msg(UBIFS_MSG_LOG, fmt, ##__VA_ARGS__)
+#define dbg_log(fmt, ...)   dbg_do_msg(UBIFS_MSG_LOG, fmt, ##__VA_ARGS__)
 
 /* Additional gc messages */
-#define dbg_gc(fmt, ...)         dbg_do_msg(UBIFS_MSG_GC, fmt, ##__VA_ARGS__)
+#define dbg_gc(fmt, ...)    dbg_do_msg(UBIFS_MSG_GC, fmt, ##__VA_ARGS__)
 
 /* Additional scan messages */
-#define dbg_scan(fmt, ...)       dbg_do_msg(UBIFS_MSG_SCAN, fmt, ##__VA_ARGS__)
+#define dbg_scan(fmt, ...)  dbg_do_msg(UBIFS_MSG_SCAN, fmt, ##__VA_ARGS__)
 
 /* Additional recovery messages */
-#define dbg_rcvry(fmt, ...)      dbg_do_msg(UBIFS_MSG_RCVRY, fmt, ##__VA_ARGS__)
+#define dbg_rcvry(fmt, ...) dbg_do_msg(UBIFS_MSG_RCVRY, fmt, ##__VA_ARGS__)
 
 /*
  * Debugging message type flags (must match msg_type_names in debug.c).
@@ -239,34 +239,23 @@ typedef int (*dbg_leaf_callback)(struct ubifs_info *c,
                                 struct ubifs_zbranch *zbr, void *priv);
 typedef int (*dbg_znode_callback)(struct ubifs_info *c,
                                  struct ubifs_znode *znode, void *priv);
-
 int dbg_walk_index(struct ubifs_info *c, dbg_leaf_callback leaf_cb,
                   dbg_znode_callback znode_cb, void *priv);
 
 /* Checking functions */
 
 int dbg_check_lprops(struct ubifs_info *c);
-
 int dbg_old_index_check_init(struct ubifs_info *c, struct ubifs_zbranch *zroot);
 int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot);
-
 int dbg_check_cats(struct ubifs_info *c);
-
 int dbg_check_ltab(struct ubifs_info *c);
-
 int dbg_check_synced_i_size(struct inode *inode);
-
 int dbg_check_dir_size(struct ubifs_info *c, const struct inode *dir);
-
 int dbg_check_tnc(struct ubifs_info *c, int extra);
-
 int dbg_check_idx_size(struct ubifs_info *c, long long idx_size);
-
 int dbg_check_filesystem(struct ubifs_info *c);
-
 void dbg_check_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, int cat,
                    int add_pos);
-
 int dbg_check_lprops(struct ubifs_info *c);
 int dbg_check_lpt_nodes(struct ubifs_info *c, struct ubifs_cnode *cnode,
                        int row, int col);
@@ -329,71 +318,77 @@ static inline int dbg_change(struct ubi_volume_desc *desc, int lnum,
 #else /* !CONFIG_UBIFS_FS_DEBUG */
 
 #define UBIFS_DBG(op)
-#define ubifs_assert(expr)                         ({})
-#define ubifs_assert_cmt_locked(c)
+
+/* Use "if (0)" to make compiler check arguments even if debugging is off */
+#define ubifs_assert(expr)  do {                                               \
+       if (0 && (expr))                                                       \
+               printk(KERN_CRIT "UBIFS assert failed in %s at %u (pid %d)\n", \
+                      __func__, __LINE__, current->pid);                      \
+} while (0)
+
+#define dbg_err(fmt, ...)   do {                                               \
+       if (0)                                                                 \
+               ubifs_err(fmt, ##__VA_ARGS__);                                 \
+} while (0)
+
+#define dbg_msg(fmt, ...) do {                                                 \
+       if (0)                                                                 \
+               printk(KERN_DEBUG "UBIFS DBG (pid %d): %s: " fmt "\n",         \
+                      current->pid, __func__, ##__VA_ARGS__);                 \
+} while (0)
+
 #define dbg_dump_stack()
-#define dbg_err(fmt, ...)                          ({})
-#define dbg_msg(fmt, ...)                          ({})
-#define dbg_key(c, key, fmt, ...)                  ({})
-
-#define dbg_gen(fmt, ...)                          ({})
-#define dbg_jnl(fmt, ...)                          ({})
-#define dbg_tnc(fmt, ...)                          ({})
-#define dbg_lp(fmt, ...)                           ({})
-#define dbg_find(fmt, ...)                         ({})
-#define dbg_mnt(fmt, ...)                          ({})
-#define dbg_io(fmt, ...)                           ({})
-#define dbg_cmt(fmt, ...)                          ({})
-#define dbg_budg(fmt, ...)                         ({})
-#define dbg_log(fmt, ...)                          ({})
-#define dbg_gc(fmt, ...)                           ({})
-#define dbg_scan(fmt, ...)                         ({})
-#define dbg_rcvry(fmt, ...)                        ({})
-
-#define dbg_ntype(type)                            ""
-#define dbg_cstate(cmt_state)                      ""
-#define dbg_get_key_dump(c, key)                   ({})
-#define dbg_dump_inode(c, inode)                   ({})
-#define dbg_dump_node(c, node)                     ({})
-#define dbg_dump_budget_req(req)                   ({})
-#define dbg_dump_lstats(lst)                       ({})
-#define dbg_dump_budg(c)                           ({})
-#define dbg_dump_lprop(c, lp)                      ({})
-#define dbg_dump_lprops(c)                         ({})
-#define dbg_dump_leb(c, lnum)                      ({})
-#define dbg_dump_znode(c, znode)                   ({})
-#define dbg_dump_heap(c, heap, cat)                ({})
-#define dbg_dump_pnode(c, pnode, parent, iip)      ({})
-#define dbg_dump_tnc(c)                            ({})
-#define dbg_dump_index(c)                          ({})
+#define ubifs_assert_cmt_locked(c)
 
-#define dbg_walk_index(c, leaf_cb, znode_cb, priv) 0
+#define dbg_gen(fmt, ...)   dbg_msg(fmt, ##__VA_ARGS__)
+#define dbg_jnl(fmt, ...)   dbg_msg(fmt, ##__VA_ARGS__)
+#define dbg_tnc(fmt, ...)   dbg_msg(fmt, ##__VA_ARGS__)
+#define dbg_lp(fmt, ...)    dbg_msg(fmt, ##__VA_ARGS__)
+#define dbg_find(fmt, ...)  dbg_msg(fmt, ##__VA_ARGS__)
+#define dbg_mnt(fmt, ...)   dbg_msg(fmt, ##__VA_ARGS__)
+#define dbg_io(fmt, ...)    dbg_msg(fmt, ##__VA_ARGS__)
+#define dbg_cmt(fmt, ...)   dbg_msg(fmt, ##__VA_ARGS__)
+#define dbg_budg(fmt, ...)  dbg_msg(fmt, ##__VA_ARGS__)
+#define dbg_log(fmt, ...)   dbg_msg(fmt, ##__VA_ARGS__)
+#define dbg_gc(fmt, ...)    dbg_msg(fmt, ##__VA_ARGS__)
+#define dbg_scan(fmt, ...)  dbg_msg(fmt, ##__VA_ARGS__)
+#define dbg_rcvry(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__)
+
+#define DBGKEY(key)  ((char *)(key))
+#define DBGKEY1(key) ((char *)(key))
+
+#define dbg_ntype(type)                       ""
+#define dbg_cstate(cmt_state)                 ""
+#define dbg_get_key_dump(c, key)              ({})
+#define dbg_dump_inode(c, inode)              ({})
+#define dbg_dump_node(c, node)                ({})
+#define dbg_dump_budget_req(req)              ({})
+#define dbg_dump_lstats(lst)                  ({})
+#define dbg_dump_budg(c)                      ({})
+#define dbg_dump_lprop(c, lp)                 ({})
+#define dbg_dump_lprops(c)                    ({})
+#define dbg_dump_leb(c, lnum)                 ({})
+#define dbg_dump_znode(c, znode)              ({})
+#define dbg_dump_heap(c, heap, cat)           ({})
+#define dbg_dump_pnode(c, pnode, parent, iip) ({})
+#define dbg_dump_tnc(c)                       ({})
+#define dbg_dump_index(c)                     ({})
 
+#define dbg_walk_index(c, leaf_cb, znode_cb, priv) 0
 #define dbg_old_index_check_init(c, zroot)         0
 #define dbg_check_old_index(c, zroot)              0
-
 #define dbg_check_cats(c)                          0
-
 #define dbg_check_ltab(c)                          0
-
 #define dbg_check_synced_i_size(inode)             0
-
 #define dbg_check_dir_size(c, dir)                 0
-
 #define dbg_check_tnc(c, x)                        0
-
 #define dbg_check_idx_size(c, idx_size)            0
-
 #define dbg_check_filesystem(c)                    0
-
 #define dbg_check_heap(c, heap, cat, add_pos)      ({})
-
 #define dbg_check_lprops(c)                        0
 #define dbg_check_lpt_nodes(c, cnode, row, col)    0
-
 #define dbg_force_in_the_gaps_enabled              0
 #define dbg_force_in_the_gaps()                    0
-
 #define dbg_failure_mode                           0
 #define dbg_failure_mode_registration(c)           ({})
 #define dbg_failure_mode_deregistration(c)         ({})
index e90374be7d3b7833038af478efd32ac1db73f69a..5c96f1fb70166dbd75217692722d9e727be1d031 100644 (file)
@@ -165,7 +165,6 @@ struct inode *ubifs_new_inode(struct ubifs_info *c, const struct inode *dir,
        }
 
        inode->i_ino = ++c->highest_inum;
-       inode->i_generation = ++c->vfs_gen;
        /*
         * The creation sequence number remains with this inode for its
         * lifetime. All nodes for this inode have a greater sequence number,
@@ -220,15 +219,7 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry,
 
        err = ubifs_tnc_lookup_nm(c, &key, dent, &dentry->d_name);
        if (err) {
-               /*
-                * Do not hash the direntry if parent 'i_nlink' is zero, because
-                * this has side-effects - '->delete_inode()' call will not be
-                * called for the parent orphan inode, because 'd_count' of its
-                * direntry will stay 1 (it'll be negative direntry I guess)
-                * and prevent 'iput_final()' until the dentry is destroyed due
-                * to unmount or memory pressure.
-                */
-               if (err == -ENOENT && dir->i_nlink != 0) {
+               if (err == -ENOENT) {
                        dbg_gen("not found");
                        goto done;
                }
@@ -525,7 +516,7 @@ static int ubifs_link(struct dentry *old_dentry, struct inode *dir,
        struct ubifs_inode *dir_ui = ubifs_inode(dir);
        int err, sz_change = CALC_DENT_SIZE(dentry->d_name.len);
        struct ubifs_budget_req req = { .new_dent = 1, .dirtied_ino = 2,
-                                       .dirtied_ino_d = ui->data_len };
+                               .dirtied_ino_d = ALIGN(ui->data_len, 8) };
 
        /*
         * Budget request settings: new direntry, changing the target inode,
@@ -727,8 +718,7 @@ static int ubifs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
        struct ubifs_inode *dir_ui = ubifs_inode(dir);
        struct ubifs_info *c = dir->i_sb->s_fs_info;
        int err, sz_change = CALC_DENT_SIZE(dentry->d_name.len);
-       struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
-                                       .dirtied_ino_d = 1 };
+       struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1 };
 
        /*
         * Budget request settings: new inode, new direntry and changing parent
@@ -789,7 +779,8 @@ static int ubifs_mknod(struct inode *dir, struct dentry *dentry,
        int sz_change = CALC_DENT_SIZE(dentry->d_name.len);
        int err, devlen = 0;
        struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
-                                       .new_ino_d = devlen, .dirtied_ino = 1 };
+                                       .new_ino_d = ALIGN(devlen, 8),
+                                       .dirtied_ino = 1 };
 
        /*
         * Budget request settings: new inode, new direntry and changing parent
@@ -863,7 +854,8 @@ static int ubifs_symlink(struct inode *dir, struct dentry *dentry,
        int err, len = strlen(symname);
        int sz_change = CALC_DENT_SIZE(dentry->d_name.len);
        struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
-                                       .new_ino_d = len, .dirtied_ino = 1 };
+                                       .new_ino_d = ALIGN(len, 8),
+                                       .dirtied_ino = 1 };
 
        /*
         * Budget request settings: new inode, new direntry and changing parent
@@ -1012,7 +1004,7 @@ static int ubifs_rename(struct inode *old_dir, struct dentry *old_dentry,
        struct ubifs_budget_req req = { .new_dent = 1, .mod_dent = 1,
                                        .dirtied_ino = 3 };
        struct ubifs_budget_req ino_req = { .dirtied_ino = 1,
-                               .dirtied_ino_d = old_inode_ui->data_len };
+                       .dirtied_ino_d = ALIGN(old_inode_ui->data_len, 8) };
        struct timespec time;
 
        /*
index 8565e586e533bdafae604abfda4d06b369025bb9..4071d1cae29f7cb0b65221ecd541b3832b37be31 100644 (file)
@@ -890,7 +890,7 @@ static int do_setattr(struct ubifs_info *c, struct inode *inode,
        loff_t new_size = attr->ia_size;
        struct ubifs_inode *ui = ubifs_inode(inode);
        struct ubifs_budget_req req = { .dirtied_ino = 1,
-                                       .dirtied_ino_d = ui->data_len };
+                               .dirtied_ino_d = ALIGN(ui->data_len, 8) };
 
        err = ubifs_budget_space(c, &req);
        if (err)
@@ -941,7 +941,8 @@ int ubifs_setattr(struct dentry *dentry, struct iattr *attr)
        struct inode *inode = dentry->d_inode;
        struct ubifs_info *c = inode->i_sb->s_fs_info;
 
-       dbg_gen("ino %lu, ia_valid %#x", inode->i_ino, attr->ia_valid);
+       dbg_gen("ino %lu, mode %#x, ia_valid %#x",
+               inode->i_ino, inode->i_mode, attr->ia_valid);
        err = inode_change_ok(inode, attr);
        if (err)
                return err;
@@ -1051,7 +1052,7 @@ static int update_mctime(struct ubifs_info *c, struct inode *inode)
        if (mctime_update_needed(inode, &now)) {
                int err, release;
                struct ubifs_budget_req req = { .dirtied_ino = 1,
-                                               .dirtied_ino_d = ui->data_len };
+                               .dirtied_ino_d = ALIGN(ui->data_len, 8) };
 
                err = ubifs_budget_space(c, &req);
                if (err)
@@ -1270,6 +1271,7 @@ struct file_operations ubifs_file_operations = {
        .fsync          = ubifs_fsync,
        .unlocked_ioctl = ubifs_ioctl,
        .splice_read    = generic_file_splice_read,
+       .splice_write   = generic_file_splice_write,
 #ifdef CONFIG_COMPAT
        .compat_ioctl   = ubifs_compat_ioctl,
 #endif
index 10394c548367320ff463e6f3e8c5a034eab77811..adee7b5ddeabb6cb63769f1cfcd4b68ba959e40c 100644 (file)
@@ -290,9 +290,14 @@ int ubifs_find_dirty_leb(struct ubifs_info *c, struct ubifs_lprops *ret_lp,
                idx_lp = idx_heap->arr[0];
                sum = idx_lp->free + idx_lp->dirty;
                /*
-                * Since we reserve twice as more space for the index than it
+                * Since we reserve thrice as much space for the index than it
                 * actually takes, it does not make sense to pick indexing LEBs
-                * with less than half LEB of dirty space.
+                * with less than, say, half LEB of dirty space. May be half is
+                * not the optimal boundary - this should be tested and
+                * checked. This boundary should determine how much we use
+                * in-the-gaps to consolidate the index comparing to how much
+                * we use garbage collector to consolidate it. The "half"
+                * criteria just feels to be fine.
                 */
                if (sum < min_space || sum < c->half_leb_size)
                        idx_lp = NULL;
index 3374f91b67091f9516c4909b41889fd9f2a3912e..054363f2b207398ff6110fa74a7333d84d43dbc4 100644 (file)
 #include <linux/crc32.h>
 #include "ubifs.h"
 
+/**
+ * ubifs_ro_mode - switch UBIFS to read read-only mode.
+ * @c: UBIFS file-system description object
+ * @err: error code which is the reason of switching to R/O mode
+ */
+void ubifs_ro_mode(struct ubifs_info *c, int err)
+{
+       if (!c->ro_media) {
+               c->ro_media = 1;
+               ubifs_warn("switched to read-only mode, error %d", err);
+               dbg_dump_stack();
+       }
+}
+
 /**
  * ubifs_check_node - check node.
  * @c: UBIFS file-system description object
index 283155abe5f5ecea853b8d99d981fde864486830..22993f867d194ffbc3bab30f25675c0fbb22dbb4 100644 (file)
@@ -447,13 +447,11 @@ static int get_dent_type(int mode)
  * @ino: buffer in which to pack inode node
  * @inode: inode to pack
  * @last: indicates the last node of the group
- * @last_reference: non-zero if this is a deletion inode
  */
 static void pack_inode(struct ubifs_info *c, struct ubifs_ino_node *ino,
-                      const struct inode *inode, int last,
-                      int last_reference)
+                      const struct inode *inode, int last)
 {
-       int data_len = 0;
+       int data_len = 0, last_reference = !inode->i_nlink;
        struct ubifs_inode *ui = ubifs_inode(inode);
 
        ino->ch.node_type = UBIFS_INO_NODE;
@@ -596,9 +594,9 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
        ubifs_prep_grp_node(c, dent, dlen, 0);
 
        ino = (void *)dent + aligned_dlen;
-       pack_inode(c, ino, inode, 0, last_reference);
+       pack_inode(c, ino, inode, 0);
        ino = (void *)ino + aligned_ilen;
-       pack_inode(c, ino, dir, 1, 0);
+       pack_inode(c, ino, dir, 1);
 
        if (last_reference) {
                err = ubifs_add_orphan(c, inode->i_ino);
@@ -606,6 +604,7 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
                        release_head(c, BASEHD);
                        goto out_finish;
                }
+               ui->del_cmtno = c->cmt_no;
        }
 
        err = write_head(c, BASEHD, dent, len, &lnum, &dent_offs, sync);
@@ -750,30 +749,25 @@ out_free:
  * ubifs_jnl_write_inode - flush inode to the journal.
  * @c: UBIFS file-system description object
  * @inode: inode to flush
- * @deletion: inode has been deleted
  *
  * This function writes inode @inode to the journal. If the inode is
  * synchronous, it also synchronizes the write-buffer. Returns zero in case of
  * success and a negative error code in case of failure.
  */
-int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode,
-                         int deletion)
+int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode)
 {
-       int err, len, lnum, offs, sync = 0;
+       int err, lnum, offs;
        struct ubifs_ino_node *ino;
        struct ubifs_inode *ui = ubifs_inode(inode);
+       int sync = 0, len = UBIFS_INO_NODE_SZ, last_reference = !inode->i_nlink;
 
-       dbg_jnl("ino %lu%s", inode->i_ino,
-               deletion ? " (last reference)" : "");
-       if (deletion)
-               ubifs_assert(inode->i_nlink == 0);
+       dbg_jnl("ino %lu, nlink %u", inode->i_ino, inode->i_nlink);
 
-       len = UBIFS_INO_NODE_SZ;
        /*
         * If the inode is being deleted, do not write the attached data. No
         * need to synchronize the write-buffer either.
         */
-       if (!deletion) {
+       if (!last_reference) {
                len += ui->data_len;
                sync = IS_SYNC(inode);
        }
@@ -786,7 +780,7 @@ int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode,
        if (err)
                goto out_free;
 
-       pack_inode(c, ino, inode, 1, deletion);
+       pack_inode(c, ino, inode, 1);
        err = write_head(c, BASEHD, ino, len, &lnum, &offs, sync);
        if (err)
                goto out_release;
@@ -795,7 +789,7 @@ int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode,
                                          inode->i_ino);
        release_head(c, BASEHD);
 
-       if (deletion) {
+       if (last_reference) {
                err = ubifs_tnc_remove_ino(c, inode->i_ino);
                if (err)
                        goto out_ro;
@@ -827,6 +821,65 @@ out_free:
        return err;
 }
 
+/**
+ * ubifs_jnl_delete_inode - delete an inode.
+ * @c: UBIFS file-system description object
+ * @inode: inode to delete
+ *
+ * This function deletes inode @inode which includes removing it from orphans,
+ * deleting it from TNC and, in some cases, writing a deletion inode to the
+ * journal.
+ *
+ * When regular file inodes are unlinked or a directory inode is removed, the
+ * 'ubifs_jnl_update()' function writes a corresponding deletion inode and
+ * direntry to the media, and adds the inode to orphans. After this, when the
+ * last reference to this inode has been dropped, this function is called. In
+ * general, it has to write one more deletion inode to the media, because if
+ * a commit happened between 'ubifs_jnl_update()' and
+ * 'ubifs_jnl_delete_inode()', the deletion inode is not in the journal
+ * anymore, and in fact it might not be on the flash anymore, because it might
+ * have been garbage-collected already. And for optimization reasons UBIFS does
+ * not read the orphan area if it has been unmounted cleanly, so it would have
+ * no indication in the journal that there is a deleted inode which has to be
+ * removed from TNC.
+ *
+ * However, if there was no commit between 'ubifs_jnl_update()' and
+ * 'ubifs_jnl_delete_inode()', then there is no need to write the deletion
+ * inode to the media for the second time. And this is quite a typical case.
+ *
+ * This function returns zero in case of success and a negative error code in
+ * case of failure.
+ */
+int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode)
+{
+       int err;
+       struct ubifs_inode *ui = ubifs_inode(inode);
+
+       ubifs_assert(inode->i_nlink == 0);
+
+       if (ui->del_cmtno != c->cmt_no)
+               /* A commit happened for sure */
+               return ubifs_jnl_write_inode(c, inode);
+
+       down_read(&c->commit_sem);
+       /*
+        * Check commit number again, because the first test has been done
+        * without @c->commit_sem, so a commit might have happened.
+        */
+       if (ui->del_cmtno != c->cmt_no) {
+               up_read(&c->commit_sem);
+               return ubifs_jnl_write_inode(c, inode);
+       }
+
+       err = ubifs_tnc_remove_ino(c, inode->i_ino);
+       if (err)
+               ubifs_ro_mode(c, err);
+       else
+               ubifs_delete_orphan(c, inode->i_ino);
+       up_read(&c->commit_sem);
+       return err;
+}
+
 /**
  * ubifs_jnl_rename - rename a directory entry.
  * @c: UBIFS file-system description object
@@ -917,16 +970,16 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
 
        p = (void *)dent2 + aligned_dlen2;
        if (new_inode) {
-               pack_inode(c, p, new_inode, 0, last_reference);
+               pack_inode(c, p, new_inode, 0);
                p += ALIGN(ilen, 8);
        }
 
        if (!move)
-               pack_inode(c, p, old_dir, 1, 0);
+               pack_inode(c, p, old_dir, 1);
        else {
-               pack_inode(c, p, old_dir, 0, 0);
+               pack_inode(c, p, old_dir, 0);
                p += ALIGN(plen, 8);
-               pack_inode(c, p, new_dir, 1, 0);
+               pack_inode(c, p, new_dir, 1);
        }
 
        if (last_reference) {
@@ -935,6 +988,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
                        release_head(c, BASEHD);
                        goto out_finish;
                }
+               new_ui->del_cmtno = c->cmt_no;
        }
 
        err = write_head(c, BASEHD, dent, len, &lnum, &offs, sync);
@@ -1131,7 +1185,7 @@ int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
        if (err)
                goto out_free;
 
-       pack_inode(c, ino, inode, 0, 0);
+       pack_inode(c, ino, inode, 0);
        ubifs_prep_grp_node(c, trun, UBIFS_TRUN_NODE_SZ, dlen ? 0 : 1);
        if (dlen)
                ubifs_prep_grp_node(c, dn, dlen, 1);
@@ -1251,9 +1305,9 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
        ubifs_prep_grp_node(c, xent, xlen, 0);
 
        ino = (void *)xent + aligned_xlen;
-       pack_inode(c, ino, inode, 0, 1);
+       pack_inode(c, ino, inode, 0);
        ino = (void *)ino + UBIFS_INO_NODE_SZ;
-       pack_inode(c, ino, host, 1, 0);
+       pack_inode(c, ino, host, 1);
 
        err = write_head(c, BASEHD, xent, len, &lnum, &xent_offs, sync);
        if (!sync && !err)
@@ -1320,7 +1374,7 @@ int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode,
                           const struct inode *host)
 {
        int err, len1, len2, aligned_len, aligned_len1, lnum, offs;
-       struct ubifs_inode *host_ui = ubifs_inode(inode);
+       struct ubifs_inode *host_ui = ubifs_inode(host);
        struct ubifs_ino_node *ino;
        union ubifs_key key;
        int sync = IS_DIRSYNC(host);
@@ -1344,8 +1398,8 @@ int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode,
        if (err)
                goto out_free;
 
-       pack_inode(c, ino, host, 0, 0);
-       pack_inode(c, (void *)ino + aligned_len1, inode, 1, 0);
+       pack_inode(c, ino, host, 0);
+       pack_inode(c, (void *)ino + aligned_len1, inode, 1);
 
        err = write_head(c, BASEHD, ino, aligned_len, &lnum, &offs, 0);
        if (!sync && !err) {
index 36857b9ed59e089c793f26098aecf820275c6959..3e0aa7367556903e4f41f416443f92fa8cdab228 100644 (file)
@@ -317,6 +317,8 @@ int ubifs_add_bud_to_log(struct ubifs_info *c, int jhead, int lnum, int offs)
        return 0;
 
 out_unlock:
+       if (err != -EAGAIN)
+               ubifs_ro_mode(c, err);
        mutex_unlock(&c->log_mutex);
        kfree(ref);
        kfree(bud);
@@ -410,7 +412,7 @@ int ubifs_log_start_commit(struct ubifs_info *c, int *ltail_lnum)
                return -ENOMEM;
 
        cs->ch.node_type = UBIFS_CS_NODE;
-       cs->cmt_no = cpu_to_le64(c->cmt_no + 1);
+       cs->cmt_no = cpu_to_le64(c->cmt_no);
        ubifs_prepare_node(c, cs, UBIFS_CS_NODE_SZ, 0);
 
        /*
index 4beccfc256d22d259c6c4599e08f08de68663143..87dabf9fe742ea05674ec8cb2bf78f5fe98f510d 100644 (file)
@@ -79,20 +79,6 @@ static inline struct ubifs_inode *ubifs_inode(const struct inode *inode)
        return container_of(inode, struct ubifs_inode, vfs_inode);
 }
 
-/**
- * ubifs_ro_mode - switch UBIFS to read read-only mode.
- * @c: UBIFS file-system description object
- * @err: error code which is the reason of switching to R/O mode
- */
-static inline void ubifs_ro_mode(struct ubifs_info *c, int err)
-{
-       if (!c->ro_media) {
-               c->ro_media = 1;
-               ubifs_warn("switched to read-only mode, error %d", err);
-               dbg_dump_stack();
-       }
-}
-
 /**
  * ubifs_compr_present - check if compressor was compiled in.
  * @compr_type: compressor type to check
@@ -322,7 +308,7 @@ static inline long long ubifs_reported_space(const struct ubifs_info *c,
 {
        int divisor, factor;
 
-       divisor = UBIFS_MAX_DATA_NODE_SZ + (c->max_idx_node_sz << 1);
+       divisor = UBIFS_MAX_DATA_NODE_SZ + (c->max_idx_node_sz * 3);
        factor = UBIFS_MAX_DATA_NODE_SZ - UBIFS_DATA_NODE_SZ;
        do_div(free, divisor);
 
index 3afeb9242c6ac9bd9fb6ef67603c841e7987daa6..02d3462f4d3e99edb907ddaee16ed75300e827b0 100644 (file)
@@ -310,10 +310,10 @@ static int write_orph_node(struct ubifs_info *c, int atomic)
        c->cmt_orphans -= cnt;
        spin_unlock(&c->orphan_lock);
        if (c->cmt_orphans)
-               orph->cmt_no = cpu_to_le64(c->cmt_no + 1);
+               orph->cmt_no = cpu_to_le64(c->cmt_no);
        else
                /* Mark the last node of the commit */
-               orph->cmt_no = cpu_to_le64((c->cmt_no + 1) | (1ULL << 63));
+               orph->cmt_no = cpu_to_le64((c->cmt_no) | (1ULL << 63));
        ubifs_assert(c->ohead_offs + len <= c->leb_size);
        ubifs_assert(c->ohead_lnum >= c->orph_first);
        ubifs_assert(c->ohead_lnum <= c->orph_last);
index ca1e2d4e03cc74fa82dbf2eed84f3d2e01aadf98..f71e6b8822c4fac6dbaab1913098e7a61c81dcfa 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/slab.h>
 #include <linux/module.h>
 #include <linux/ctype.h>
-#include <linux/random.h>
 #include <linux/kthread.h>
 #include <linux/parser.h>
 #include <linux/seq_file.h>
@@ -149,7 +148,7 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum)
        if (err)
                goto out_invalid;
 
-       /* Disable readahead */
+       /* Disable read-ahead */
        inode->i_mapping->backing_dev_info = &c->bdi;
 
        switch (inode->i_mode & S_IFMT) {
@@ -278,7 +277,7 @@ static void ubifs_destroy_inode(struct inode *inode)
  */
 static int ubifs_write_inode(struct inode *inode, int wait)
 {
-       int err;
+       int err = 0;
        struct ubifs_info *c = inode->i_sb->s_fs_info;
        struct ubifs_inode *ui = ubifs_inode(inode);
 
@@ -299,10 +298,18 @@ static int ubifs_write_inode(struct inode *inode, int wait)
                return 0;
        }
 
-       dbg_gen("inode %lu", inode->i_ino);
-       err = ubifs_jnl_write_inode(c, inode, 0);
-       if (err)
-               ubifs_err("can't write inode %lu, error %d", inode->i_ino, err);
+       /*
+        * As an optimization, do not write orphan inodes to the media just
+        * because this is not needed.
+        */
+       dbg_gen("inode %lu, mode %#x, nlink %u",
+               inode->i_ino, (int)inode->i_mode, inode->i_nlink);
+       if (inode->i_nlink) {
+               err = ubifs_jnl_write_inode(c, inode);
+               if (err)
+                       ubifs_err("can't write inode %lu, error %d",
+                                 inode->i_ino, err);
+       }
 
        ui->dirty = 0;
        mutex_unlock(&ui->ui_mutex);
@@ -314,8 +321,9 @@ static void ubifs_delete_inode(struct inode *inode)
 {
        int err;
        struct ubifs_info *c = inode->i_sb->s_fs_info;
+       struct ubifs_inode *ui = ubifs_inode(inode);
 
-       if (ubifs_inode(inode)->xattr)
+       if (ui->xattr)
                /*
                 * Extended attribute inode deletions are fully handled in
                 * 'ubifs_removexattr()'. These inodes are special and have
@@ -323,7 +331,7 @@ static void ubifs_delete_inode(struct inode *inode)
                 */
                goto out;
 
-       dbg_gen("inode %lu", inode->i_ino);
+       dbg_gen("inode %lu, mode %#x", inode->i_ino, (int)inode->i_mode);
        ubifs_assert(!atomic_read(&inode->i_count));
        ubifs_assert(inode->i_nlink == 0);
 
@@ -331,15 +339,19 @@ static void ubifs_delete_inode(struct inode *inode)
        if (is_bad_inode(inode))
                goto out;
 
-       ubifs_inode(inode)->ui_size = inode->i_size = 0;
-       err = ubifs_jnl_write_inode(c, inode, 1);
+       ui->ui_size = inode->i_size = 0;
+       err = ubifs_jnl_delete_inode(c, inode);
        if (err)
                /*
                 * Worst case we have a lost orphan inode wasting space, so a
-                * simple error message is ok here.
+                * simple error message is OK here.
                 */
-               ubifs_err("can't write inode %lu, error %d", inode->i_ino, err);
+               ubifs_err("can't delete inode %lu, error %d",
+                         inode->i_ino, err);
+
 out:
+       if (ui->dirty)
+               ubifs_release_dirty_inode_budget(c, ui);
        clear_inode(inode);
 }
 
@@ -1122,8 +1134,8 @@ static int mount_ubifs(struct ubifs_info *c)
        if (err)
                goto out_infos;
 
-       ubifs_msg("mounted UBI device %d, volume %d", c->vi.ubi_num,
-                 c->vi.vol_id);
+       ubifs_msg("mounted UBI device %d, volume %d, name \"%s\"",
+                 c->vi.ubi_num, c->vi.vol_id, c->vi.name);
        if (mounted_read_only)
                ubifs_msg("mounted read-only");
        x = (long long)c->main_lebs * c->leb_size;
@@ -1469,6 +1481,7 @@ static void ubifs_put_super(struct super_block *sb)
         */
        ubifs_assert(atomic_long_read(&c->dirty_pg_cnt) == 0);
        ubifs_assert(c->budg_idx_growth == 0);
+       ubifs_assert(c->budg_dd_growth == 0);
        ubifs_assert(c->budg_data_growth == 0);
 
        /*
@@ -1657,7 +1670,6 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent)
        INIT_LIST_HEAD(&c->orph_new);
 
        c->highest_inum = UBIFS_FIRST_INO;
-       get_random_bytes(&c->vfs_gen, sizeof(int));
        c->lhead_lnum = c->ltail_lnum = UBIFS_LOG_LNUM;
 
        ubi_get_volume_info(ubi, &c->vi);
@@ -1671,10 +1683,10 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent)
        }
 
        /*
-        * UBIFS provids 'backing_dev_info' in order to disable readahead. For
+        * UBIFS provides 'backing_dev_info' in order to disable read-ahead. For
         * UBIFS, I/O is not deferred, it is done immediately in readpage,
         * which means the user would have to wait not just for their own I/O
-        * but the readahead I/O as well i.e. completely pointless.
+        * but the read-ahead I/O as well i.e. completely pointless.
         *
         * Read-ahead will be disabled because @c->bdi.ra_pages is 0.
         */
index 8117e65ba2e99e4523a59abd6d03923cbc354861..8ac76b1c2d552eb5d8c94e765e2e4a1a2f747358 100644 (file)
@@ -372,26 +372,25 @@ static int layout_in_gaps(struct ubifs_info *c, int cnt)
                written = layout_leb_in_gaps(c, p);
                if (written < 0) {
                        err = written;
-                       if (err == -ENOSPC) {
-                               if (!dbg_force_in_the_gaps_enabled) {
-                                       /*
-                                        * Do not print scary warnings if the
-                                        * debugging option which forces
-                                        * in-the-gaps is enabled.
-                                        */
-                                       ubifs_err("out of space");
-                                       spin_lock(&c->space_lock);
-                                       dbg_dump_budg(c);
-                                       spin_unlock(&c->space_lock);
-                                       dbg_dump_lprops(c);
-                               }
-                               /* Try to commit anyway */
-                               err = 0;
-                               break;
+                       if (err != -ENOSPC) {
+                               kfree(c->gap_lebs);
+                               c->gap_lebs = NULL;
+                               return err;
                        }
-                       kfree(c->gap_lebs);
-                       c->gap_lebs = NULL;
-                       return err;
+                       if (!dbg_force_in_the_gaps_enabled) {
+                               /*
+                                * Do not print scary warnings if the debugging
+                                * option which forces in-the-gaps is enabled.
+                                */
+                               ubifs_err("out of space");
+                               spin_lock(&c->space_lock);
+                               dbg_dump_budg(c);
+                               spin_unlock(&c->space_lock);
+                               dbg_dump_lprops(c);
+                       }
+                       /* Try to commit anyway */
+                       err = 0;
+                       break;
                }
                p++;
                cnt -= written;
index 0cc7da9bed472b778f543229dcb1a8540105b920..bd2121f3426eb5cacee42602dca1dcacb0150acd 100644 (file)
@@ -228,10 +228,10 @@ enum {
 /* Minimum number of orphan area logical eraseblocks */
 #define UBIFS_MIN_ORPH_LEBS 1
 /*
- * Minimum number of main area logical eraseblocks (buds, 2 for the index, 1
+ * Minimum number of main area logical eraseblocks (buds, 3 for the index, 1
  * for GC, 1 for deletions, and at least 1 for committed data).
  */
-#define UBIFS_MIN_MAIN_LEBS (UBIFS_MIN_BUD_LEBS + 5)
+#define UBIFS_MIN_MAIN_LEBS (UBIFS_MIN_BUD_LEBS + 6)
 
 /* Minimum number of logical eraseblocks */
 #define UBIFS_MIN_LEB_CNT (UBIFS_SB_LEBS + UBIFS_MST_LEBS + \
index e4f89f2718274b6125365c56e31daee482a967ee..d7f706f7a3024ab18200c382e790202273adc1e4 100644 (file)
@@ -20,8 +20,6 @@
  *          Adrian Hunter
  */
 
-/* Implementation version 0.7 */
-
 #ifndef __UBIFS_H__
 #define __UBIFS_H__
 
@@ -322,6 +320,8 @@ struct ubifs_gced_idx_leb {
  * struct ubifs_inode - UBIFS in-memory inode description.
  * @vfs_inode: VFS inode description object
  * @creat_sqnum: sequence number at time of creation
+ * @del_cmtno: commit number corresponding to the time the inode was deleted,
+ *             protected by @c->commit_sem;
  * @xattr_size: summarized size of all extended attributes in bytes
  * @xattr_cnt: count of extended attributes this inode has
  * @xattr_names: sum of lengths of all extended attribute names belonging to
@@ -373,6 +373,7 @@ struct ubifs_gced_idx_leb {
 struct ubifs_inode {
        struct inode vfs_inode;
        unsigned long long creat_sqnum;
+       unsigned long long del_cmtno;
        unsigned int xattr_size;
        unsigned int xattr_cnt;
        unsigned int xattr_names;
@@ -779,7 +780,7 @@ struct ubifs_compressor {
 /**
  * struct ubifs_budget_req - budget requirements of an operation.
  *
- * @fast: non-zero if the budgeting should try to aquire budget quickly and
+ * @fast: non-zero if the budgeting should try to acquire budget quickly and
  *        should not try to call write-back
  * @recalculate: non-zero if @idx_growth, @data_growth, and @dd_growth fields
  *               have to be re-calculated
@@ -805,21 +806,31 @@ struct ubifs_compressor {
  * An inode may contain 4KiB of data at max., thus the widths of @new_ino_d
  * is 13 bits, and @dirtied_ino_d - 15, because up to 4 inodes may be made
  * dirty by the re-name operation.
+ *
+ * Note, UBIFS aligns node lengths to 8-bytes boundary, so the requester has to
+ * make sure the amount of inode data which contribute to @new_ino_d and
+ * @dirtied_ino_d fields are aligned.
  */
 struct ubifs_budget_req {
        unsigned int fast:1;
        unsigned int recalculate:1;
+#ifndef UBIFS_DEBUG
        unsigned int new_page:1;
        unsigned int dirtied_page:1;
        unsigned int new_dent:1;
        unsigned int mod_dent:1;
        unsigned int new_ino:1;
        unsigned int new_ino_d:13;
-#ifndef UBIFS_DEBUG
        unsigned int dirtied_ino:4;
        unsigned int dirtied_ino_d:15;
 #else
        /* Not bit-fields to check for overflows */
+       unsigned int new_page;
+       unsigned int dirtied_page;
+       unsigned int new_dent;
+       unsigned int mod_dent;
+       unsigned int new_ino;
+       unsigned int new_ino_d;
        unsigned int dirtied_ino;
        unsigned int dirtied_ino_d;
 #endif
@@ -860,13 +871,13 @@ struct ubifs_mount_opts {
  * struct ubifs_info - UBIFS file-system description data structure
  * (per-superblock).
  * @vfs_sb: VFS @struct super_block object
- * @bdi: backing device info object to make VFS happy and disable readahead
+ * @bdi: backing device info object to make VFS happy and disable read-ahead
  *
  * @highest_inum: highest used inode number
- * @vfs_gen: VFS inode generation counter
  * @max_sqnum: current global sequence number
- * @cmt_no: commit number (last successfully completed commit)
- * @cnt_lock: protects @highest_inum, @vfs_gen, and @max_sqnum counters
+ * @cmt_no: commit number of the last successfully completed commit, protected
+ *          by @commit_sem
+ * @cnt_lock: protects @highest_inum and @max_sqnum counters
  * @fmt_version: UBIFS on-flash format version
  * @uuid: UUID from super block
  *
@@ -1103,7 +1114,6 @@ struct ubifs_info {
        struct backing_dev_info bdi;
 
        ino_t highest_inum;
-       unsigned int vfs_gen;
        unsigned long long max_sqnum;
        unsigned long long cmt_no;
        spinlock_t cnt_lock;
@@ -1346,6 +1356,7 @@ extern struct backing_dev_info ubifs_backing_dev_info;
 extern struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT];
 
 /* io.c */
+void ubifs_ro_mode(struct ubifs_info *c, int err);
 int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len);
 int ubifs_wbuf_seek_nolock(struct ubifs_wbuf *wbuf, int lnum, int offs,
                           int dtype);
@@ -1399,8 +1410,8 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
                     int deletion, int xent);
 int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode,
                         const union ubifs_key *key, const void *buf, int len);
-int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode,
-                         int last_reference);
+int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode);
+int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode);
 int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
                     const struct dentry *old_dentry,
                     const struct inode *new_dir,
index 1388a078e1a940c57bb20ec01fe49d3c449ceaff..649bec78b6455819eb8c216f12a9877063a53880 100644 (file)
@@ -61,7 +61,7 @@
 
 /*
  * Limit the number of extended attributes per inode so that the total size
- * (xattr_size) is guaranteeded to fit in an 'unsigned int'.
+ * (@xattr_size) is guaranteeded to fit in an 'unsigned int'.
  */
 #define MAX_XATTRS_PER_INODE 65535
 
@@ -103,14 +103,14 @@ static int create_xattr(struct ubifs_info *c, struct inode *host,
        struct inode *inode;
        struct ubifs_inode *ui, *host_ui = ubifs_inode(host);
        struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
-                                       .new_ino_d = size, .dirtied_ino = 1,
-                                       .dirtied_ino_d = host_ui->data_len};
+                               .new_ino_d = ALIGN(size, 8), .dirtied_ino = 1,
+                               .dirtied_ino_d = ALIGN(host_ui->data_len, 8) };
 
        if (host_ui->xattr_cnt >= MAX_XATTRS_PER_INODE)
                return -ENOSPC;
        /*
         * Linux limits the maximum size of the extended attribute names list
-        * to %XATTR_LIST_MAX. This means we should not allow creating more*
+        * to %XATTR_LIST_MAX. This means we should not allow creating more
         * extended attributes if the name list becomes larger. This limitation
         * is artificial for UBIFS, though.
         */
@@ -128,7 +128,6 @@ static int create_xattr(struct ubifs_info *c, struct inode *host,
                goto out_budg;
        }
 
-       mutex_lock(&host_ui->ui_mutex);
        /* Re-define all operations to be "nothing" */
        inode->i_mapping->a_ops = &none_address_operations;
        inode->i_op = &none_inode_operations;
@@ -141,23 +140,19 @@ static int create_xattr(struct ubifs_info *c, struct inode *host,
        ui->data = kmalloc(size, GFP_NOFS);
        if (!ui->data) {
                err = -ENOMEM;
-               goto out_unlock;
+               goto out_free;
        }
-
        memcpy(ui->data, value, size);
+       inode->i_size = ui->ui_size = size;
+       ui->data_len = size;
+
+       mutex_lock(&host_ui->ui_mutex);
        host->i_ctime = ubifs_current_time(host);
        host_ui->xattr_cnt += 1;
        host_ui->xattr_size += CALC_DENT_SIZE(nm->len);
        host_ui->xattr_size += CALC_XATTR_BYTES(size);
        host_ui->xattr_names += nm->len;
 
-       /*
-        * We do not use i_size_write() because nobody can race with us as we
-        * are holding host @host->i_mutex - every xattr operation for this
-        * inode is serialized by it.
-        */
-       inode->i_size = ui->ui_size = size;
-       ui->data_len = size;
        err = ubifs_jnl_update(c, host, nm, inode, 0, 1);
        if (err)
                goto out_cancel;
@@ -172,8 +167,8 @@ out_cancel:
        host_ui->xattr_cnt -= 1;
        host_ui->xattr_size -= CALC_DENT_SIZE(nm->len);
        host_ui->xattr_size -= CALC_XATTR_BYTES(size);
-out_unlock:
        mutex_unlock(&host_ui->ui_mutex);
+out_free:
        make_bad_inode(inode);
        iput(inode);
 out_budg:
@@ -200,29 +195,28 @@ static int change_xattr(struct ubifs_info *c, struct inode *host,
        struct ubifs_inode *host_ui = ubifs_inode(host);
        struct ubifs_inode *ui = ubifs_inode(inode);
        struct ubifs_budget_req req = { .dirtied_ino = 2,
-                               .dirtied_ino_d = size + host_ui->data_len };
+               .dirtied_ino_d = ALIGN(size, 8) + ALIGN(host_ui->data_len, 8) };
 
        ubifs_assert(ui->data_len == inode->i_size);
        err = ubifs_budget_space(c, &req);
        if (err)
                return err;
 
-       mutex_lock(&host_ui->ui_mutex);
-       host->i_ctime = ubifs_current_time(host);
-       host_ui->xattr_size -= CALC_XATTR_BYTES(ui->data_len);
-       host_ui->xattr_size += CALC_XATTR_BYTES(size);
-
        kfree(ui->data);
        ui->data = kmalloc(size, GFP_NOFS);
        if (!ui->data) {
                err = -ENOMEM;
-               goto out_unlock;
+               goto out_free;
        }
-
        memcpy(ui->data, value, size);
        inode->i_size = ui->ui_size = size;
        ui->data_len = size;
 
+       mutex_lock(&host_ui->ui_mutex);
+       host->i_ctime = ubifs_current_time(host);
+       host_ui->xattr_size -= CALC_XATTR_BYTES(ui->data_len);
+       host_ui->xattr_size += CALC_XATTR_BYTES(size);
+
        /*
         * It is important to write the host inode after the xattr inode
         * because if the host inode gets synchronized (via 'fsync()'), then
@@ -240,9 +234,9 @@ static int change_xattr(struct ubifs_info *c, struct inode *host,
 out_cancel:
        host_ui->xattr_size -= CALC_XATTR_BYTES(size);
        host_ui->xattr_size += CALC_XATTR_BYTES(ui->data_len);
-       make_bad_inode(inode);
-out_unlock:
        mutex_unlock(&host_ui->ui_mutex);
+       make_bad_inode(inode);
+out_free:
        ubifs_release_budget(c, &req);
        return err;
 }
@@ -312,6 +306,7 @@ int ubifs_setxattr(struct dentry *dentry, const char *name,
 
        dbg_gen("xattr '%s', host ino %lu ('%.*s'), size %zd", name,
                host->i_ino, dentry->d_name.len, dentry->d_name.name, size);
+       ubifs_assert(mutex_is_locked(&host->i_mutex));
 
        if (size > UBIFS_MAX_INO_DATA)
                return -ERANGE;
@@ -384,7 +379,6 @@ ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf,
        if (!xent)
                return -ENOMEM;
 
-       mutex_lock(&host->i_mutex);
        xent_key_init(c, &key, host->i_ino, &nm);
        err = ubifs_tnc_lookup_nm(c, &key, xent, &nm);
        if (err) {
@@ -419,7 +413,6 @@ ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf,
 out_iput:
        iput(inode);
 out_unlock:
-       mutex_unlock(&host->i_mutex);
        kfree(xent);
        return err;
 }
@@ -449,8 +442,6 @@ ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size)
                return -ERANGE;
 
        lowest_xent_key(c, &key, host->i_ino);
-
-       mutex_lock(&host->i_mutex);
        while (1) {
                int type;
 
@@ -479,7 +470,6 @@ ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size)
                pxent = xent;
                key_read(c, &xent->key, &key);
        }
-       mutex_unlock(&host->i_mutex);
 
        kfree(pxent);
        if (err != -ENOENT) {
@@ -497,8 +487,8 @@ static int remove_xattr(struct ubifs_info *c, struct inode *host,
        int err;
        struct ubifs_inode *host_ui = ubifs_inode(host);
        struct ubifs_inode *ui = ubifs_inode(inode);
-       struct ubifs_budget_req req = { .dirtied_ino = 1, .mod_dent = 1,
-                                       .dirtied_ino_d = host_ui->data_len };
+       struct ubifs_budget_req req = { .dirtied_ino = 2, .mod_dent = 1,
+                               .dirtied_ino_d = ALIGN(host_ui->data_len, 8) };
 
        ubifs_assert(ui->data_len == inode->i_size);
 
index 9ed70a05058003034e275e8c8f13acff3124c2ed..c34008507b69f463e8dceeee8325cc7abbe6bf08 100644 (file)
@@ -182,7 +182,7 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info);
  */
 u32 acpi_ns_opens_scope(acpi_object_type type);
 
-void
+acpi_status
 acpi_ns_build_external_path(struct acpi_namespace_node *node,
                            acpi_size size, char *name_buffer);
 
diff --git a/include/asm-alpha/8253pit.h b/include/asm-alpha/8253pit.h
deleted file mode 100644 (file)
index fef5c14..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * 8253/8254 Programmable Interval Timer
- */
-
-#ifndef _8253PIT_H
-#define _8253PIT_H
-
-#define PIT_TICK_RATE  1193180UL
-
-#endif
diff --git a/include/asm-alpha/Kbuild b/include/asm-alpha/Kbuild
deleted file mode 100644 (file)
index b7c8f18..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-include include/asm-generic/Kbuild.asm
-
-header-y += gentrap.h
-header-y += regdef.h
-header-y += pal.h
-header-y += reg.h
-
-unifdef-y += console.h
-unifdef-y += fpu.h
-unifdef-y += sysinfo.h
-unifdef-y += compiler.h
diff --git a/include/asm-alpha/a.out-core.h b/include/asm-alpha/a.out-core.h
deleted file mode 100644 (file)
index 9e33e92..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/* a.out coredump register dumper
- *
- * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public Licence
- * as published by the Free Software Foundation; either version
- * 2 of the Licence, or (at your option) any later version.
- */
-
-#ifndef _ASM_A_OUT_CORE_H
-#define _ASM_A_OUT_CORE_H
-
-#ifdef __KERNEL__
-
-#include <linux/user.h>
-
-/*
- * Fill in the user structure for an ECOFF core dump.
- */
-static inline void aout_dump_thread(struct pt_regs *pt, struct user *dump)
-{
-       /* switch stack follows right below pt_regs: */
-       struct switch_stack * sw = ((struct switch_stack *) pt) - 1;
-
-       dump->magic = CMAGIC;
-       dump->start_code  = current->mm->start_code;
-       dump->start_data  = current->mm->start_data;
-       dump->start_stack = rdusp() & ~(PAGE_SIZE - 1);
-       dump->u_tsize = ((current->mm->end_code - dump->start_code)
-                        >> PAGE_SHIFT);
-       dump->u_dsize = ((current->mm->brk + PAGE_SIZE-1 - dump->start_data)
-                        >> PAGE_SHIFT);
-       dump->u_ssize = (current->mm->start_stack - dump->start_stack
-                        + PAGE_SIZE-1) >> PAGE_SHIFT;
-
-       /*
-        * We store the registers in an order/format that is
-        * compatible with DEC Unix/OSF/1 as this makes life easier
-        * for gdb.
-        */
-       dump->regs[EF_V0]  = pt->r0;
-       dump->regs[EF_T0]  = pt->r1;
-       dump->regs[EF_T1]  = pt->r2;
-       dump->regs[EF_T2]  = pt->r3;
-       dump->regs[EF_T3]  = pt->r4;
-       dump->regs[EF_T4]  = pt->r5;
-       dump->regs[EF_T5]  = pt->r6;
-       dump->regs[EF_T6]  = pt->r7;
-       dump->regs[EF_T7]  = pt->r8;
-       dump->regs[EF_S0]  = sw->r9;
-       dump->regs[EF_S1]  = sw->r10;
-       dump->regs[EF_S2]  = sw->r11;
-       dump->regs[EF_S3]  = sw->r12;
-       dump->regs[EF_S4]  = sw->r13;
-       dump->regs[EF_S5]  = sw->r14;
-       dump->regs[EF_S6]  = sw->r15;
-       dump->regs[EF_A3]  = pt->r19;
-       dump->regs[EF_A4]  = pt->r20;
-       dump->regs[EF_A5]  = pt->r21;
-       dump->regs[EF_T8]  = pt->r22;
-       dump->regs[EF_T9]  = pt->r23;
-       dump->regs[EF_T10] = pt->r24;
-       dump->regs[EF_T11] = pt->r25;
-       dump->regs[EF_RA]  = pt->r26;
-       dump->regs[EF_T12] = pt->r27;
-       dump->regs[EF_AT]  = pt->r28;
-       dump->regs[EF_SP]  = rdusp();
-       dump->regs[EF_PS]  = pt->ps;
-       dump->regs[EF_PC]  = pt->pc;
-       dump->regs[EF_GP]  = pt->gp;
-       dump->regs[EF_A0]  = pt->r16;
-       dump->regs[EF_A1]  = pt->r17;
-       dump->regs[EF_A2]  = pt->r18;
-       memcpy((char *)dump->regs + EF_SIZE, sw->fp, 32 * 8);
-}
-
-#endif /* __KERNEL__ */
-#endif /* _ASM_A_OUT_CORE_H */
diff --git a/include/asm-alpha/a.out.h b/include/asm-alpha/a.out.h
deleted file mode 100644 (file)
index 02ce847..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-#ifndef __ALPHA_A_OUT_H__
-#define __ALPHA_A_OUT_H__
-
-#include <linux/types.h>
-
-/*
- * OSF/1 ECOFF header structs.  ECOFF files consist of:
- *     - a file header (struct filehdr),
- *     - an a.out header (struct aouthdr),
- *     - one or more section headers (struct scnhdr). 
- *       The filhdr's "f_nscns" field contains the
- *       number of section headers.
- */
-
-struct filehdr
-{
-       /* OSF/1 "file" header */
-       __u16 f_magic, f_nscns;
-       __u32 f_timdat;
-       __u64 f_symptr;
-       __u32 f_nsyms;
-       __u16 f_opthdr, f_flags;
-};
-
-struct aouthdr
-{
-       __u64 info;             /* after that it looks quite normal.. */
-       __u64 tsize;
-       __u64 dsize;
-       __u64 bsize;
-       __u64 entry;
-       __u64 text_start;       /* with a few additions that actually make sense */
-       __u64 data_start;
-       __u64 bss_start;
-       __u32 gprmask, fprmask; /* bitmask of general & floating point regs used in binary */
-       __u64 gpvalue;
-};
-
-struct scnhdr
-{
-       char    s_name[8];
-       __u64   s_paddr;
-       __u64   s_vaddr;
-       __u64   s_size;
-       __u64   s_scnptr;
-       __u64   s_relptr;
-       __u64   s_lnnoptr;
-       __u16   s_nreloc;
-       __u16   s_nlnno;
-       __u32   s_flags;
-};
-
-struct exec
-{
-       /* OSF/1 "file" header */
-       struct filehdr          fh;
-       struct aouthdr          ah;
-};
-
-/*
- * Define's so that the kernel exec code can access the a.out header
- * fields...
- */
-#define        a_info          ah.info
-#define        a_text          ah.tsize
-#define a_data         ah.dsize
-#define a_bss          ah.bsize
-#define a_entry                ah.entry
-#define a_textstart    ah.text_start
-#define        a_datastart     ah.data_start
-#define        a_bssstart      ah.bss_start
-#define        a_gprmask       ah.gprmask
-#define a_fprmask      ah.fprmask
-#define a_gpvalue      ah.gpvalue
-
-#define N_TXTADDR(x) ((x).a_textstart)
-#define N_DATADDR(x) ((x).a_datastart)
-#define N_BSSADDR(x) ((x).a_bssstart)
-#define N_DRSIZE(x) 0
-#define N_TRSIZE(x) 0
-#define N_SYMSIZE(x) 0
-
-#define AOUTHSZ                sizeof(struct aouthdr)
-#define SCNHSZ         sizeof(struct scnhdr)
-#define SCNROUND       16
-
-#define N_TXTOFF(x) \
-  ((long) N_MAGIC(x) == ZMAGIC ? 0 : \
-   (sizeof(struct exec) + (x).fh.f_nscns*SCNHSZ + SCNROUND - 1) & ~(SCNROUND - 1))
-
-#ifdef __KERNEL__
-
-/* Assume that start addresses below 4G belong to a TASO application.
-   Unfortunately, there is no proper bit in the exec header to check.
-   Worse, we have to notice the start address before swapping to use
-   /sbin/loader, which of course is _not_ a TASO application.  */
-#define SET_AOUT_PERSONALITY(BFPM, EX) \
-       set_personality (((BFPM->sh_bang || EX.ah.entry < 0x100000000L \
-                          ? ADDR_LIMIT_32BIT : 0) | PER_OSF4))
-
-#endif /* __KERNEL__ */
-#endif /* __A_OUT_GNU_H__ */
diff --git a/include/asm-alpha/agp.h b/include/asm-alpha/agp.h
deleted file mode 100644 (file)
index 26c1791..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef AGP_H
-#define AGP_H 1
-
-#include <asm/io.h>
-
-/* dummy for now */
-
-#define map_page_into_agp(page) 
-#define unmap_page_from_agp(page) 
-#define flush_agp_cache() mb()
-
-/* Convert a physical address to an address suitable for the GART. */
-#define phys_to_gart(x) (x)
-#define gart_to_phys(x) (x)
-
-/* GATT allocation. Returns/accepts GATT kernel virtual address. */
-#define alloc_gatt_pages(order)                \
-       ((char *)__get_free_pages(GFP_KERNEL, (order)))
-#define free_gatt_pages(table, order)  \
-       free_pages((unsigned long)(table), (order))
-
-#endif
diff --git a/include/asm-alpha/agp_backend.h b/include/asm-alpha/agp_backend.h
deleted file mode 100644 (file)
index 55dd44a..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef _ALPHA_AGP_BACKEND_H
-#define _ALPHA_AGP_BACKEND_H 1
-
-typedef        union _alpha_agp_mode {
-       struct {
-               u32 rate : 3;
-               u32 reserved0 : 1;
-               u32 fw : 1;
-               u32 fourgb : 1;
-               u32 reserved1 : 2;
-               u32 enable : 1;
-               u32 sba : 1;
-               u32 reserved2 : 14;
-               u32 rq : 8;
-       } bits;
-       u32 lw;
-} alpha_agp_mode;
-
-typedef struct _alpha_agp_info {
-       struct pci_controller *hose;
-       struct {
-               dma_addr_t bus_base;
-               unsigned long size;
-               void *sysdata;
-       } aperture;
-       alpha_agp_mode capability;
-       alpha_agp_mode mode;
-       void *private;
-       struct alpha_agp_ops *ops;
-} alpha_agp_info;
-
-struct alpha_agp_ops {
-       int (*setup)(alpha_agp_info *);
-       void (*cleanup)(alpha_agp_info *);
-       int (*configure)(alpha_agp_info *);
-       int (*bind)(alpha_agp_info *, off_t, struct agp_memory *);
-       int (*unbind)(alpha_agp_info *, off_t, struct agp_memory *);
-       unsigned long (*translate)(alpha_agp_info *, dma_addr_t);
-};
-
-
-#endif /* _ALPHA_AGP_BACKEND_H */
diff --git a/include/asm-alpha/atomic.h b/include/asm-alpha/atomic.h
deleted file mode 100644 (file)
index ca88e54..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-#ifndef _ALPHA_ATOMIC_H
-#define _ALPHA_ATOMIC_H
-
-#include <asm/barrier.h>
-#include <asm/system.h>
-
-/*
- * Atomic operations that C can't guarantee us.  Useful for
- * resource counting etc...
- *
- * But use these as seldom as possible since they are much slower
- * than regular operations.
- */
-
-
-/*
- * Counter is volatile to make sure gcc doesn't try to be clever
- * and move things around on us. We need to use _exactly_ the address
- * the user gave us, not some alias that contains the same information.
- */
-typedef struct { volatile int counter; } atomic_t;
-typedef struct { volatile long counter; } atomic64_t;
-
-#define ATOMIC_INIT(i)         ( (atomic_t) { (i) } )
-#define ATOMIC64_INIT(i)       ( (atomic64_t) { (i) } )
-
-#define atomic_read(v)         ((v)->counter + 0)
-#define atomic64_read(v)       ((v)->counter + 0)
-
-#define atomic_set(v,i)                ((v)->counter = (i))
-#define atomic64_set(v,i)      ((v)->counter = (i))
-
-/*
- * To get proper branch prediction for the main line, we must branch
- * forward to code at the end of this object's .text section, then
- * branch back to restart the operation.
- */
-
-static __inline__ void atomic_add(int i, atomic_t * v)
-{
-       unsigned long temp;
-       __asm__ __volatile__(
-       "1:     ldl_l %0,%1\n"
-       "       addl %0,%2,%0\n"
-       "       stl_c %0,%1\n"
-       "       beq %0,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (v->counter)
-       :"Ir" (i), "m" (v->counter));
-}
-
-static __inline__ void atomic64_add(long i, atomic64_t * v)
-{
-       unsigned long temp;
-       __asm__ __volatile__(
-       "1:     ldq_l %0,%1\n"
-       "       addq %0,%2,%0\n"
-       "       stq_c %0,%1\n"
-       "       beq %0,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (v->counter)
-       :"Ir" (i), "m" (v->counter));
-}
-
-static __inline__ void atomic_sub(int i, atomic_t * v)
-{
-       unsigned long temp;
-       __asm__ __volatile__(
-       "1:     ldl_l %0,%1\n"
-       "       subl %0,%2,%0\n"
-       "       stl_c %0,%1\n"
-       "       beq %0,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (v->counter)
-       :"Ir" (i), "m" (v->counter));
-}
-
-static __inline__ void atomic64_sub(long i, atomic64_t * v)
-{
-       unsigned long temp;
-       __asm__ __volatile__(
-       "1:     ldq_l %0,%1\n"
-       "       subq %0,%2,%0\n"
-       "       stq_c %0,%1\n"
-       "       beq %0,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (v->counter)
-       :"Ir" (i), "m" (v->counter));
-}
-
-
-/*
- * Same as above, but return the result value
- */
-static inline int atomic_add_return(int i, atomic_t *v)
-{
-       long temp, result;
-       smp_mb();
-       __asm__ __volatile__(
-       "1:     ldl_l %0,%1\n"
-       "       addl %0,%3,%2\n"
-       "       addl %0,%3,%0\n"
-       "       stl_c %0,%1\n"
-       "       beq %0,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (v->counter), "=&r" (result)
-       :"Ir" (i), "m" (v->counter) : "memory");
-       smp_mb();
-       return result;
-}
-
-static __inline__ long atomic64_add_return(long i, atomic64_t * v)
-{
-       long temp, result;
-       smp_mb();
-       __asm__ __volatile__(
-       "1:     ldq_l %0,%1\n"
-       "       addq %0,%3,%2\n"
-       "       addq %0,%3,%0\n"
-       "       stq_c %0,%1\n"
-       "       beq %0,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (v->counter), "=&r" (result)
-       :"Ir" (i), "m" (v->counter) : "memory");
-       smp_mb();
-       return result;
-}
-
-static __inline__ long atomic_sub_return(int i, atomic_t * v)
-{
-       long temp, result;
-       smp_mb();
-       __asm__ __volatile__(
-       "1:     ldl_l %0,%1\n"
-       "       subl %0,%3,%2\n"
-       "       subl %0,%3,%0\n"
-       "       stl_c %0,%1\n"
-       "       beq %0,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (v->counter), "=&r" (result)
-       :"Ir" (i), "m" (v->counter) : "memory");
-       smp_mb();
-       return result;
-}
-
-static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
-{
-       long temp, result;
-       smp_mb();
-       __asm__ __volatile__(
-       "1:     ldq_l %0,%1\n"
-       "       subq %0,%3,%2\n"
-       "       subq %0,%3,%0\n"
-       "       stq_c %0,%1\n"
-       "       beq %0,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (v->counter), "=&r" (result)
-       :"Ir" (i), "m" (v->counter) : "memory");
-       smp_mb();
-       return result;
-}
-
-#define atomic64_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new))
-#define atomic64_xchg(v, new) (xchg(&((v)->counter), new))
-
-#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new))
-#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
-
-/**
- * atomic_add_unless - add unless the number is a given value
- * @v: pointer of type atomic_t
- * @a: the amount to add to v...
- * @u: ...unless v is equal to u.
- *
- * Atomically adds @a to @v, so long as it was not @u.
- * Returns non-zero if @v was not @u, and zero otherwise.
- */
-static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
-{
-       int c, old;
-       c = atomic_read(v);
-       for (;;) {
-               if (unlikely(c == (u)))
-                       break;
-               old = atomic_cmpxchg((v), c, c + (a));
-               if (likely(old == c))
-                       break;
-               c = old;
-       }
-       return c != (u);
-}
-
-#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
-
-/**
- * atomic64_add_unless - add unless the number is a given value
- * @v: pointer of type atomic64_t
- * @a: the amount to add to v...
- * @u: ...unless v is equal to u.
- *
- * Atomically adds @a to @v, so long as it was not @u.
- * Returns non-zero if @v was not @u, and zero otherwise.
- */
-static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
-{
-       long c, old;
-       c = atomic64_read(v);
-       for (;;) {
-               if (unlikely(c == (u)))
-                       break;
-               old = atomic64_cmpxchg((v), c, c + (a));
-               if (likely(old == c))
-                       break;
-               c = old;
-       }
-       return c != (u);
-}
-
-#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
-
-#define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0)
-#define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0)
-
-#define atomic_dec_return(v) atomic_sub_return(1,(v))
-#define atomic64_dec_return(v) atomic64_sub_return(1,(v))
-
-#define atomic_inc_return(v) atomic_add_return(1,(v))
-#define atomic64_inc_return(v) atomic64_add_return(1,(v))
-
-#define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0)
-#define atomic64_sub_and_test(i,v) (atomic64_sub_return((i), (v)) == 0)
-
-#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0)
-#define atomic64_inc_and_test(v) (atomic64_add_return(1, (v)) == 0)
-
-#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
-#define atomic64_dec_and_test(v) (atomic64_sub_return(1, (v)) == 0)
-
-#define atomic_inc(v) atomic_add(1,(v))
-#define atomic64_inc(v) atomic64_add(1,(v))
-
-#define atomic_dec(v) atomic_sub(1,(v))
-#define atomic64_dec(v) atomic64_sub(1,(v))
-
-#define smp_mb__before_atomic_dec()    smp_mb()
-#define smp_mb__after_atomic_dec()     smp_mb()
-#define smp_mb__before_atomic_inc()    smp_mb()
-#define smp_mb__after_atomic_inc()     smp_mb()
-
-#include <asm-generic/atomic.h>
-#endif /* _ALPHA_ATOMIC_H */
diff --git a/include/asm-alpha/auxvec.h b/include/asm-alpha/auxvec.h
deleted file mode 100644 (file)
index e96fe88..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef __ASM_ALPHA_AUXVEC_H
-#define __ASM_ALPHA_AUXVEC_H
-
-/* Reserve these numbers for any future use of a VDSO.  */
-#if 0
-#define AT_SYSINFO             32
-#define AT_SYSINFO_EHDR                33
-#endif
-
-/* More complete cache descriptions than AT_[DIU]CACHEBSIZE.  If the
-   value is -1, then the cache doesn't exist.  Otherwise:
-
-      bit 0-3:   Cache set-associativity; 0 means fully associative.
-      bit 4-7:   Log2 of cacheline size.
-      bit 8-31:          Size of the entire cache >> 8.
-      bit 32-63:  Reserved.
-*/
-
-#define AT_L1I_CACHESHAPE      34
-#define AT_L1D_CACHESHAPE      35
-#define AT_L2_CACHESHAPE       36
-#define AT_L3_CACHESHAPE       37
-
-#endif /* __ASM_ALPHA_AUXVEC_H */
diff --git a/include/asm-alpha/barrier.h b/include/asm-alpha/barrier.h
deleted file mode 100644 (file)
index ac78eba..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef __BARRIER_H
-#define __BARRIER_H
-
-#include <asm/compiler.h>
-
-#define mb() \
-__asm__ __volatile__("mb": : :"memory")
-
-#define rmb() \
-__asm__ __volatile__("mb": : :"memory")
-
-#define wmb() \
-__asm__ __volatile__("wmb": : :"memory")
-
-#define read_barrier_depends() \
-__asm__ __volatile__("mb": : :"memory")
-
-#ifdef CONFIG_SMP
-#define smp_mb()       mb()
-#define smp_rmb()      rmb()
-#define smp_wmb()      wmb()
-#define smp_read_barrier_depends()     read_barrier_depends()
-#else
-#define smp_mb()       barrier()
-#define smp_rmb()      barrier()
-#define smp_wmb()      barrier()
-#define smp_read_barrier_depends()     do { } while (0)
-#endif
-
-#define set_mb(var, value) \
-do { var = value; mb(); } while (0)
-
-#endif         /* __BARRIER_H */
diff --git a/include/asm-alpha/bitops.h b/include/asm-alpha/bitops.h
deleted file mode 100644 (file)
index 15f3ae2..0000000
+++ /dev/null
@@ -1,466 +0,0 @@
-#ifndef _ALPHA_BITOPS_H
-#define _ALPHA_BITOPS_H
-
-#ifndef _LINUX_BITOPS_H
-#error only <linux/bitops.h> can be included directly
-#endif
-
-#include <asm/compiler.h>
-#include <asm/barrier.h>
-
-/*
- * Copyright 1994, Linus Torvalds.
- */
-
-/*
- * These have to be done with inline assembly: that way the bit-setting
- * is guaranteed to be atomic. All bit operations return 0 if the bit
- * was cleared before the operation and != 0 if it was not.
- *
- * To get proper branch prediction for the main line, we must branch
- * forward to code at the end of this object's .text section, then
- * branch back to restart the operation.
- *
- * bit 0 is the LSB of addr; bit 64 is the LSB of (addr+1).
- */
-
-static inline void
-set_bit(unsigned long nr, volatile void * addr)
-{
-       unsigned long temp;
-       int *m = ((int *) addr) + (nr >> 5);
-
-       __asm__ __volatile__(
-       "1:     ldl_l %0,%3\n"
-       "       bis %0,%2,%0\n"
-       "       stl_c %0,%1\n"
-       "       beq %0,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (*m)
-       :"Ir" (1UL << (nr & 31)), "m" (*m));
-}
-
-/*
- * WARNING: non atomic version.
- */
-static inline void
-__set_bit(unsigned long nr, volatile void * addr)
-{
-       int *m = ((int *) addr) + (nr >> 5);
-
-       *m |= 1 << (nr & 31);
-}
-
-#define smp_mb__before_clear_bit()     smp_mb()
-#define smp_mb__after_clear_bit()      smp_mb()
-
-static inline void
-clear_bit(unsigned long nr, volatile void * addr)
-{
-       unsigned long temp;
-       int *m = ((int *) addr) + (nr >> 5);
-
-       __asm__ __volatile__(
-       "1:     ldl_l %0,%3\n"
-       "       bic %0,%2,%0\n"
-       "       stl_c %0,%1\n"
-       "       beq %0,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (*m)
-       :"Ir" (1UL << (nr & 31)), "m" (*m));
-}
-
-static inline void
-clear_bit_unlock(unsigned long nr, volatile void * addr)
-{
-       smp_mb();
-       clear_bit(nr, addr);
-}
-
-/*
- * WARNING: non atomic version.
- */
-static __inline__ void
-__clear_bit(unsigned long nr, volatile void * addr)
-{
-       int *m = ((int *) addr) + (nr >> 5);
-
-       *m &= ~(1 << (nr & 31));
-}
-
-static inline void
-__clear_bit_unlock(unsigned long nr, volatile void * addr)
-{
-       smp_mb();
-       __clear_bit(nr, addr);
-}
-
-static inline void
-change_bit(unsigned long nr, volatile void * addr)
-{
-       unsigned long temp;
-       int *m = ((int *) addr) + (nr >> 5);
-
-       __asm__ __volatile__(
-       "1:     ldl_l %0,%3\n"
-       "       xor %0,%2,%0\n"
-       "       stl_c %0,%1\n"
-       "       beq %0,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (*m)
-       :"Ir" (1UL << (nr & 31)), "m" (*m));
-}
-
-/*
- * WARNING: non atomic version.
- */
-static __inline__ void
-__change_bit(unsigned long nr, volatile void * addr)
-{
-       int *m = ((int *) addr) + (nr >> 5);
-
-       *m ^= 1 << (nr & 31);
-}
-
-static inline int
-test_and_set_bit(unsigned long nr, volatile void *addr)
-{
-       unsigned long oldbit;
-       unsigned long temp;
-       int *m = ((int *) addr) + (nr >> 5);
-
-       __asm__ __volatile__(
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       "1:     ldl_l %0,%4\n"
-       "       and %0,%3,%2\n"
-       "       bne %2,2f\n"
-       "       xor %0,%3,%0\n"
-       "       stl_c %0,%1\n"
-       "       beq %0,3f\n"
-       "2:\n"
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       ".subsection 2\n"
-       "3:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (*m), "=&r" (oldbit)
-       :"Ir" (1UL << (nr & 31)), "m" (*m) : "memory");
-
-       return oldbit != 0;
-}
-
-static inline int
-test_and_set_bit_lock(unsigned long nr, volatile void *addr)
-{
-       unsigned long oldbit;
-       unsigned long temp;
-       int *m = ((int *) addr) + (nr >> 5);
-
-       __asm__ __volatile__(
-       "1:     ldl_l %0,%4\n"
-       "       and %0,%3,%2\n"
-       "       bne %2,2f\n"
-       "       xor %0,%3,%0\n"
-       "       stl_c %0,%1\n"
-       "       beq %0,3f\n"
-       "2:\n"
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       ".subsection 2\n"
-       "3:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (*m), "=&r" (oldbit)
-       :"Ir" (1UL << (nr & 31)), "m" (*m) : "memory");
-
-       return oldbit != 0;
-}
-
-/*
- * WARNING: non atomic version.
- */
-static inline int
-__test_and_set_bit(unsigned long nr, volatile void * addr)
-{
-       unsigned long mask = 1 << (nr & 0x1f);
-       int *m = ((int *) addr) + (nr >> 5);
-       int old = *m;
-
-       *m = old | mask;
-       return (old & mask) != 0;
-}
-
-static inline int
-test_and_clear_bit(unsigned long nr, volatile void * addr)
-{
-       unsigned long oldbit;
-       unsigned long temp;
-       int *m = ((int *) addr) + (nr >> 5);
-
-       __asm__ __volatile__(
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       "1:     ldl_l %0,%4\n"
-       "       and %0,%3,%2\n"
-       "       beq %2,2f\n"
-       "       xor %0,%3,%0\n"
-       "       stl_c %0,%1\n"
-       "       beq %0,3f\n"
-       "2:\n"
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       ".subsection 2\n"
-       "3:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (*m), "=&r" (oldbit)
-       :"Ir" (1UL << (nr & 31)), "m" (*m) : "memory");
-
-       return oldbit != 0;
-}
-
-/*
- * WARNING: non atomic version.
- */
-static inline int
-__test_and_clear_bit(unsigned long nr, volatile void * addr)
-{
-       unsigned long mask = 1 << (nr & 0x1f);
-       int *m = ((int *) addr) + (nr >> 5);
-       int old = *m;
-
-       *m = old & ~mask;
-       return (old & mask) != 0;
-}
-
-static inline int
-test_and_change_bit(unsigned long nr, volatile void * addr)
-{
-       unsigned long oldbit;
-       unsigned long temp;
-       int *m = ((int *) addr) + (nr >> 5);
-
-       __asm__ __volatile__(
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       "1:     ldl_l %0,%4\n"
-       "       and %0,%3,%2\n"
-       "       xor %0,%3,%0\n"
-       "       stl_c %0,%1\n"
-       "       beq %0,3f\n"
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       ".subsection 2\n"
-       "3:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (*m), "=&r" (oldbit)
-       :"Ir" (1UL << (nr & 31)), "m" (*m) : "memory");
-
-       return oldbit != 0;
-}
-
-/*
- * WARNING: non atomic version.
- */
-static __inline__ int
-__test_and_change_bit(unsigned long nr, volatile void * addr)
-{
-       unsigned long mask = 1 << (nr & 0x1f);
-       int *m = ((int *) addr) + (nr >> 5);
-       int old = *m;
-
-       *m = old ^ mask;
-       return (old & mask) != 0;
-}
-
-static inline int
-test_bit(int nr, const volatile void * addr)
-{
-       return (1UL & (((const int *) addr)[nr >> 5] >> (nr & 31))) != 0UL;
-}
-
-/*
- * ffz = Find First Zero in word. Undefined if no zero exists,
- * so code should check against ~0UL first..
- *
- * Do a binary search on the bits.  Due to the nature of large
- * constants on the alpha, it is worthwhile to split the search.
- */
-static inline unsigned long ffz_b(unsigned long x)
-{
-       unsigned long sum, x1, x2, x4;
-
-       x = ~x & -~x;           /* set first 0 bit, clear others */
-       x1 = x & 0xAA;
-       x2 = x & 0xCC;
-       x4 = x & 0xF0;
-       sum = x2 ? 2 : 0;
-       sum += (x4 != 0) * 4;
-       sum += (x1 != 0);
-
-       return sum;
-}
-
-static inline unsigned long ffz(unsigned long word)
-{
-#if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67)
-       /* Whee.  EV67 can calculate it directly.  */
-       return __kernel_cttz(~word);
-#else
-       unsigned long bits, qofs, bofs;
-
-       bits = __kernel_cmpbge(word, ~0UL);
-       qofs = ffz_b(bits);
-       bits = __kernel_extbl(word, qofs);
-       bofs = ffz_b(bits);
-
-       return qofs*8 + bofs;
-#endif
-}
-
-/*
- * __ffs = Find First set bit in word.  Undefined if no set bit exists.
- */
-static inline unsigned long __ffs(unsigned long word)
-{
-#if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67)
-       /* Whee.  EV67 can calculate it directly.  */
-       return __kernel_cttz(word);
-#else
-       unsigned long bits, qofs, bofs;
-
-       bits = __kernel_cmpbge(0, word);
-       qofs = ffz_b(bits);
-       bits = __kernel_extbl(word, qofs);
-       bofs = ffz_b(~bits);
-
-       return qofs*8 + bofs;
-#endif
-}
-
-#ifdef __KERNEL__
-
-/*
- * ffs: find first bit set. This is defined the same way as
- * the libc and compiler builtin ffs routines, therefore
- * differs in spirit from the above __ffs.
- */
-
-static inline int ffs(int word)
-{
-       int result = __ffs(word) + 1;
-       return word ? result : 0;
-}
-
-/*
- * fls: find last bit set.
- */
-#if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67)
-static inline int fls64(unsigned long word)
-{
-       return 64 - __kernel_ctlz(word);
-}
-#else
-extern const unsigned char __flsm1_tab[256];
-
-static inline int fls64(unsigned long x)
-{
-       unsigned long t, a, r;
-
-       t = __kernel_cmpbge (x, 0x0101010101010101UL);
-       a = __flsm1_tab[t];
-       t = __kernel_extbl (x, a);
-       r = a*8 + __flsm1_tab[t] + (x != 0);
-
-       return r;
-}
-#endif
-
-static inline unsigned long __fls(unsigned long x)
-{
-       return fls64(x) - 1;
-}
-
-static inline int fls(int x)
-{
-       return fls64((unsigned int) x);
-}
-
-/*
- * hweightN: returns the hamming weight (i.e. the number
- * of bits set) of a N-bit word
- */
-
-#if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67)
-/* Whee.  EV67 can calculate it directly.  */
-static inline unsigned long hweight64(unsigned long w)
-{
-       return __kernel_ctpop(w);
-}
-
-static inline unsigned int hweight32(unsigned int w)
-{
-       return hweight64(w);
-}
-
-static inline unsigned int hweight16(unsigned int w)
-{
-       return hweight64(w & 0xffff);
-}
-
-static inline unsigned int hweight8(unsigned int w)
-{
-       return hweight64(w & 0xff);
-}
-#else
-#include <asm-generic/bitops/hweight.h>
-#endif
-
-#endif /* __KERNEL__ */
-
-#include <asm-generic/bitops/find.h>
-
-#ifdef __KERNEL__
-
-/*
- * Every architecture must define this function. It's the fastest
- * way of searching a 140-bit bitmap where the first 100 bits are
- * unlikely to be set. It's guaranteed that at least one of the 140
- * bits is set.
- */
-static inline unsigned long
-sched_find_first_bit(unsigned long b[3])
-{
-       unsigned long b0 = b[0], b1 = b[1], b2 = b[2];
-       unsigned long ofs;
-
-       ofs = (b1 ? 64 : 128);
-       b1 = (b1 ? b1 : b2);
-       ofs = (b0 ? 0 : ofs);
-       b0 = (b0 ? b0 : b1);
-
-       return __ffs(b0) + ofs;
-}
-
-#include <asm-generic/bitops/ext2-non-atomic.h>
-
-#define ext2_set_bit_atomic(l,n,a)   test_and_set_bit(n,a)
-#define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a)
-
-#include <asm-generic/bitops/minix.h>
-
-#endif /* __KERNEL__ */
-
-#endif /* _ALPHA_BITOPS_H */
diff --git a/include/asm-alpha/bug.h b/include/asm-alpha/bug.h
deleted file mode 100644 (file)
index 695a5ee..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef _ALPHA_BUG_H
-#define _ALPHA_BUG_H
-
-#include <linux/linkage.h>
-
-#ifdef CONFIG_BUG
-#include <asm/pal.h>
-
-/* ??? Would be nice to use .gprel32 here, but we can't be sure that the
-   function loaded the GP, so this could fail in modules.  */
-static inline void ATTRIB_NORET __BUG(const char *file, int line)
-{
-       __asm__ __volatile__(
-               "call_pal %0  # bugchk\n\t"
-               ".long %1\n\t.8byte %2"
-                      : : "i" (PAL_bugchk), "i"(line), "i"(file));
-       for ( ; ; )
-               ;
-}
-
-#define BUG() __BUG(__FILE__, __LINE__)
-
-#define HAVE_ARCH_BUG
-#endif
-
-#include <asm-generic/bug.h>
-
-#endif
diff --git a/include/asm-alpha/bugs.h b/include/asm-alpha/bugs.h
deleted file mode 100644 (file)
index 78030d1..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  include/asm-alpha/bugs.h
- *
- *  Copyright (C) 1994  Linus Torvalds
- */
-
-/*
- * This is included by init/main.c to check for architecture-dependent bugs.
- *
- * Needs:
- *     void check_bugs(void);
- */
-
-/*
- * I don't know of any alpha bugs yet.. Nice chip
- */
-
-static void check_bugs(void)
-{
-}
diff --git a/include/asm-alpha/byteorder.h b/include/asm-alpha/byteorder.h
deleted file mode 100644 (file)
index 58e958f..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef _ALPHA_BYTEORDER_H
-#define _ALPHA_BYTEORDER_H
-
-#include <asm/types.h>
-#include <linux/compiler.h>
-#include <asm/compiler.h>
-
-#ifdef __GNUC__
-
-static inline __attribute_const__ __u32 __arch__swab32(__u32 x)
-{
-       /*
-        * Unfortunately, we can't use the 6 instruction sequence
-        * on ev6 since the latency of the UNPKBW is 3, which is
-        * pretty hard to hide.  Just in case a future implementation
-        * has a lower latency, here's the sequence (also by Mike Burrows)
-        *
-        * UNPKBW a0, v0       v0: 00AA00BB00CC00DD
-        * SLL v0, 24, a0      a0: BB00CC00DD000000
-        * BIS v0, a0, a0      a0: BBAACCBBDDCC00DD
-        * EXTWL a0, 6, v0     v0: 000000000000BBAA
-        * ZAP a0, 0xf3, a0    a0: 00000000DDCC0000
-        * ADDL a0, v0, v0     v0: ssssssssDDCCBBAA
-        */
-
-       __u64 t0, t1, t2, t3;
-
-       t0 = __kernel_inslh(x, 7);      /* t0 : 0000000000AABBCC */
-       t1 = __kernel_inswl(x, 3);      /* t1 : 000000CCDD000000 */
-       t1 |= t0;                       /* t1 : 000000CCDDAABBCC */
-       t2 = t1 >> 16;                  /* t2 : 0000000000CCDDAA */
-       t0 = t1 & 0xFF00FF00;           /* t0 : 00000000DD00BB00 */
-       t3 = t2 & 0x00FF00FF;           /* t3 : 0000000000CC00AA */
-       t1 = t0 + t3;                   /* t1 : ssssssssDDCCBBAA */
-
-       return t1;
-}
-
-#define __arch__swab32 __arch__swab32
-
-#endif /* __GNUC__ */
-
-#define __BYTEORDER_HAS_U64__
-
-#include <linux/byteorder/little_endian.h>
-
-#endif /* _ALPHA_BYTEORDER_H */
diff --git a/include/asm-alpha/cache.h b/include/asm-alpha/cache.h
deleted file mode 100644 (file)
index f199e69..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * include/asm-alpha/cache.h
- */
-#ifndef __ARCH_ALPHA_CACHE_H
-#define __ARCH_ALPHA_CACHE_H
-
-
-/* Bytes per L1 (data) cache line. */
-#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_EV6)
-# define L1_CACHE_BYTES     64
-# define L1_CACHE_SHIFT     6
-#else
-/* Both EV4 and EV5 are write-through, read-allocate,
-   direct-mapped, physical.
-*/
-# define L1_CACHE_BYTES     32
-# define L1_CACHE_SHIFT     5
-#endif
-
-#define L1_CACHE_ALIGN(x)  (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1))
-#define SMP_CACHE_BYTES    L1_CACHE_BYTES
-
-#endif
diff --git a/include/asm-alpha/cacheflush.h b/include/asm-alpha/cacheflush.h
deleted file mode 100644 (file)
index b686cc7..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef _ALPHA_CACHEFLUSH_H
-#define _ALPHA_CACHEFLUSH_H
-
-#include <linux/mm.h>
-
-/* Caches aren't brain-dead on the Alpha. */
-#define flush_cache_all()                      do { } while (0)
-#define flush_cache_mm(mm)                     do { } while (0)
-#define flush_cache_dup_mm(mm)                 do { } while (0)
-#define flush_cache_range(vma, start, end)     do { } while (0)
-#define flush_cache_page(vma, vmaddr, pfn)     do { } while (0)
-#define flush_dcache_page(page)                        do { } while (0)
-#define flush_dcache_mmap_lock(mapping)                do { } while (0)
-#define flush_dcache_mmap_unlock(mapping)      do { } while (0)
-#define flush_cache_vmap(start, end)           do { } while (0)
-#define flush_cache_vunmap(start, end)         do { } while (0)
-
-/* Note that the following two definitions are _highly_ dependent
-   on the contexts in which they are used in the kernel.  I personally
-   think it is criminal how loosely defined these macros are.  */
-
-/* We need to flush the kernel's icache after loading modules.  The
-   only other use of this macro is in load_aout_interp which is not
-   used on Alpha. 
-
-   Note that this definition should *not* be used for userspace
-   icache flushing.  While functional, it is _way_ overkill.  The
-   icache is tagged with ASNs and it suffices to allocate a new ASN
-   for the process.  */
-#ifndef CONFIG_SMP
-#define flush_icache_range(start, end)         imb()
-#else
-#define flush_icache_range(start, end)         smp_imb()
-extern void smp_imb(void);
-#endif
-
-/* We need to flush the userspace icache after setting breakpoints in
-   ptrace.
-
-   Instead of indiscriminately using imb, take advantage of the fact
-   that icache entries are tagged with the ASN and load a new mm context.  */
-/* ??? Ought to use this in arch/alpha/kernel/signal.c too.  */
-
-#ifndef CONFIG_SMP
-extern void __load_new_mm_context(struct mm_struct *);
-static inline void
-flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
-                       unsigned long addr, int len)
-{
-       if (vma->vm_flags & VM_EXEC) {
-               struct mm_struct *mm = vma->vm_mm;
-               if (current->active_mm == mm)
-                       __load_new_mm_context(mm);
-               else
-                       mm->context[smp_processor_id()] = 0;
-       }
-}
-#else
-extern void flush_icache_user_range(struct vm_area_struct *vma,
-               struct page *page, unsigned long addr, int len);
-#endif
-
-/* This is used only in do_no_page and do_swap_page.  */
-#define flush_icache_page(vma, page) \
-  flush_icache_user_range((vma), (page), 0, 0)
-
-#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
-do { memcpy(dst, src, len); \
-     flush_icache_user_range(vma, page, vaddr, len); \
-} while (0)
-#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
-       memcpy(dst, src, len)
-
-#endif /* _ALPHA_CACHEFLUSH_H */
diff --git a/include/asm-alpha/checksum.h b/include/asm-alpha/checksum.h
deleted file mode 100644 (file)
index d3854bb..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef _ALPHA_CHECKSUM_H
-#define _ALPHA_CHECKSUM_H
-
-#include <linux/in6.h>
-
-/*
- *     This is a version of ip_compute_csum() optimized for IP headers,
- *     which always checksum on 4 octet boundaries.
- */
-extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
-
-/*
- * computes the checksum of the TCP/UDP pseudo-header
- * returns a 16-bit checksum, already complemented
- */
-extern __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,
-                                          unsigned short len,
-                                          unsigned short proto,
-                                          __wsum sum);
-
-__wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
-                               unsigned short len, unsigned short proto,
-                               __wsum sum);
-
-/*
- * computes the checksum of a memory block at buff, length len,
- * and adds in "sum" (32-bit)
- *
- * returns a 32-bit number suitable for feeding into itself
- * or csum_tcpudp_magic
- *
- * this function must be called with even lengths, except
- * for the last fragment, which may be odd
- *
- * it's best to have buff aligned on a 32-bit boundary
- */
-extern __wsum csum_partial(const void *buff, int len, __wsum sum);
-
-/*
- * the same as csum_partial, but copies from src while it
- * checksums
- *
- * here even more important to align src and dst on a 32-bit (or even
- * better 64-bit) boundary
- */
-__wsum csum_partial_copy_from_user(const void __user *src, void *dst, int len, __wsum sum, int *errp);
-
-__wsum csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum);
-
-
-/*
- * this routine is used for miscellaneous IP-like checksums, mainly
- * in icmp.c
- */
-
-extern __sum16 ip_compute_csum(const void *buff, int len);
-
-/*
- *     Fold a partial checksum without adding pseudo headers
- */
-
-static inline __sum16 csum_fold(__wsum csum)
-{
-       u32 sum = (__force u32)csum;
-       sum = (sum & 0xffff) + (sum >> 16);
-       sum = (sum & 0xffff) + (sum >> 16);
-       return (__force __sum16)~sum;
-}
-
-#define _HAVE_ARCH_IPV6_CSUM
-extern __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
-                              const struct in6_addr *daddr,
-                              __u32 len, unsigned short proto,
-                              __wsum sum);
-#endif
diff --git a/include/asm-alpha/compiler.h b/include/asm-alpha/compiler.h
deleted file mode 100644 (file)
index da6bb19..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-#ifndef __ALPHA_COMPILER_H
-#define __ALPHA_COMPILER_H
-
-/* 
- * Herein are macros we use when describing various patterns we want to GCC.
- * In all cases we can get better schedules out of the compiler if we hide
- * as little as possible inside inline assembly.  However, we want to be
- * able to know what we'll get out before giving up inline assembly.  Thus
- * these tests and macros.
- */
-
-#if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3
-# define __kernel_insbl(val, shift)    __builtin_alpha_insbl(val, shift)
-# define __kernel_inswl(val, shift)    __builtin_alpha_inswl(val, shift)
-# define __kernel_insql(val, shift)    __builtin_alpha_insql(val, shift)
-# define __kernel_inslh(val, shift)    __builtin_alpha_inslh(val, shift)
-# define __kernel_extbl(val, shift)    __builtin_alpha_extbl(val, shift)
-# define __kernel_extwl(val, shift)    __builtin_alpha_extwl(val, shift)
-# define __kernel_cmpbge(a, b)         __builtin_alpha_cmpbge(a, b)
-#else
-# define __kernel_insbl(val, shift)                                    \
-  ({ unsigned long __kir;                                              \
-     __asm__("insbl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));  \
-     __kir; })
-# define __kernel_inswl(val, shift)                                    \
-  ({ unsigned long __kir;                                              \
-     __asm__("inswl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));  \
-     __kir; })
-# define __kernel_insql(val, shift)                                    \
-  ({ unsigned long __kir;                                              \
-     __asm__("insql %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));  \
-     __kir; })
-# define __kernel_inslh(val, shift)                                    \
-  ({ unsigned long __kir;                                              \
-     __asm__("inslh %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));  \
-     __kir; })
-# define __kernel_extbl(val, shift)                                    \
-  ({ unsigned long __kir;                                              \
-     __asm__("extbl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));  \
-     __kir; })
-# define __kernel_extwl(val, shift)                                    \
-  ({ unsigned long __kir;                                              \
-     __asm__("extwl %2,%1,%0" : "=r"(__kir) : "rI"(shift), "r"(val));  \
-     __kir; })
-# define __kernel_cmpbge(a, b)                                         \
-  ({ unsigned long __kir;                                              \
-     __asm__("cmpbge %r2,%1,%0" : "=r"(__kir) : "rI"(b), "rJ"(a));     \
-     __kir; })
-#endif
-
-#ifdef __alpha_cix__
-# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3
-#  define __kernel_cttz(x)             __builtin_ctzl(x)
-#  define __kernel_ctlz(x)             __builtin_clzl(x)
-#  define __kernel_ctpop(x)            __builtin_popcountl(x)
-# else
-#  define __kernel_cttz(x)                                             \
-   ({ unsigned long __kir;                                             \
-      __asm__("cttz %1,%0" : "=r"(__kir) : "r"(x));                    \
-      __kir; })
-#  define __kernel_ctlz(x)                                             \
-   ({ unsigned long __kir;                                             \
-      __asm__("ctlz %1,%0" : "=r"(__kir) : "r"(x));                    \
-      __kir; })
-#  define __kernel_ctpop(x)                                            \
-   ({ unsigned long __kir;                                             \
-      __asm__("ctpop %1,%0" : "=r"(__kir) : "r"(x));                   \
-      __kir; })
-# endif
-#else
-# define __kernel_cttz(x)                                              \
-  ({ unsigned long __kir;                                              \
-     __asm__(".arch ev67; cttz %1,%0" : "=r"(__kir) : "r"(x));         \
-     __kir; })
-# define __kernel_ctlz(x)                                              \
-  ({ unsigned long __kir;                                              \
-     __asm__(".arch ev67; ctlz %1,%0" : "=r"(__kir) : "r"(x));         \
-     __kir; })
-# define __kernel_ctpop(x)                                             \
-  ({ unsigned long __kir;                                              \
-     __asm__(".arch ev67; ctpop %1,%0" : "=r"(__kir) : "r"(x));                \
-     __kir; })
-#endif
-
-
-/* 
- * Beginning with EGCS 1.1, GCC defines __alpha_bwx__ when the BWX 
- * extension is enabled.  Previous versions did not define anything
- * we could test during compilation -- too bad, so sad.
- */
-
-#if defined(__alpha_bwx__)
-#define __kernel_ldbu(mem)     (mem)
-#define __kernel_ldwu(mem)     (mem)
-#define __kernel_stb(val,mem)  ((mem) = (val))
-#define __kernel_stw(val,mem)  ((mem) = (val))
-#else
-#define __kernel_ldbu(mem)                             \
-  ({ unsigned char __kir;                              \
-     __asm__(".arch ev56;                              \
-             ldbu %0,%1" : "=r"(__kir) : "m"(mem));    \
-     __kir; })
-#define __kernel_ldwu(mem)                             \
-  ({ unsigned short __kir;                             \
-     __asm__(".arch ev56;                              \
-             ldwu %0,%1" : "=r"(__kir) : "m"(mem));    \
-     __kir; })
-#define __kernel_stb(val,mem)                          \
-  __asm__(".arch ev56;                                 \
-          stb %1,%0" : "=m"(mem) : "r"(val))
-#define __kernel_stw(val,mem)                          \
-  __asm__(".arch ev56;                                 \
-          stw %1,%0" : "=m"(mem) : "r"(val))
-#endif
-
-#ifdef __KERNEL__
-/* Some idiots over in <linux/compiler.h> thought inline should imply
-   always_inline.  This breaks stuff.  We'll include this file whenever
-   we run into such problems.  */
-
-#include <linux/compiler.h>
-#undef inline
-#undef __inline__
-#undef __inline
-#undef __always_inline
-#define __always_inline                inline __attribute__((always_inline))
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_COMPILER_H */
diff --git a/include/asm-alpha/console.h b/include/asm-alpha/console.h
deleted file mode 100644 (file)
index a3ce4e6..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef __AXP_CONSOLE_H
-#define __AXP_CONSOLE_H
-
-/*
- * Console callback routine numbers
- */
-#define CCB_GETC               0x01
-#define CCB_PUTS               0x02
-#define CCB_RESET_TERM         0x03
-#define CCB_SET_TERM_INT       0x04
-#define CCB_SET_TERM_CTL       0x05
-#define CCB_PROCESS_KEYCODE    0x06
-#define CCB_OPEN_CONSOLE       0x07
-#define CCB_CLOSE_CONSOLE      0x08
-
-#define CCB_OPEN               0x10
-#define CCB_CLOSE              0x11
-#define CCB_IOCTL              0x12
-#define CCB_READ               0x13
-#define CCB_WRITE              0x14
-
-#define CCB_SET_ENV            0x20
-#define CCB_RESET_ENV          0x21
-#define CCB_GET_ENV            0x22
-#define CCB_SAVE_ENV           0x23
-
-#define CCB_PSWITCH            0x30
-#define CCB_BIOS_EMUL          0x32
-
-/*
- * Environment variable numbers
- */
-#define ENV_AUTO_ACTION                0x01
-#define ENV_BOOT_DEV           0x02
-#define ENV_BOOTDEF_DEV                0x03
-#define ENV_BOOTED_DEV         0x04
-#define ENV_BOOT_FILE          0x05
-#define ENV_BOOTED_FILE                0x06
-#define ENV_BOOT_OSFLAGS       0x07
-#define ENV_BOOTED_OSFLAGS     0x08
-#define ENV_BOOT_RESET         0x09
-#define ENV_DUMP_DEV           0x0A
-#define ENV_ENABLE_AUDIT       0x0B
-#define ENV_LICENSE            0x0C
-#define ENV_CHAR_SET           0x0D
-#define ENV_LANGUAGE           0x0E
-#define ENV_TTY_DEV            0x0F
-
-#ifdef __KERNEL__
-#ifndef __ASSEMBLY__
-extern long callback_puts(long unit, const char *s, long length);
-extern long callback_getc(long unit);
-extern long callback_open_console(void);
-extern long callback_close_console(void);
-extern long callback_open(const char *device, long length);
-extern long callback_close(long unit);
-extern long callback_read(long channel, long count, const char *buf, long lbn);
-extern long callback_getenv(long id, const char *buf, unsigned long buf_size);
-extern long callback_setenv(long id, const char *buf, unsigned long buf_size);
-extern long callback_save_env(void);
-
-extern int srm_fixup(unsigned long new_callback_addr,
-                    unsigned long new_hwrpb_addr);
-extern long srm_puts(const char *, long);
-extern long srm_printk(const char *, ...)
-       __attribute__ ((format (printf, 1, 2)));
-
-struct crb_struct;
-struct hwrpb_struct;
-extern int callback_init_done;
-extern void * callback_init(void *);
-#endif /* __ASSEMBLY__ */
-#endif /* __KERNEL__ */
-
-#endif /* __AXP_CONSOLE_H */
diff --git a/include/asm-alpha/core_apecs.h b/include/asm-alpha/core_apecs.h
deleted file mode 100644 (file)
index 6785ff7..0000000
+++ /dev/null
@@ -1,517 +0,0 @@
-#ifndef __ALPHA_APECS__H__
-#define __ALPHA_APECS__H__
-
-#include <linux/types.h>
-#include <asm/compiler.h>
-
-/*
- * APECS is the internal name for the 2107x chipset which provides
- * memory controller and PCI access for the 21064 chip based systems.
- *
- * This file is based on:
- *
- * DECchip 21071-AA and DECchip 21072-AA Core Logic Chipsets
- * Data Sheet
- *
- * EC-N0648-72
- *
- *
- * david.rusling@reo.mts.dec.com Initial Version.
- *
- */
-
-/*
-   An AVANTI *might* be an XL, and an XL has only 27 bits of ISA address
-   that get passed through the PCI<->ISA bridge chip. So we've gotta use
-   both windows to max out the physical memory we can DMA to. Sigh...
-
-   If we try a window at 0 for 1GB as a work-around, we run into conflicts
-   with ISA/PCI bus memory which can't be relocated, like VGA aperture and
-   BIOS ROMs. So we must put the windows high enough to avoid these areas.
-
-   We put window 1 at BUS 64Mb for 64Mb, mapping physical 0 to 64Mb-1,
-   and window 2 at BUS 1Gb for 1Gb, mapping physical 0 to 1Gb-1.
-   Yes, this does map 0 to 64Mb-1 twice, but only window 1 will actually
-   be used for that range (via virt_to_bus()).
-
-   Note that we actually fudge the window 1 maximum as 48Mb instead of 64Mb,
-   to keep virt_to_bus() from returning an address in the first window, for
-   a data area that goes beyond the 64Mb first DMA window.  Sigh...
-   The fudge factor MUST match with <asm/dma.h> MAX_DMA_ADDRESS, but
-   we can't just use that here, because of header file looping... :-(
-
-   Window 1 will be used for all DMA from the ISA bus; yes, that does
-   limit what memory an ISA floppy or sound card or Ethernet can touch, but
-   it's also a known limitation on other platforms as well. We use the
-   same technique that is used on INTEL platforms with similar limitation:
-   set MAX_DMA_ADDRESS and clear some pages' DMAable flags during mem_init().
-   We trust that any ISA bus device drivers will *always* ask for DMAable
-   memory explicitly via kmalloc()/get_free_pages() flags arguments.
-
-   Note that most PCI bus devices' drivers do *not* explicitly ask for
-   DMAable memory; they count on being able to DMA to any memory they
-   get from kmalloc()/get_free_pages(). They will also use window 1 for
-   any physical memory accesses below 64Mb; the rest will be handled by
-   window 2, maxing out at 1Gb of memory. I trust this is enough... :-)
-
-   We hope that the area before the first window is large enough so that
-   there will be no overlap at the top end (64Mb). We *must* locate the
-   PCI cards' memory just below window 1, so that there's still the
-   possibility of being able to access it via SPARSE space. This is
-   important for cards such as the Matrox Millennium, whose Xserver
-   wants to access memory-mapped registers in byte and short lengths.
-
-   Note that the XL is treated differently from the AVANTI, even though
-   for most other things they are identical. It didn't seem reasonable to
-   make the AVANTI support pay for the limitations of the XL. It is true,
-   however, that an XL kernel will run on an AVANTI without problems.
-
-   %%% All of this should be obviated by the ability to route
-   everything through the iommu.
-*/
-
-/*
- * 21071-DA Control and Status registers.
- * These are used for PCI memory access.
- */
-#define APECS_IOC_DCSR                  (IDENT_ADDR + 0x1A0000000UL)
-#define APECS_IOC_PEAR                  (IDENT_ADDR + 0x1A0000020UL)
-#define APECS_IOC_SEAR                  (IDENT_ADDR + 0x1A0000040UL)
-#define APECS_IOC_DR1                   (IDENT_ADDR + 0x1A0000060UL)
-#define APECS_IOC_DR2                   (IDENT_ADDR + 0x1A0000080UL)
-#define APECS_IOC_DR3                   (IDENT_ADDR + 0x1A00000A0UL)
-
-#define APECS_IOC_TB1R                  (IDENT_ADDR + 0x1A00000C0UL)
-#define APECS_IOC_TB2R                  (IDENT_ADDR + 0x1A00000E0UL)
-
-#define APECS_IOC_PB1R                  (IDENT_ADDR + 0x1A0000100UL)
-#define APECS_IOC_PB2R                  (IDENT_ADDR + 0x1A0000120UL)
-
-#define APECS_IOC_PM1R                  (IDENT_ADDR + 0x1A0000140UL)
-#define APECS_IOC_PM2R                  (IDENT_ADDR + 0x1A0000160UL)
-
-#define APECS_IOC_HAXR0                 (IDENT_ADDR + 0x1A0000180UL)
-#define APECS_IOC_HAXR1                 (IDENT_ADDR + 0x1A00001A0UL)
-#define APECS_IOC_HAXR2                 (IDENT_ADDR + 0x1A00001C0UL)
-
-#define APECS_IOC_PMLT                  (IDENT_ADDR + 0x1A00001E0UL)
-
-#define APECS_IOC_TLBTAG0               (IDENT_ADDR + 0x1A0000200UL)
-#define APECS_IOC_TLBTAG1               (IDENT_ADDR + 0x1A0000220UL)
-#define APECS_IOC_TLBTAG2               (IDENT_ADDR + 0x1A0000240UL)
-#define APECS_IOC_TLBTAG3               (IDENT_ADDR + 0x1A0000260UL)
-#define APECS_IOC_TLBTAG4               (IDENT_ADDR + 0x1A0000280UL)
-#define APECS_IOC_TLBTAG5               (IDENT_ADDR + 0x1A00002A0UL)
-#define APECS_IOC_TLBTAG6               (IDENT_ADDR + 0x1A00002C0UL)
-#define APECS_IOC_TLBTAG7               (IDENT_ADDR + 0x1A00002E0UL)
-
-#define APECS_IOC_TLBDATA0              (IDENT_ADDR + 0x1A0000300UL)
-#define APECS_IOC_TLBDATA1              (IDENT_ADDR + 0x1A0000320UL)
-#define APECS_IOC_TLBDATA2              (IDENT_ADDR + 0x1A0000340UL)
-#define APECS_IOC_TLBDATA3              (IDENT_ADDR + 0x1A0000360UL)
-#define APECS_IOC_TLBDATA4              (IDENT_ADDR + 0x1A0000380UL)
-#define APECS_IOC_TLBDATA5              (IDENT_ADDR + 0x1A00003A0UL)
-#define APECS_IOC_TLBDATA6              (IDENT_ADDR + 0x1A00003C0UL)
-#define APECS_IOC_TLBDATA7              (IDENT_ADDR + 0x1A00003E0UL)
-
-#define APECS_IOC_TBIA                  (IDENT_ADDR + 0x1A0000400UL)
-
-
-/*
- * 21071-CA Control and Status registers.
- * These are used to program memory timing,
- *  configure memory and initialise the B-Cache.
- */
-#define APECS_MEM_GCR                  (IDENT_ADDR + 0x180000000UL)
-#define APECS_MEM_EDSR                 (IDENT_ADDR + 0x180000040UL)
-#define APECS_MEM_TAR                          (IDENT_ADDR + 0x180000060UL)
-#define APECS_MEM_ELAR                 (IDENT_ADDR + 0x180000080UL)
-#define APECS_MEM_EHAR                 (IDENT_ADDR + 0x1800000a0UL)
-#define APECS_MEM_SFT_RST              (IDENT_ADDR + 0x1800000c0UL)
-#define APECS_MEM_LDxLAR               (IDENT_ADDR + 0x1800000e0UL)
-#define APECS_MEM_LDxHAR               (IDENT_ADDR + 0x180000100UL)
-#define APECS_MEM_GTR                  (IDENT_ADDR + 0x180000200UL)
-#define APECS_MEM_RTR                  (IDENT_ADDR + 0x180000220UL)
-#define APECS_MEM_VFPR                 (IDENT_ADDR + 0x180000240UL)
-#define APECS_MEM_PDLDR                (IDENT_ADDR + 0x180000260UL)
-#define APECS_MEM_PDhDR                (IDENT_ADDR + 0x180000280UL)
-
-/* Bank x Base Address Register */
-#define APECS_MEM_B0BAR                (IDENT_ADDR + 0x180000800UL)
-#define APECS_MEM_B1BAR                (IDENT_ADDR + 0x180000820UL)
-#define APECS_MEM_B2BAR                (IDENT_ADDR + 0x180000840UL)
-#define APECS_MEM_B3BAR                (IDENT_ADDR + 0x180000860UL)
-#define APECS_MEM_B4BAR                (IDENT_ADDR + 0x180000880UL)
-#define APECS_MEM_B5BAR                (IDENT_ADDR + 0x1800008A0UL)
-#define APECS_MEM_B6BAR                (IDENT_ADDR + 0x1800008C0UL)
-#define APECS_MEM_B7BAR                (IDENT_ADDR + 0x1800008E0UL)
-#define APECS_MEM_B8BAR                (IDENT_ADDR + 0x180000900UL)
-
-/* Bank x Configuration Register */
-#define APECS_MEM_B0BCR                (IDENT_ADDR + 0x180000A00UL)
-#define APECS_MEM_B1BCR                (IDENT_ADDR + 0x180000A20UL)
-#define APECS_MEM_B2BCR                (IDENT_ADDR + 0x180000A40UL)
-#define APECS_MEM_B3BCR                (IDENT_ADDR + 0x180000A60UL)
-#define APECS_MEM_B4BCR                (IDENT_ADDR + 0x180000A80UL)
-#define APECS_MEM_B5BCR                (IDENT_ADDR + 0x180000AA0UL)
-#define APECS_MEM_B6BCR                (IDENT_ADDR + 0x180000AC0UL)
-#define APECS_MEM_B7BCR                (IDENT_ADDR + 0x180000AE0UL)
-#define APECS_MEM_B8BCR                (IDENT_ADDR + 0x180000B00UL)
-
-/* Bank x Timing Register A */
-#define APECS_MEM_B0TRA                (IDENT_ADDR + 0x180000C00UL)
-#define APECS_MEM_B1TRA                (IDENT_ADDR + 0x180000C20UL)
-#define APECS_MEM_B2TRA                (IDENT_ADDR + 0x180000C40UL)
-#define APECS_MEM_B3TRA                (IDENT_ADDR + 0x180000C60UL)
-#define APECS_MEM_B4TRA                (IDENT_ADDR + 0x180000C80UL)
-#define APECS_MEM_B5TRA                (IDENT_ADDR + 0x180000CA0UL)
-#define APECS_MEM_B6TRA                (IDENT_ADDR + 0x180000CC0UL)
-#define APECS_MEM_B7TRA                (IDENT_ADDR + 0x180000CE0UL)
-#define APECS_MEM_B8TRA                (IDENT_ADDR + 0x180000D00UL)
-
-/* Bank x Timing Register B */
-#define APECS_MEM_B0TRB                 (IDENT_ADDR + 0x180000E00UL)
-#define APECS_MEM_B1TRB                (IDENT_ADDR + 0x180000E20UL)
-#define APECS_MEM_B2TRB                (IDENT_ADDR + 0x180000E40UL)
-#define APECS_MEM_B3TRB                (IDENT_ADDR + 0x180000E60UL)
-#define APECS_MEM_B4TRB                (IDENT_ADDR + 0x180000E80UL)
-#define APECS_MEM_B5TRB                (IDENT_ADDR + 0x180000EA0UL)
-#define APECS_MEM_B6TRB                (IDENT_ADDR + 0x180000EC0UL)
-#define APECS_MEM_B7TRB                (IDENT_ADDR + 0x180000EE0UL)
-#define APECS_MEM_B8TRB                (IDENT_ADDR + 0x180000F00UL)
-
-
-/*
- * Memory spaces:
- */
-#define APECS_IACK_SC                  (IDENT_ADDR + 0x1b0000000UL)
-#define APECS_CONF                     (IDENT_ADDR + 0x1e0000000UL)
-#define APECS_IO                       (IDENT_ADDR + 0x1c0000000UL)
-#define APECS_SPARSE_MEM               (IDENT_ADDR + 0x200000000UL)
-#define APECS_DENSE_MEM                        (IDENT_ADDR + 0x300000000UL)
-
-
-/*
- * Bit definitions for I/O Controller status register 0:
- */
-#define APECS_IOC_STAT0_CMD            0xf
-#define APECS_IOC_STAT0_ERR            (1<<4)
-#define APECS_IOC_STAT0_LOST           (1<<5)
-#define APECS_IOC_STAT0_THIT           (1<<6)
-#define APECS_IOC_STAT0_TREF           (1<<7)
-#define APECS_IOC_STAT0_CODE_SHIFT     8
-#define APECS_IOC_STAT0_CODE_MASK      0x7
-#define APECS_IOC_STAT0_P_NBR_SHIFT    13
-#define APECS_IOC_STAT0_P_NBR_MASK     0x7ffff
-
-#define APECS_HAE_ADDRESS              APECS_IOC_HAXR1
-
-
-/*
- * Data structure for handling APECS machine checks:
- */
-
-struct el_apecs_mikasa_sysdata_mcheck
-{
-       unsigned long coma_gcr;
-       unsigned long coma_edsr;
-       unsigned long coma_ter;
-       unsigned long coma_elar;
-       unsigned long coma_ehar;
-       unsigned long coma_ldlr;
-       unsigned long coma_ldhr;
-       unsigned long coma_base0;
-       unsigned long coma_base1;
-       unsigned long coma_base2;
-       unsigned long coma_base3;
-       unsigned long coma_cnfg0;
-       unsigned long coma_cnfg1;
-       unsigned long coma_cnfg2;
-       unsigned long coma_cnfg3;
-       unsigned long epic_dcsr;
-       unsigned long epic_pear;
-       unsigned long epic_sear;
-       unsigned long epic_tbr1;
-       unsigned long epic_tbr2;
-       unsigned long epic_pbr1;
-       unsigned long epic_pbr2;
-       unsigned long epic_pmr1;
-       unsigned long epic_pmr2;
-       unsigned long epic_harx1;
-       unsigned long epic_harx2;
-       unsigned long epic_pmlt;
-       unsigned long epic_tag0;
-       unsigned long epic_tag1;
-       unsigned long epic_tag2;
-       unsigned long epic_tag3;
-       unsigned long epic_tag4;
-       unsigned long epic_tag5;
-       unsigned long epic_tag6;
-       unsigned long epic_tag7;
-       unsigned long epic_data0;
-       unsigned long epic_data1;
-       unsigned long epic_data2;
-       unsigned long epic_data3;
-       unsigned long epic_data4;
-       unsigned long epic_data5;
-       unsigned long epic_data6;
-       unsigned long epic_data7;
-
-       unsigned long pceb_vid;
-       unsigned long pceb_did;
-       unsigned long pceb_revision;
-       unsigned long pceb_command;
-       unsigned long pceb_status;
-       unsigned long pceb_latency;
-       unsigned long pceb_control;
-       unsigned long pceb_arbcon;
-       unsigned long pceb_arbpri;
-
-       unsigned long esc_id;
-       unsigned long esc_revision;
-       unsigned long esc_int0;
-       unsigned long esc_int1;
-       unsigned long esc_elcr0;
-       unsigned long esc_elcr1;
-       unsigned long esc_last_eisa;
-       unsigned long esc_nmi_stat;
-
-       unsigned long pci_ir;
-       unsigned long pci_imr;
-       unsigned long svr_mgr;
-};
-
-/* This for the normal APECS machines.  */
-struct el_apecs_sysdata_mcheck
-{
-       unsigned long coma_gcr;
-       unsigned long coma_edsr;
-       unsigned long coma_ter;
-       unsigned long coma_elar;
-       unsigned long coma_ehar;
-       unsigned long coma_ldlr;
-       unsigned long coma_ldhr;
-       unsigned long coma_base0;
-       unsigned long coma_base1;
-       unsigned long coma_base2;
-       unsigned long coma_cnfg0;
-       unsigned long coma_cnfg1;
-       unsigned long coma_cnfg2;
-       unsigned long epic_dcsr;
-       unsigned long epic_pear;
-       unsigned long epic_sear;
-       unsigned long epic_tbr1;
-       unsigned long epic_tbr2;
-       unsigned long epic_pbr1;
-       unsigned long epic_pbr2;
-       unsigned long epic_pmr1;
-       unsigned long epic_pmr2;
-       unsigned long epic_harx1;
-       unsigned long epic_harx2;
-       unsigned long epic_pmlt;
-       unsigned long epic_tag0;
-       unsigned long epic_tag1;
-       unsigned long epic_tag2;
-       unsigned long epic_tag3;
-       unsigned long epic_tag4;
-       unsigned long epic_tag5;
-       unsigned long epic_tag6;
-       unsigned long epic_tag7;
-       unsigned long epic_data0;
-       unsigned long epic_data1;
-       unsigned long epic_data2;
-       unsigned long epic_data3;
-       unsigned long epic_data4;
-       unsigned long epic_data5;
-       unsigned long epic_data6;
-       unsigned long epic_data7;
-};
-
-struct el_apecs_procdata
-{
-       unsigned long paltemp[32];  /* PAL TEMP REGS. */
-       /* EV4-specific fields */
-       unsigned long exc_addr;     /* Address of excepting instruction. */
-       unsigned long exc_sum;      /* Summary of arithmetic traps. */
-       unsigned long exc_mask;     /* Exception mask (from exc_sum). */
-       unsigned long iccsr;        /* IBox hardware enables. */
-       unsigned long pal_base;     /* Base address for PALcode. */
-       unsigned long hier;         /* Hardware Interrupt Enable. */
-       unsigned long hirr;         /* Hardware Interrupt Request. */
-       unsigned long csr;          /* D-stream fault info. */
-       unsigned long dc_stat;      /* D-cache status (ECC/Parity Err). */
-       unsigned long dc_addr;      /* EV3 Phys Addr for ECC/DPERR. */
-       unsigned long abox_ctl;     /* ABox Control Register. */
-       unsigned long biu_stat;     /* BIU Status. */
-       unsigned long biu_addr;     /* BUI Address. */
-       unsigned long biu_ctl;      /* BIU Control. */
-       unsigned long fill_syndrome;/* For correcting ECC errors. */
-       unsigned long fill_addr;    /* Cache block which was being read */
-       unsigned long va;           /* Effective VA of fault or miss. */
-       unsigned long bc_tag;       /* Backup Cache Tag Probe Results.*/
-};
-
-
-#ifdef __KERNEL__
-
-#ifndef __EXTERN_INLINE
-#define __EXTERN_INLINE extern inline
-#define __IO_EXTERN_INLINE
-#endif
-
-/*
- * I/O functions:
- *
- * Unlike Jensen, the APECS machines have no concept of local
- * I/O---everything goes over the PCI bus.
- *
- * There is plenty room for optimization here.  In particular,
- * the Alpha's insb/insw/extb/extw should be useful in moving
- * data to/from the right byte-lanes.
- */
-
-#define vip    volatile int __force *
-#define vuip   volatile unsigned int __force *
-#define vulp   volatile unsigned long __force *
-
-#define APECS_SET_HAE                                          \
-       do {                                                    \
-               if (addr >= (1UL << 24)) {                      \
-                       unsigned long msb = addr & 0xf8000000;  \
-                       addr -= msb;                            \
-                       set_hae(msb);                           \
-               }                                               \
-       } while (0)
-
-__EXTERN_INLINE unsigned int apecs_ioread8(void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       unsigned long result, base_and_type;
-
-       if (addr >= APECS_DENSE_MEM) {
-               addr -= APECS_DENSE_MEM;
-               APECS_SET_HAE;
-               base_and_type = APECS_SPARSE_MEM + 0x00;
-       } else {
-               addr -= APECS_IO;
-               base_and_type = APECS_IO + 0x00;
-       }
-
-       result = *(vip) ((addr << 5) + base_and_type);
-       return __kernel_extbl(result, addr & 3);
-}
-
-__EXTERN_INLINE void apecs_iowrite8(u8 b, void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       unsigned long w, base_and_type;
-
-       if (addr >= APECS_DENSE_MEM) {
-               addr -= APECS_DENSE_MEM;
-               APECS_SET_HAE;
-               base_and_type = APECS_SPARSE_MEM + 0x00;
-       } else {
-               addr -= APECS_IO;
-               base_and_type = APECS_IO + 0x00;
-       }
-
-       w = __kernel_insbl(b, addr & 3);
-       *(vuip) ((addr << 5) + base_and_type) = w;
-}
-
-__EXTERN_INLINE unsigned int apecs_ioread16(void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       unsigned long result, base_and_type;
-
-       if (addr >= APECS_DENSE_MEM) {
-               addr -= APECS_DENSE_MEM;
-               APECS_SET_HAE;
-               base_and_type = APECS_SPARSE_MEM + 0x08;
-       } else {
-               addr -= APECS_IO;
-               base_and_type = APECS_IO + 0x08;
-       }
-
-       result = *(vip) ((addr << 5) + base_and_type);
-       return __kernel_extwl(result, addr & 3);
-}
-
-__EXTERN_INLINE void apecs_iowrite16(u16 b, void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       unsigned long w, base_and_type;
-
-       if (addr >= APECS_DENSE_MEM) {
-               addr -= APECS_DENSE_MEM;
-               APECS_SET_HAE;
-               base_and_type = APECS_SPARSE_MEM + 0x08;
-       } else {
-               addr -= APECS_IO;
-               base_and_type = APECS_IO + 0x08;
-       }
-
-       w = __kernel_inswl(b, addr & 3);
-       *(vuip) ((addr << 5) + base_and_type) = w;
-}
-
-__EXTERN_INLINE unsigned int apecs_ioread32(void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       if (addr < APECS_DENSE_MEM)
-               addr = ((addr - APECS_IO) << 5) + APECS_IO + 0x18;
-       return *(vuip)addr;
-}
-
-__EXTERN_INLINE void apecs_iowrite32(u32 b, void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       if (addr < APECS_DENSE_MEM)
-               addr = ((addr - APECS_IO) << 5) + APECS_IO + 0x18;
-       *(vuip)addr = b;
-}
-
-__EXTERN_INLINE void __iomem *apecs_ioportmap(unsigned long addr)
-{
-       return (void __iomem *)(addr + APECS_IO);
-}
-
-__EXTERN_INLINE void __iomem *apecs_ioremap(unsigned long addr,
-                                           unsigned long size)
-{
-       return (void __iomem *)(addr + APECS_DENSE_MEM);
-}
-
-__EXTERN_INLINE int apecs_is_ioaddr(unsigned long addr)
-{
-       return addr >= IDENT_ADDR + 0x180000000UL;
-}
-
-__EXTERN_INLINE int apecs_is_mmio(const volatile void __iomem *addr)
-{
-       return (unsigned long)addr >= APECS_DENSE_MEM;
-}
-
-#undef APECS_SET_HAE
-
-#undef vip
-#undef vuip
-#undef vulp
-
-#undef __IO_PREFIX
-#define __IO_PREFIX            apecs
-#define apecs_trivial_io_bw    0
-#define apecs_trivial_io_lq    0
-#define apecs_trivial_rw_bw    2
-#define apecs_trivial_rw_lq    1
-#define apecs_trivial_iounmap  1
-#include <asm/io_trivial.h>
-
-#ifdef __IO_EXTERN_INLINE
-#undef __EXTERN_INLINE
-#undef __IO_EXTERN_INLINE
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_APECS__H__ */
diff --git a/include/asm-alpha/core_cia.h b/include/asm-alpha/core_cia.h
deleted file mode 100644 (file)
index 9e0516c..0000000
+++ /dev/null
@@ -1,500 +0,0 @@
-#ifndef __ALPHA_CIA__H__
-#define __ALPHA_CIA__H__
-
-/* Define to experiment with fitting everything into one 512MB HAE window.  */
-#define CIA_ONE_HAE_WINDOW 1
-
-#include <linux/types.h>
-#include <asm/compiler.h>
-
-/*
- * CIA is the internal name for the 21171 chipset which provides
- * memory controller and PCI access for the 21164 chip based systems.
- * Also supported here is the 21172 (CIA-2) and 21174 (PYXIS).
- *
- * The lineage is a bit confused, since the 21174 was reportedly started
- * from the 21171 Pass 1 mask, and so is missing bug fixes that appear
- * in 21171 Pass 2 and 21172, but it also contains additional features.
- *
- * This file is based on:
- *
- * DECchip 21171 Core Logic Chipset
- * Technical Reference Manual
- *
- * EC-QE18B-TE
- *
- * david.rusling@reo.mts.dec.com Initial Version.
- *
- */
-
-/*
- * CIA ADDRESS BIT DEFINITIONS
- *
- *  3333 3333 3322 2222 2222 1111 1111 11
- *  9876 5432 1098 7654 3210 9876 5432 1098 7654 3210
- *  ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
- *  1                                             000
- *  ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
- *  |                                             |\|
- *  |                               Byte Enable --+ |
- *  |                             Transfer Length --+
- *  +-- IO space, not cached
- *
- *   Byte      Transfer
- *   Enable    Length    Transfer  Byte    Address
- *   adr<6:5>  adr<4:3>  Length    Enable  Adder
- *   ---------------------------------------------
- *      00        00      Byte      1110   0x000
- *      01        00      Byte      1101   0x020
- *      10        00      Byte      1011   0x040
- *      11        00      Byte      0111   0x060
- *
- *      00        01      Word      1100   0x008
- *      01        01      Word      1001   0x028 <= Not supported in this code.
- *      10        01      Word      0011   0x048
- *
- *      00        10      Tribyte   1000   0x010
- *      01        10      Tribyte   0001   0x030
- *
- *      10        11      Longword  0000   0x058
- *
- *      Note that byte enables are asserted low.
- *
- */
-
-#define CIA_MEM_R1_MASK 0x1fffffff  /* SPARSE Mem region 1 mask is 29 bits */
-#define CIA_MEM_R2_MASK 0x07ffffff  /* SPARSE Mem region 2 mask is 27 bits */
-#define CIA_MEM_R3_MASK 0x03ffffff  /* SPARSE Mem region 3 mask is 26 bits */
-
-/*
- * 21171-CA Control and Status Registers
- */
-#define CIA_IOC_CIA_REV                        (IDENT_ADDR + 0x8740000080UL)
-#  define CIA_REV_MASK                 0xff
-#define CIA_IOC_PCI_LAT                        (IDENT_ADDR + 0x87400000C0UL)
-#define CIA_IOC_CIA_CTRL               (IDENT_ADDR + 0x8740000100UL)
-#  define CIA_CTRL_PCI_EN              (1 << 0)
-#  define CIA_CTRL_PCI_LOCK_EN         (1 << 1)
-#  define CIA_CTRL_PCI_LOOP_EN         (1 << 2)
-#  define CIA_CTRL_FST_BB_EN           (1 << 3)
-#  define CIA_CTRL_PCI_MST_EN          (1 << 4)
-#  define CIA_CTRL_PCI_MEM_EN          (1 << 5)
-#  define CIA_CTRL_PCI_REQ64_EN                (1 << 6)
-#  define CIA_CTRL_PCI_ACK64_EN                (1 << 7)
-#  define CIA_CTRL_ADDR_PE_EN          (1 << 8)
-#  define CIA_CTRL_PERR_EN             (1 << 9)
-#  define CIA_CTRL_FILL_ERR_EN         (1 << 10)
-#  define CIA_CTRL_MCHK_ERR_EN         (1 << 11)
-#  define CIA_CTRL_ECC_CHK_EN          (1 << 12)
-#  define CIA_CTRL_ASSERT_IDLE_BC      (1 << 13)
-#  define CIA_CTRL_COM_IDLE_BC         (1 << 14)
-#  define CIA_CTRL_CSR_IOA_BYPASS      (1 << 15)
-#  define CIA_CTRL_IO_FLUSHREQ_EN      (1 << 16)
-#  define CIA_CTRL_CPU_FLUSHREQ_EN     (1 << 17)
-#  define CIA_CTRL_ARB_CPU_EN          (1 << 18)
-#  define CIA_CTRL_EN_ARB_LINK         (1 << 19)
-#  define CIA_CTRL_RD_TYPE_SHIFT       20
-#  define CIA_CTRL_RL_TYPE_SHIFT       24
-#  define CIA_CTRL_RM_TYPE_SHIFT       28
-#  define CIA_CTRL_EN_DMA_RD_PERF      (1 << 31)
-#define CIA_IOC_CIA_CNFG               (IDENT_ADDR + 0x8740000140UL)
-#  define CIA_CNFG_IOA_BWEN            (1 << 0)
-#  define CIA_CNFG_PCI_MWEN            (1 << 4)
-#  define CIA_CNFG_PCI_DWEN            (1 << 5)
-#  define CIA_CNFG_PCI_WLEN            (1 << 8)
-#define CIA_IOC_FLASH_CTRL             (IDENT_ADDR + 0x8740000200UL)
-#define CIA_IOC_HAE_MEM                        (IDENT_ADDR + 0x8740000400UL)
-#define CIA_IOC_HAE_IO                 (IDENT_ADDR + 0x8740000440UL)
-#define CIA_IOC_CFG                    (IDENT_ADDR + 0x8740000480UL)
-#define CIA_IOC_CACK_EN                        (IDENT_ADDR + 0x8740000600UL)
-#  define CIA_CACK_EN_LOCK_EN          (1 << 0)
-#  define CIA_CACK_EN_MB_EN            (1 << 1)
-#  define CIA_CACK_EN_SET_DIRTY_EN     (1 << 2)
-#  define CIA_CACK_EN_BC_VICTIM_EN     (1 << 3)
-
-
-/*
- * 21171-CA Diagnostic Registers
- */
-#define CIA_IOC_CIA_DIAG               (IDENT_ADDR + 0x8740002000UL)
-#define CIA_IOC_DIAG_CHECK             (IDENT_ADDR + 0x8740003000UL)
-
-/*
- * 21171-CA Performance Monitor registers
- */
-#define CIA_IOC_PERF_MONITOR           (IDENT_ADDR + 0x8740004000UL)
-#define CIA_IOC_PERF_CONTROL           (IDENT_ADDR + 0x8740004040UL)
-
-/*
- * 21171-CA Error registers
- */
-#define CIA_IOC_CPU_ERR0               (IDENT_ADDR + 0x8740008000UL)
-#define CIA_IOC_CPU_ERR1               (IDENT_ADDR + 0x8740008040UL)
-#define CIA_IOC_CIA_ERR                        (IDENT_ADDR + 0x8740008200UL)
-#  define CIA_ERR_COR_ERR              (1 << 0)
-#  define CIA_ERR_UN_COR_ERR           (1 << 1)
-#  define CIA_ERR_CPU_PE               (1 << 2)
-#  define CIA_ERR_MEM_NEM              (1 << 3)
-#  define CIA_ERR_PCI_SERR             (1 << 4)
-#  define CIA_ERR_PERR                 (1 << 5)
-#  define CIA_ERR_PCI_ADDR_PE          (1 << 6)
-#  define CIA_ERR_RCVD_MAS_ABT         (1 << 7)
-#  define CIA_ERR_RCVD_TAR_ABT         (1 << 8)
-#  define CIA_ERR_PA_PTE_INV           (1 << 9)
-#  define CIA_ERR_FROM_WRT_ERR         (1 << 10)
-#  define CIA_ERR_IOA_TIMEOUT          (1 << 11)
-#  define CIA_ERR_LOST_CORR_ERR                (1 << 16)
-#  define CIA_ERR_LOST_UN_CORR_ERR     (1 << 17)
-#  define CIA_ERR_LOST_CPU_PE          (1 << 18)
-#  define CIA_ERR_LOST_MEM_NEM         (1 << 19)
-#  define CIA_ERR_LOST_PERR            (1 << 21)
-#  define CIA_ERR_LOST_PCI_ADDR_PE     (1 << 22)
-#  define CIA_ERR_LOST_RCVD_MAS_ABT    (1 << 23)
-#  define CIA_ERR_LOST_RCVD_TAR_ABT    (1 << 24)
-#  define CIA_ERR_LOST_PA_PTE_INV      (1 << 25)
-#  define CIA_ERR_LOST_FROM_WRT_ERR    (1 << 26)
-#  define CIA_ERR_LOST_IOA_TIMEOUT     (1 << 27)
-#  define CIA_ERR_VALID                        (1 << 31)
-#define CIA_IOC_CIA_STAT               (IDENT_ADDR + 0x8740008240UL)
-#define CIA_IOC_ERR_MASK               (IDENT_ADDR + 0x8740008280UL)
-#define CIA_IOC_CIA_SYN                        (IDENT_ADDR + 0x8740008300UL)
-#define CIA_IOC_MEM_ERR0               (IDENT_ADDR + 0x8740008400UL)
-#define CIA_IOC_MEM_ERR1               (IDENT_ADDR + 0x8740008440UL)
-#define CIA_IOC_PCI_ERR0               (IDENT_ADDR + 0x8740008800UL)
-#define CIA_IOC_PCI_ERR1               (IDENT_ADDR + 0x8740008840UL)
-#define CIA_IOC_PCI_ERR3               (IDENT_ADDR + 0x8740008880UL)
-
-/*
- * 21171-CA System configuration registers
- */
-#define CIA_IOC_MCR                    (IDENT_ADDR + 0x8750000000UL)
-#define CIA_IOC_MBA0                   (IDENT_ADDR + 0x8750000600UL)
-#define CIA_IOC_MBA2                   (IDENT_ADDR + 0x8750000680UL)
-#define CIA_IOC_MBA4                   (IDENT_ADDR + 0x8750000700UL)
-#define CIA_IOC_MBA6                   (IDENT_ADDR + 0x8750000780UL)
-#define CIA_IOC_MBA8                   (IDENT_ADDR + 0x8750000800UL)
-#define CIA_IOC_MBAA                   (IDENT_ADDR + 0x8750000880UL)
-#define CIA_IOC_MBAC                   (IDENT_ADDR + 0x8750000900UL)
-#define CIA_IOC_MBAE                   (IDENT_ADDR + 0x8750000980UL)
-#define CIA_IOC_TMG0                   (IDENT_ADDR + 0x8750000B00UL)
-#define CIA_IOC_TMG1                   (IDENT_ADDR + 0x8750000B40UL)
-#define CIA_IOC_TMG2                   (IDENT_ADDR + 0x8750000B80UL)
-
-/*
- * 2117A-CA PCI Address and Scatter-Gather Registers.
- */
-#define CIA_IOC_PCI_TBIA               (IDENT_ADDR + 0x8760000100UL)
-
-#define CIA_IOC_PCI_W0_BASE            (IDENT_ADDR + 0x8760000400UL)
-#define CIA_IOC_PCI_W0_MASK            (IDENT_ADDR + 0x8760000440UL)
-#define CIA_IOC_PCI_T0_BASE            (IDENT_ADDR + 0x8760000480UL)
-
-#define CIA_IOC_PCI_W1_BASE            (IDENT_ADDR + 0x8760000500UL)
-#define CIA_IOC_PCI_W1_MASK            (IDENT_ADDR + 0x8760000540UL)
-#define CIA_IOC_PCI_T1_BASE            (IDENT_ADDR + 0x8760000580UL)
-
-#define CIA_IOC_PCI_W2_BASE            (IDENT_ADDR + 0x8760000600UL)
-#define CIA_IOC_PCI_W2_MASK            (IDENT_ADDR + 0x8760000640UL)
-#define CIA_IOC_PCI_T2_BASE            (IDENT_ADDR + 0x8760000680UL)
-
-#define CIA_IOC_PCI_W3_BASE            (IDENT_ADDR + 0x8760000700UL)
-#define CIA_IOC_PCI_W3_MASK            (IDENT_ADDR + 0x8760000740UL)
-#define CIA_IOC_PCI_T3_BASE            (IDENT_ADDR + 0x8760000780UL)
-
-#define CIA_IOC_PCI_Wn_BASE(N) (IDENT_ADDR + 0x8760000400UL + (N)*0x100) 
-#define CIA_IOC_PCI_Wn_MASK(N) (IDENT_ADDR + 0x8760000440UL + (N)*0x100) 
-#define CIA_IOC_PCI_Tn_BASE(N) (IDENT_ADDR + 0x8760000480UL + (N)*0x100) 
-
-#define CIA_IOC_PCI_W_DAC              (IDENT_ADDR + 0x87600007C0UL)
-
-/*
- * 2117A-CA Address Translation Registers.
- */
-
-/* 8 tag registers, the first 4 of which are lockable.  */
-#define CIA_IOC_TB_TAGn(n) \
-       (IDENT_ADDR + 0x8760000800UL + (n)*0x40)
-
-/* 4 page registers per tag register.  */
-#define CIA_IOC_TBn_PAGEm(n,m) \
-       (IDENT_ADDR + 0x8760001000UL + (n)*0x100 + (m)*0x40)
-
-/*
- * Memory spaces:
- */
-#define CIA_IACK_SC                    (IDENT_ADDR + 0x8720000000UL)
-#define CIA_CONF                       (IDENT_ADDR + 0x8700000000UL)
-#define CIA_IO                         (IDENT_ADDR + 0x8580000000UL)
-#define CIA_SPARSE_MEM                 (IDENT_ADDR + 0x8000000000UL)
-#define CIA_SPARSE_MEM_R2              (IDENT_ADDR + 0x8400000000UL)
-#define CIA_SPARSE_MEM_R3              (IDENT_ADDR + 0x8500000000UL)
-#define CIA_DENSE_MEM                  (IDENT_ADDR + 0x8600000000UL)
-#define CIA_BW_MEM                     (IDENT_ADDR + 0x8800000000UL)
-#define CIA_BW_IO                      (IDENT_ADDR + 0x8900000000UL)
-#define CIA_BW_CFG_0                   (IDENT_ADDR + 0x8a00000000UL)
-#define CIA_BW_CFG_1                   (IDENT_ADDR + 0x8b00000000UL)
-
-/*
- * ALCOR's GRU ASIC registers
- */
-#define GRU_INT_REQ                    (IDENT_ADDR + 0x8780000000UL)
-#define GRU_INT_MASK                   (IDENT_ADDR + 0x8780000040UL)
-#define GRU_INT_EDGE                   (IDENT_ADDR + 0x8780000080UL)
-#define GRU_INT_HILO                   (IDENT_ADDR + 0x87800000C0UL)
-#define GRU_INT_CLEAR                  (IDENT_ADDR + 0x8780000100UL)
-
-#define GRU_CACHE_CNFG                 (IDENT_ADDR + 0x8780000200UL)
-#define GRU_SCR                                (IDENT_ADDR + 0x8780000300UL)
-#define GRU_LED                                (IDENT_ADDR + 0x8780000800UL)
-#define GRU_RESET                      (IDENT_ADDR + 0x8780000900UL)
-
-#define ALCOR_GRU_INT_REQ_BITS         0x800fffffUL
-#define XLT_GRU_INT_REQ_BITS           0x80003fffUL
-#define GRU_INT_REQ_BITS               (alpha_mv.sys.cia.gru_int_req_bits+0)
-
-/*
- * PYXIS interrupt control registers
- */
-#define PYXIS_INT_REQ                  (IDENT_ADDR + 0x87A0000000UL)
-#define PYXIS_INT_MASK                 (IDENT_ADDR + 0x87A0000040UL)
-#define PYXIS_INT_HILO                 (IDENT_ADDR + 0x87A00000C0UL)
-#define PYXIS_INT_ROUTE                        (IDENT_ADDR + 0x87A0000140UL)
-#define PYXIS_GPO                      (IDENT_ADDR + 0x87A0000180UL)
-#define PYXIS_INT_CNFG                 (IDENT_ADDR + 0x87A00001C0UL)
-#define PYXIS_RT_COUNT                 (IDENT_ADDR + 0x87A0000200UL)
-#define PYXIS_INT_TIME                 (IDENT_ADDR + 0x87A0000240UL)
-#define PYXIS_IIC_CTRL                 (IDENT_ADDR + 0x87A00002C0UL)
-#define PYXIS_RESET                    (IDENT_ADDR + 0x8780000900UL)
-
-/* Offset between ram physical addresses and pci64 DAC bus addresses.  */
-#define PYXIS_DAC_OFFSET               (1UL << 40)
-
-/*
- * Data structure for handling CIA machine checks.
- */
-
-/* System-specific info.  */
-struct el_CIA_sysdata_mcheck {
-       unsigned long   cpu_err0;
-       unsigned long   cpu_err1;
-       unsigned long   cia_err;
-       unsigned long   cia_stat;
-       unsigned long   err_mask;
-       unsigned long   cia_syn;
-       unsigned long   mem_err0;
-       unsigned long   mem_err1;
-       unsigned long   pci_err0;
-       unsigned long   pci_err1;
-       unsigned long   pci_err2;
-};
-
-
-#ifdef __KERNEL__
-
-#ifndef __EXTERN_INLINE
-/* Do not touch, this should *NOT* be static inline */
-#define __EXTERN_INLINE extern inline
-#define __IO_EXTERN_INLINE
-#endif
-
-/*
- * I/O functions:
- *
- * CIA (the 2117x PCI/memory support chipset for the EV5 (21164)
- * series of processors uses a sparse address mapping scheme to
- * get at PCI memory and I/O.
- */
-
-/*
- * Memory functions.  64-bit and 32-bit accesses are done through
- * dense memory space, everything else through sparse space.
- *
- * For reading and writing 8 and 16 bit quantities we need to
- * go through one of the three sparse address mapping regions
- * and use the HAE_MEM CSR to provide some bits of the address.
- * The following few routines use only sparse address region 1
- * which gives 1Gbyte of accessible space which relates exactly
- * to the amount of PCI memory mapping *into* system address space.
- * See p 6-17 of the specification but it looks something like this:
- *
- * 21164 Address:
- *
- *          3         2         1
- * 9876543210987654321098765432109876543210
- * 1ZZZZ0.PCI.QW.Address............BBLL
- *
- * ZZ = SBZ
- * BB = Byte offset
- * LL = Transfer length
- *
- * PCI Address:
- *
- * 3         2         1
- * 10987654321098765432109876543210
- * HHH....PCI.QW.Address........ 00
- *
- * HHH = 31:29 HAE_MEM CSR
- *
- */
-
-#define vip    volatile int __force *
-#define vuip   volatile unsigned int __force *
-#define vulp   volatile unsigned long __force *
-
-__EXTERN_INLINE unsigned int cia_ioread8(void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       unsigned long result, base_and_type;
-
-       if (addr >= CIA_DENSE_MEM)
-               base_and_type = CIA_SPARSE_MEM + 0x00;
-       else
-               base_and_type = CIA_IO + 0x00;
-
-       /* We can use CIA_MEM_R1_MASK for io ports too, since it is large
-          enough to cover all io ports, and smaller than CIA_IO.  */
-       addr &= CIA_MEM_R1_MASK;
-       result = *(vip) ((addr << 5) + base_and_type);
-       return __kernel_extbl(result, addr & 3);
-}
-
-__EXTERN_INLINE void cia_iowrite8(u8 b, void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       unsigned long w, base_and_type;
-
-       if (addr >= CIA_DENSE_MEM)
-               base_and_type = CIA_SPARSE_MEM + 0x00;
-       else
-               base_and_type = CIA_IO + 0x00;
-
-       addr &= CIA_MEM_R1_MASK;
-       w = __kernel_insbl(b, addr & 3);
-       *(vuip) ((addr << 5) + base_and_type) = w;
-}
-
-__EXTERN_INLINE unsigned int cia_ioread16(void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       unsigned long result, base_and_type;
-
-       if (addr >= CIA_DENSE_MEM)
-               base_and_type = CIA_SPARSE_MEM + 0x08;
-       else
-               base_and_type = CIA_IO + 0x08;
-
-       addr &= CIA_MEM_R1_MASK;
-       result = *(vip) ((addr << 5) + base_and_type);
-       return __kernel_extwl(result, addr & 3);
-}
-
-__EXTERN_INLINE void cia_iowrite16(u16 b, void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       unsigned long w, base_and_type;
-
-       if (addr >= CIA_DENSE_MEM)
-               base_and_type = CIA_SPARSE_MEM + 0x08;
-       else
-               base_and_type = CIA_IO + 0x08;
-
-       addr &= CIA_MEM_R1_MASK;
-       w = __kernel_inswl(b, addr & 3);
-       *(vuip) ((addr << 5) + base_and_type) = w;
-}
-
-__EXTERN_INLINE unsigned int cia_ioread32(void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       if (addr < CIA_DENSE_MEM)
-               addr = ((addr - CIA_IO) << 5) + CIA_IO + 0x18;
-       return *(vuip)addr;
-}
-
-__EXTERN_INLINE void cia_iowrite32(u32 b, void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       if (addr < CIA_DENSE_MEM)
-               addr = ((addr - CIA_IO) << 5) + CIA_IO + 0x18;
-       *(vuip)addr = b;
-}
-
-__EXTERN_INLINE void __iomem *cia_ioportmap(unsigned long addr)
-{
-       return (void __iomem *)(addr + CIA_IO);
-}
-
-__EXTERN_INLINE void __iomem *cia_ioremap(unsigned long addr,
-                                         unsigned long size)
-{
-       return (void __iomem *)(addr + CIA_DENSE_MEM);
-}
-
-__EXTERN_INLINE int cia_is_ioaddr(unsigned long addr)
-{
-       return addr >= IDENT_ADDR + 0x8000000000UL;
-}
-
-__EXTERN_INLINE int cia_is_mmio(const volatile void __iomem *addr)
-{
-       return (unsigned long)addr >= CIA_DENSE_MEM;
-}
-
-__EXTERN_INLINE void __iomem *cia_bwx_ioportmap(unsigned long addr)
-{
-       return (void __iomem *)(addr + CIA_BW_IO);
-}
-
-__EXTERN_INLINE void __iomem *cia_bwx_ioremap(unsigned long addr,
-                                             unsigned long size)
-{
-       return (void __iomem *)(addr + CIA_BW_MEM);
-}
-
-__EXTERN_INLINE int cia_bwx_is_ioaddr(unsigned long addr)
-{
-       return addr >= IDENT_ADDR + 0x8000000000UL;
-}
-
-__EXTERN_INLINE int cia_bwx_is_mmio(const volatile void __iomem *addr)
-{
-       return (unsigned long)addr < CIA_BW_IO;
-}
-
-#undef vip
-#undef vuip
-#undef vulp
-
-#undef __IO_PREFIX
-#define __IO_PREFIX            cia
-#define cia_trivial_rw_bw      2
-#define cia_trivial_rw_lq      1
-#define cia_trivial_io_bw      0
-#define cia_trivial_io_lq      0
-#define cia_trivial_iounmap    1
-#include <asm/io_trivial.h>
-
-#undef __IO_PREFIX
-#define __IO_PREFIX            cia_bwx
-#define cia_bwx_trivial_rw_bw  1
-#define cia_bwx_trivial_rw_lq  1
-#define cia_bwx_trivial_io_bw  1
-#define cia_bwx_trivial_io_lq  1
-#define cia_bwx_trivial_iounmap        1
-#include <asm/io_trivial.h>
-
-#undef __IO_PREFIX
-#ifdef CONFIG_ALPHA_PYXIS
-#define __IO_PREFIX            cia_bwx
-#else
-#define __IO_PREFIX            cia
-#endif
-
-#ifdef __IO_EXTERN_INLINE
-#undef __EXTERN_INLINE
-#undef __IO_EXTERN_INLINE
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_CIA__H__ */
diff --git a/include/asm-alpha/core_irongate.h b/include/asm-alpha/core_irongate.h
deleted file mode 100644 (file)
index 24b2db5..0000000
+++ /dev/null
@@ -1,232 +0,0 @@
-#ifndef __ALPHA_IRONGATE__H__
-#define __ALPHA_IRONGATE__H__
-
-#include <linux/types.h>
-#include <asm/compiler.h>
-
-/*
- * IRONGATE is the internal name for the AMD-751 K7 core logic chipset
- * which provides memory controller and PCI access for NAUTILUS-based
- * EV6 (21264) systems.
- *
- * This file is based on:
- *
- * IronGate management library, (c) 1999 Alpha Processor, Inc.
- * Copyright (C) 1999 Alpha Processor, Inc.,
- *     (David Daniel, Stig Telfer, Soohoon Lee)
- */
-
-/*
- * The 21264 supports, and internally recognizes, a 44-bit physical
- * address space that is divided equally between memory address space
- * and I/O address space. Memory address space resides in the lower
- * half of the physical address space (PA[43]=0) and I/O address space
- * resides in the upper half of the physical address space (PA[43]=1).
- */
-
-/*
- * Irongate CSR map.  Some of the CSRs are 8 or 16 bits, but all access
- * through the routines given is 32-bit.
- *
- * The first 0x40 bytes are standard as per the PCI spec.
- */
-
-typedef volatile __u32 igcsr32;
-
-typedef struct {
-       igcsr32 dev_vendor;             /* 0x00 - device ID, vendor ID */
-       igcsr32 stat_cmd;               /* 0x04 - status, command */
-       igcsr32 class;                  /* 0x08 - class code, rev ID */
-       igcsr32 latency;                /* 0x0C - header type, PCI latency */
-       igcsr32 bar0;                   /* 0x10 - BAR0 - AGP */
-       igcsr32 bar1;                   /* 0x14 - BAR1 - GART */
-       igcsr32 bar2;                   /* 0x18 - Power Management reg block */
-
-       igcsr32 rsrvd0[6];              /* 0x1C-0x33 reserved */
-
-       igcsr32 capptr;                 /* 0x34 - Capabilities pointer */
-
-       igcsr32 rsrvd1[2];              /* 0x38-0x3F reserved */
-
-       igcsr32 bacsr10;                /* 0x40 - base address chip selects */
-       igcsr32 bacsr32;                /* 0x44 - base address chip selects */
-       igcsr32 bacsr54_eccms761;       /* 0x48 - 751: base addr. chip selects
-                                                 761: ECC, mode/status */
-
-       igcsr32 rsrvd2[1];              /* 0x4C-0x4F reserved */
-
-       igcsr32 drammap;                /* 0x50 - address mapping control */
-       igcsr32 dramtm;                 /* 0x54 - timing, driver strength */
-       igcsr32 dramms;                 /* 0x58 - DRAM mode/status */
-
-       igcsr32 rsrvd3[1];              /* 0x5C-0x5F reserved */
-
-       igcsr32 biu0;                   /* 0x60 - bus interface unit */
-       igcsr32 biusip;                 /* 0x64 - Serial initialisation pkt */
-
-       igcsr32 rsrvd4[2];              /* 0x68-0x6F reserved */
-
-       igcsr32 mro;                    /* 0x70 - memory request optimiser */
-
-       igcsr32 rsrvd5[3];              /* 0x74-0x7F reserved */
-
-       igcsr32 whami;                  /* 0x80 - who am I */
-       igcsr32 pciarb;                 /* 0x84 - PCI arbitration control */
-       igcsr32 pcicfg;                 /* 0x88 - PCI config status */
-
-       igcsr32 rsrvd6[4];              /* 0x8C-0x9B reserved */
-
-       igcsr32 pci_mem;                /* 0x9C - PCI top of memory,
-                                                 761 only */
-
-       /* AGP (bus 1) control registers */
-       igcsr32 agpcap;                 /* 0xA0 - AGP Capability Identifier */
-       igcsr32 agpstat;                /* 0xA4 - AGP status register */
-       igcsr32 agpcmd;                 /* 0xA8 - AGP control register */
-       igcsr32 agpva;                  /* 0xAC - AGP Virtual Address Space */
-       igcsr32 agpmode;                /* 0xB0 - AGP/GART mode control */
-} Irongate0;
-
-
-typedef struct {
-
-       igcsr32 dev_vendor;             /* 0x00 - Device and Vendor IDs */
-       igcsr32 stat_cmd;               /* 0x04 - Status and Command regs */
-       igcsr32 class;                  /* 0x08 - subclass, baseclass etc */
-       igcsr32 htype;                  /* 0x0C - header type (at 0x0E) */
-       igcsr32 rsrvd0[2];              /* 0x10-0x17 reserved */
-       igcsr32 busnos;                 /* 0x18 - Primary, secondary bus nos */
-       igcsr32 io_baselim_regs;        /* 0x1C - IO base, IO lim, AGP status */
-       igcsr32 mem_baselim;            /* 0x20 - memory base, memory lim */
-       igcsr32 pfmem_baselim;          /* 0x24 - prefetchable base, lim */
-       igcsr32 rsrvd1[2];              /* 0x28-0x2F reserved */
-       igcsr32 io_baselim;             /* 0x30 - IO base, IO limit */
-       igcsr32 rsrvd2[2];              /* 0x34-0x3B - reserved */
-       igcsr32 interrupt;              /* 0x3C - interrupt, PCI bridge ctrl */
-
-} Irongate1;
-
-extern igcsr32 *IronECC;
-
-/*
- * Memory spaces:
- */
-
-/* Irongate is consistent with a subset of the Tsunami memory map */
-#ifdef USE_48_BIT_KSEG
-#define IRONGATE_BIAS 0x80000000000UL
-#else
-#define IRONGATE_BIAS 0x10000000000UL
-#endif
-
-
-#define IRONGATE_MEM           (IDENT_ADDR | IRONGATE_BIAS | 0x000000000UL)
-#define IRONGATE_IACK_SC       (IDENT_ADDR | IRONGATE_BIAS | 0x1F8000000UL)
-#define IRONGATE_IO            (IDENT_ADDR | IRONGATE_BIAS | 0x1FC000000UL)
-#define IRONGATE_CONF          (IDENT_ADDR | IRONGATE_BIAS | 0x1FE000000UL)
-
-/*
- * PCI Configuration space accesses are formed like so:
- *
- * 0x1FE << 24 |  : 2 2 2 2 1 1 1 1 : 1 1 1 1 1 1 0 0 : 0 0 0 0 0 0 0 0 :
- *                : 3 2 1 0 9 8 7 6 : 5 4 3 2 1 0 9 8 : 7 6 5 4 3 2 1 0 :
- *                  ---bus numer---   -device-- -fun-   ---register----
- */
-
-#define IGCSR(dev,fun,reg)     ( IRONGATE_CONF | \
-                               ((dev)<<11) | \
-                               ((fun)<<8) | \
-                               (reg) )
-
-#define IRONGATE0              ((Irongate0 *) IGCSR(0, 0, 0))
-#define IRONGATE1              ((Irongate1 *) IGCSR(1, 0, 0))
-
-/*
- * Data structure for handling IRONGATE machine checks:
- * This is the standard OSF logout frame
- */
-
-#define SCB_Q_SYSERR   0x620                   /* OSF definitions */
-#define SCB_Q_PROCERR  0x630
-#define SCB_Q_SYSMCHK  0x660
-#define SCB_Q_PROCMCHK 0x670
-
-struct el_IRONGATE_sysdata_mcheck {
-       __u32 FrameSize;                 /* Bytes, including this field */
-       __u32 FrameFlags;                /* <31> = Retry, <30> = Second Error */
-       __u32 CpuOffset;                 /* Offset to CPU-specific into */
-       __u32 SystemOffset;              /* Offset to system-specific info */
-       __u32 MCHK_Code;
-       __u32 MCHK_Frame_Rev;
-       __u64 I_STAT;
-       __u64 DC_STAT;
-       __u64 C_ADDR;
-       __u64 DC1_SYNDROME;
-       __u64 DC0_SYNDROME;
-       __u64 C_STAT;
-       __u64 C_STS;
-       __u64 RESERVED0;
-       __u64 EXC_ADDR;
-       __u64 IER_CM;
-       __u64 ISUM;
-       __u64 MM_STAT;
-       __u64 PAL_BASE;
-       __u64 I_CTL;
-       __u64 PCTX;
-};
-
-
-#ifdef __KERNEL__
-
-#ifndef __EXTERN_INLINE
-#define __EXTERN_INLINE extern inline
-#define __IO_EXTERN_INLINE
-#endif
-
-/*
- * I/O functions:
- *
- * IRONGATE (AMD-751) PCI/memory support chip for the EV6 (21264) and
- * K7 can only use linear accesses to get at PCI memory and I/O spaces.
- */
-
-/*
- * Memory functions.  All accesses are done through linear space.
- */
-
-__EXTERN_INLINE void __iomem *irongate_ioportmap(unsigned long addr)
-{
-       return (void __iomem *)(addr + IRONGATE_IO);
-}
-
-extern void __iomem *irongate_ioremap(unsigned long addr, unsigned long size);
-extern void irongate_iounmap(volatile void __iomem *addr);
-
-__EXTERN_INLINE int irongate_is_ioaddr(unsigned long addr)
-{
-       return addr >= IRONGATE_MEM;
-}
-
-__EXTERN_INLINE int irongate_is_mmio(const volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long)xaddr;
-       return addr < IRONGATE_IO || addr >= IRONGATE_CONF;
-}
-
-#undef __IO_PREFIX
-#define __IO_PREFIX                    irongate
-#define irongate_trivial_rw_bw         1
-#define irongate_trivial_rw_lq         1
-#define irongate_trivial_io_bw         1
-#define irongate_trivial_io_lq         1
-#define irongate_trivial_iounmap       0
-#include <asm/io_trivial.h>
-
-#ifdef __IO_EXTERN_INLINE
-#undef __EXTERN_INLINE
-#undef __IO_EXTERN_INLINE
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_IRONGATE__H__ */
diff --git a/include/asm-alpha/core_lca.h b/include/asm-alpha/core_lca.h
deleted file mode 100644 (file)
index f7cb4b4..0000000
+++ /dev/null
@@ -1,361 +0,0 @@
-#ifndef __ALPHA_LCA__H__
-#define __ALPHA_LCA__H__
-
-#include <asm/system.h>
-#include <asm/compiler.h>
-
-/*
- * Low Cost Alpha (LCA) definitions (these apply to 21066 and 21068,
- * for example).
- *
- * This file is based on:
- *
- *     DECchip 21066 and DECchip 21068 Alpha AXP Microprocessors
- *     Hardware Reference Manual; Digital Equipment Corp.; May 1994;
- *     Maynard, MA; Order Number: EC-N2681-71.
- */
-
-/*
- * NOTE: The LCA uses a Host Address Extension (HAE) register to access
- *      PCI addresses that are beyond the first 27 bits of address
- *      space.  Updating the HAE requires an external cycle (and
- *      a memory barrier), which tends to be slow.  Instead of updating
- *      it on each sparse memory access, we keep the current HAE value
- *      cached in variable cache_hae.  Only if the cached HAE differs
- *      from the desired HAE value do we actually updated HAE register.
- *      The HAE register is preserved by the interrupt handler entry/exit
- *      code, so this scheme works even in the presence of interrupts.
- *
- * Dense memory space doesn't require the HAE, but is restricted to
- * aligned 32 and 64 bit accesses.  Special Cycle and Interrupt
- * Acknowledge cycles may also require the use of the HAE.  The LCA
- * limits I/O address space to the bottom 24 bits of address space,
- * but this easily covers the 16 bit ISA I/O address space.
- */
-
-/*
- * NOTE 2! The memory operations do not set any memory barriers, as
- * it's not needed for cases like a frame buffer that is essentially
- * memory-like.  You need to do them by hand if the operations depend
- * on ordering.
- *
- * Similarly, the port I/O operations do a "mb" only after a write
- * operation: if an mb is needed before (as in the case of doing
- * memory mapped I/O first, and then a port I/O operation to the same
- * device), it needs to be done by hand.
- *
- * After the above has bitten me 100 times, I'll give up and just do
- * the mb all the time, but right now I'm hoping this will work out.
- * Avoiding mb's may potentially be a noticeable speed improvement,
- * but I can't honestly say I've tested it.
- *
- * Handling interrupts that need to do mb's to synchronize to
- * non-interrupts is another fun race area.  Don't do it (because if
- * you do, I'll have to do *everything* with interrupts disabled,
- * ugh).
- */
-
-/*
- * Memory Controller registers:
- */
-#define LCA_MEM_BCR0           (IDENT_ADDR + 0x120000000UL)
-#define LCA_MEM_BCR1           (IDENT_ADDR + 0x120000008UL)
-#define LCA_MEM_BCR2           (IDENT_ADDR + 0x120000010UL)
-#define LCA_MEM_BCR3           (IDENT_ADDR + 0x120000018UL)
-#define LCA_MEM_BMR0           (IDENT_ADDR + 0x120000020UL)
-#define LCA_MEM_BMR1           (IDENT_ADDR + 0x120000028UL)
-#define LCA_MEM_BMR2           (IDENT_ADDR + 0x120000030UL)
-#define LCA_MEM_BMR3           (IDENT_ADDR + 0x120000038UL)
-#define LCA_MEM_BTR0           (IDENT_ADDR + 0x120000040UL)
-#define LCA_MEM_BTR1           (IDENT_ADDR + 0x120000048UL)
-#define LCA_MEM_BTR2           (IDENT_ADDR + 0x120000050UL)
-#define LCA_MEM_BTR3           (IDENT_ADDR + 0x120000058UL)
-#define LCA_MEM_GTR            (IDENT_ADDR + 0x120000060UL)
-#define LCA_MEM_ESR            (IDENT_ADDR + 0x120000068UL)
-#define LCA_MEM_EAR            (IDENT_ADDR + 0x120000070UL)
-#define LCA_MEM_CAR            (IDENT_ADDR + 0x120000078UL)
-#define LCA_MEM_VGR            (IDENT_ADDR + 0x120000080UL)
-#define LCA_MEM_PLM            (IDENT_ADDR + 0x120000088UL)
-#define LCA_MEM_FOR            (IDENT_ADDR + 0x120000090UL)
-
-/*
- * I/O Controller registers:
- */
-#define LCA_IOC_HAE            (IDENT_ADDR + 0x180000000UL)
-#define LCA_IOC_CONF           (IDENT_ADDR + 0x180000020UL)
-#define LCA_IOC_STAT0          (IDENT_ADDR + 0x180000040UL)
-#define LCA_IOC_STAT1          (IDENT_ADDR + 0x180000060UL)
-#define LCA_IOC_TBIA           (IDENT_ADDR + 0x180000080UL)
-#define LCA_IOC_TB_ENA         (IDENT_ADDR + 0x1800000a0UL)
-#define LCA_IOC_SFT_RST                (IDENT_ADDR + 0x1800000c0UL)
-#define LCA_IOC_PAR_DIS                (IDENT_ADDR + 0x1800000e0UL)
-#define LCA_IOC_W_BASE0                (IDENT_ADDR + 0x180000100UL)
-#define LCA_IOC_W_BASE1                (IDENT_ADDR + 0x180000120UL)
-#define LCA_IOC_W_MASK0                (IDENT_ADDR + 0x180000140UL)
-#define LCA_IOC_W_MASK1                (IDENT_ADDR + 0x180000160UL)
-#define LCA_IOC_T_BASE0                (IDENT_ADDR + 0x180000180UL)
-#define LCA_IOC_T_BASE1                (IDENT_ADDR + 0x1800001a0UL)
-#define LCA_IOC_TB_TAG0                (IDENT_ADDR + 0x188000000UL)
-#define LCA_IOC_TB_TAG1                (IDENT_ADDR + 0x188000020UL)
-#define LCA_IOC_TB_TAG2                (IDENT_ADDR + 0x188000040UL)
-#define LCA_IOC_TB_TAG3                (IDENT_ADDR + 0x188000060UL)
-#define LCA_IOC_TB_TAG4                (IDENT_ADDR + 0x188000070UL)
-#define LCA_IOC_TB_TAG5                (IDENT_ADDR + 0x1880000a0UL)
-#define LCA_IOC_TB_TAG6                (IDENT_ADDR + 0x1880000c0UL)
-#define LCA_IOC_TB_TAG7                (IDENT_ADDR + 0x1880000e0UL)
-
-/*
- * Memory spaces:
- */
-#define LCA_IACK_SC            (IDENT_ADDR + 0x1a0000000UL)
-#define LCA_CONF               (IDENT_ADDR + 0x1e0000000UL)
-#define LCA_IO                 (IDENT_ADDR + 0x1c0000000UL)
-#define LCA_SPARSE_MEM         (IDENT_ADDR + 0x200000000UL)
-#define LCA_DENSE_MEM          (IDENT_ADDR + 0x300000000UL)
-
-/*
- * Bit definitions for I/O Controller status register 0:
- */
-#define LCA_IOC_STAT0_CMD              0xf
-#define LCA_IOC_STAT0_ERR              (1<<4)
-#define LCA_IOC_STAT0_LOST             (1<<5)
-#define LCA_IOC_STAT0_THIT             (1<<6)
-#define LCA_IOC_STAT0_TREF             (1<<7)
-#define LCA_IOC_STAT0_CODE_SHIFT       8
-#define LCA_IOC_STAT0_CODE_MASK                0x7
-#define LCA_IOC_STAT0_P_NBR_SHIFT      13
-#define LCA_IOC_STAT0_P_NBR_MASK       0x7ffff
-
-#define LCA_HAE_ADDRESS                LCA_IOC_HAE
-
-/* LCA PMR Power Management register defines */
-#define LCA_PMR_ADDR   (IDENT_ADDR + 0x120000098UL)
-#define LCA_PMR_PDIV    0x7                     /* Primary clock divisor */
-#define LCA_PMR_ODIV    0x38                    /* Override clock divisor */
-#define LCA_PMR_INTO    0x40                    /* Interrupt override */
-#define LCA_PMR_DMAO    0x80                    /* DMA override */
-#define LCA_PMR_OCCEB   0xffff0000L             /* Override cycle counter - even bits */
-#define LCA_PMR_OCCOB   0xffff000000000000L     /* Override cycle counter - even bits */
-#define LCA_PMR_PRIMARY_MASK    0xfffffffffffffff8L
-
-/* LCA PMR Macros */
-
-#define LCA_READ_PMR        (*(volatile unsigned long *)LCA_PMR_ADDR)
-#define LCA_WRITE_PMR(d)    (*((volatile unsigned long *)LCA_PMR_ADDR) = (d))
-
-#define LCA_GET_PRIMARY(r)  ((r) & LCA_PMR_PDIV)
-#define LCA_GET_OVERRIDE(r) (((r) >> 3) & LCA_PMR_PDIV)
-#define LCA_SET_PRIMARY_CLOCK(r, c) ((r) = (((r) & LCA_PMR_PRIMARY_MASK)|(c)))
-
-/* LCA PMR Divisor values */
-#define LCA_PMR_DIV_1   0x0
-#define LCA_PMR_DIV_1_5 0x1
-#define LCA_PMR_DIV_2   0x2
-#define LCA_PMR_DIV_4   0x3
-#define LCA_PMR_DIV_8   0x4
-#define LCA_PMR_DIV_16  0x5
-#define LCA_PMR_DIV_MIN DIV_1
-#define LCA_PMR_DIV_MAX DIV_16
-
-
-/*
- * Data structure for handling LCA machine checks.  Correctable errors
- * result in a short logout frame, uncorrectable ones in a long one.
- */
-struct el_lca_mcheck_short {
-       struct el_common        h;              /* common logout header */
-       unsigned long           esr;            /* error-status register */
-       unsigned long           ear;            /* error-address register */
-       unsigned long           dc_stat;        /* dcache status register */
-       unsigned long           ioc_stat0;      /* I/O controller status register 0 */
-       unsigned long           ioc_stat1;      /* I/O controller status register 1 */
-};
-
-struct el_lca_mcheck_long {
-       struct el_common        h;              /* common logout header */
-       unsigned long           pt[31];         /* PAL temps */
-       unsigned long           exc_addr;       /* exception address */
-       unsigned long           pad1[3];
-       unsigned long           pal_base;       /* PALcode base address */
-       unsigned long           hier;           /* hw interrupt enable */
-       unsigned long           hirr;           /* hw interrupt request */
-       unsigned long           mm_csr;         /* MMU control & status */
-       unsigned long           dc_stat;        /* data cache status */
-       unsigned long           dc_addr;        /* data cache addr register */
-       unsigned long           abox_ctl;       /* address box control register */
-       unsigned long           esr;            /* error status register */
-       unsigned long           ear;            /* error address register */
-       unsigned long           car;            /* cache control register */
-       unsigned long           ioc_stat0;      /* I/O controller status register 0 */
-       unsigned long           ioc_stat1;      /* I/O controller status register 1 */
-       unsigned long           va;             /* virtual address register */
-};
-
-union el_lca {
-       struct el_common *              c;
-       struct el_lca_mcheck_long *     l;
-       struct el_lca_mcheck_short *    s;
-};
-
-#ifdef __KERNEL__
-
-#ifndef __EXTERN_INLINE
-#define __EXTERN_INLINE extern inline
-#define __IO_EXTERN_INLINE
-#endif
-
-/*
- * I/O functions:
- *
- * Unlike Jensen, the Noname machines have no concept of local
- * I/O---everything goes over the PCI bus.
- *
- * There is plenty room for optimization here.  In particular,
- * the Alpha's insb/insw/extb/extw should be useful in moving
- * data to/from the right byte-lanes.
- */
-
-#define vip    volatile int __force *
-#define vuip   volatile unsigned int __force *
-#define vulp   volatile unsigned long __force *
-
-#define LCA_SET_HAE                                            \
-       do {                                                    \
-               if (addr >= (1UL << 24)) {                      \
-                       unsigned long msb = addr & 0xf8000000;  \
-                       addr -= msb;                            \
-                       set_hae(msb);                           \
-               }                                               \
-       } while (0)
-
-
-__EXTERN_INLINE unsigned int lca_ioread8(void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       unsigned long result, base_and_type;
-
-       if (addr >= LCA_DENSE_MEM) {
-               addr -= LCA_DENSE_MEM;
-               LCA_SET_HAE;
-               base_and_type = LCA_SPARSE_MEM + 0x00;
-       } else {
-               addr -= LCA_IO;
-               base_and_type = LCA_IO + 0x00;
-       }
-
-       result = *(vip) ((addr << 5) + base_and_type);
-       return __kernel_extbl(result, addr & 3);
-}
-
-__EXTERN_INLINE void lca_iowrite8(u8 b, void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       unsigned long w, base_and_type;
-
-       if (addr >= LCA_DENSE_MEM) {
-               addr -= LCA_DENSE_MEM;
-               LCA_SET_HAE;
-               base_and_type = LCA_SPARSE_MEM + 0x00;
-       } else {
-               addr -= LCA_IO;
-               base_and_type = LCA_IO + 0x00;
-       }
-
-       w = __kernel_insbl(b, addr & 3);
-       *(vuip) ((addr << 5) + base_and_type) = w;
-}
-
-__EXTERN_INLINE unsigned int lca_ioread16(void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       unsigned long result, base_and_type;
-
-       if (addr >= LCA_DENSE_MEM) {
-               addr -= LCA_DENSE_MEM;
-               LCA_SET_HAE;
-               base_and_type = LCA_SPARSE_MEM + 0x08;
-       } else {
-               addr -= LCA_IO;
-               base_and_type = LCA_IO + 0x08;
-       }
-
-       result = *(vip) ((addr << 5) + base_and_type);
-       return __kernel_extwl(result, addr & 3);
-}
-
-__EXTERN_INLINE void lca_iowrite16(u16 b, void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       unsigned long w, base_and_type;
-
-       if (addr >= LCA_DENSE_MEM) {
-               addr -= LCA_DENSE_MEM;
-               LCA_SET_HAE;
-               base_and_type = LCA_SPARSE_MEM + 0x08;
-       } else {
-               addr -= LCA_IO;
-               base_and_type = LCA_IO + 0x08;
-       }
-
-       w = __kernel_inswl(b, addr & 3);
-       *(vuip) ((addr << 5) + base_and_type) = w;
-}
-
-__EXTERN_INLINE unsigned int lca_ioread32(void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       if (addr < LCA_DENSE_MEM)
-               addr = ((addr - LCA_IO) << 5) + LCA_IO + 0x18;
-       return *(vuip)addr;
-}
-
-__EXTERN_INLINE void lca_iowrite32(u32 b, void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       if (addr < LCA_DENSE_MEM)
-               addr = ((addr - LCA_IO) << 5) + LCA_IO + 0x18;
-       *(vuip)addr = b;
-}
-
-__EXTERN_INLINE void __iomem *lca_ioportmap(unsigned long addr)
-{
-       return (void __iomem *)(addr + LCA_IO);
-}
-
-__EXTERN_INLINE void __iomem *lca_ioremap(unsigned long addr,
-                                         unsigned long size)
-{
-       return (void __iomem *)(addr + LCA_DENSE_MEM);
-}
-
-__EXTERN_INLINE int lca_is_ioaddr(unsigned long addr)
-{
-       return addr >= IDENT_ADDR + 0x120000000UL;
-}
-
-__EXTERN_INLINE int lca_is_mmio(const volatile void __iomem *addr)
-{
-       return (unsigned long)addr >= LCA_DENSE_MEM;
-}
-
-#undef vip
-#undef vuip
-#undef vulp
-
-#undef __IO_PREFIX
-#define __IO_PREFIX            lca
-#define lca_trivial_rw_bw      2
-#define lca_trivial_rw_lq      1
-#define lca_trivial_io_bw      0
-#define lca_trivial_io_lq      0
-#define lca_trivial_iounmap    1
-#include <asm/io_trivial.h>
-
-#ifdef __IO_EXTERN_INLINE
-#undef __EXTERN_INLINE
-#undef __IO_EXTERN_INLINE
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_LCA__H__ */
diff --git a/include/asm-alpha/core_marvel.h b/include/asm-alpha/core_marvel.h
deleted file mode 100644 (file)
index 30d55fe..0000000
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Marvel systems use the IO7 I/O chip provides PCI/PCIX/AGP access
- *
- * This file is based on:
- *
- * Marvel / EV7 System Programmer's Manual
- * Revision 1.00
- * 14 May 2001
- */
-
-#ifndef __ALPHA_MARVEL__H__
-#define __ALPHA_MARVEL__H__
-
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <linux/spinlock.h>
-
-#include <asm/compiler.h>
-
-#define MARVEL_MAX_PIDS                 32 /* as long as we rely on 43-bit superpage */
-#define MARVEL_IRQ_VEC_PE_SHIFT        (10)
-#define MARVEL_IRQ_VEC_IRQ_MASK        ((1 << MARVEL_IRQ_VEC_PE_SHIFT) - 1)
-#define MARVEL_NR_IRQS         \
-       (16 + (MARVEL_MAX_PIDS * (1 << MARVEL_IRQ_VEC_PE_SHIFT)))
-
-/*
- * EV7 RBOX Registers
- */
-typedef struct {
-       volatile unsigned long csr __attribute__((aligned(16)));
-} ev7_csr;
-
-typedef struct {
-       ev7_csr RBOX_CFG;               /* 0x0000 */
-       ev7_csr RBOX_NSVC;
-       ev7_csr RBOX_EWVC;
-       ev7_csr RBOX_WHAMI;
-       ev7_csr RBOX_TCTL;              /* 0x0040 */
-       ev7_csr RBOX_INT;
-       ev7_csr RBOX_IMASK;
-       ev7_csr RBOX_IREQ;
-       ev7_csr RBOX_INTQ;              /* 0x0080 */
-       ev7_csr RBOX_INTA;
-       ev7_csr RBOX_IT;
-       ev7_csr RBOX_SCRATCH1;
-       ev7_csr RBOX_SCRATCH2;          /* 0x00c0 */
-       ev7_csr RBOX_L_ERR;
-} ev7_csrs;
-
-/*
- * EV7 CSR addressing macros
- */
-#define EV7_MASK40(addr)        ((addr) & ((1UL << 41) - 1))
-#define EV7_KERN_ADDR(addr)    ((void *)(IDENT_ADDR | EV7_MASK40(addr)))
-
-#define EV7_PE_MASK            0x1ffUL /* 9 bits ( 256 + mem/io ) */
-#define EV7_IPE(pe)            ((~((long)(pe)) & EV7_PE_MASK) << 35)
-
-#define EV7_CSR_PHYS(pe, off)  (EV7_IPE(pe) | (0x7FFCUL << 20) | (off))
-#define EV7_CSRS_PHYS(pe)      (EV7_CSR_PHYS(pe, 0UL))
-
-#define EV7_CSR_KERN(pe, off)  (EV7_KERN_ADDR(EV7_CSR_PHYS(pe, off)))
-#define EV7_CSRS_KERN(pe)      (EV7_KERN_ADDR(EV7_CSRS_PHYS(pe)))
-
-#define EV7_CSR_OFFSET(name)   ((unsigned long)&((ev7_csrs *)NULL)->name.csr)
-
-/*
- * IO7 registers
- */
-typedef struct {
-       volatile unsigned long csr __attribute__((aligned(64)));
-} io7_csr;
-
-typedef struct {
-       /* I/O Port Control Registers */
-       io7_csr POx_CTRL;               /* 0x0000 */
-       io7_csr POx_CACHE_CTL;
-       io7_csr POx_TIMER;
-       io7_csr POx_IO_ADR_EXT;
-       io7_csr POx_MEM_ADR_EXT;        /* 0x0100 */
-       io7_csr POx_XCAL_CTRL;
-       io7_csr rsvd1[2];       /* ?? spec doesn't show 0x180 */
-       io7_csr POx_DM_SOURCE;          /* 0x0200 */
-       io7_csr POx_DM_DEST;
-       io7_csr POx_DM_SIZE;
-       io7_csr POx_DM_CTRL;
-       io7_csr rsvd2[4];               /* 0x0300 */
-
-       /* AGP Control Registers -- port 3 only */
-       io7_csr AGP_CAP_ID;             /* 0x0400 */
-       io7_csr AGP_STAT;
-       io7_csr AGP_CMD;
-       io7_csr rsvd3;
-
-       /* I/O Port Monitor Registers */
-       io7_csr POx_MONCTL;             /* 0x0500 */
-       io7_csr POx_CTRA;
-       io7_csr POx_CTRB;
-       io7_csr POx_CTR56;
-       io7_csr POx_SCRATCH;            /* 0x0600 */
-       io7_csr POx_XTRA_A;
-       io7_csr POx_XTRA_TS;
-       io7_csr POx_XTRA_Z;
-       io7_csr rsvd4;                  /* 0x0700 */
-       io7_csr POx_THRESHA;
-       io7_csr POx_THRESHB;
-       io7_csr rsvd5[33];
-
-       /* System Address Space Window Control Registers */
-
-       io7_csr POx_WBASE[4];           /* 0x1000 */
-       io7_csr POx_WMASK[4];
-       io7_csr POx_TBASE[4];
-       io7_csr POx_SG_TBIA;
-       io7_csr POx_MSI_WBASE;
-       io7_csr rsvd6[50];
-
-       /* I/O Port Error Registers */
-       io7_csr POx_ERR_SUM;
-       io7_csr POx_FIRST_ERR;
-       io7_csr POx_MSK_HEI;
-       io7_csr POx_TLB_ERR;
-       io7_csr POx_SPL_COMPLT;
-       io7_csr POx_TRANS_SUM;
-       io7_csr POx_FRC_PCI_ERR;
-       io7_csr POx_MULT_ERR;
-       io7_csr rsvd7[8];
-
-       /* I/O Port End of Interrupt Registers */
-       io7_csr EOI_DAT;
-       io7_csr rsvd8[7];
-       io7_csr POx_IACK_SPECIAL;
-       io7_csr rsvd9[103];
-} io7_ioport_csrs;
-
-typedef struct {
-       io7_csr IO_ASIC_REV;            /* 0x30.0000 */
-       io7_csr IO_SYS_REV;
-       io7_csr SER_CHAIN3;
-       io7_csr PO7_RST1;
-       io7_csr PO7_RST2;               /* 0x30.0100 */
-       io7_csr POx_RST[4];
-       io7_csr IO7_DWNH;
-       io7_csr IO7_MAF;
-       io7_csr IO7_MAF_TO;
-       io7_csr IO7_ACC_CLUMP;          /* 0x30.0300 */
-       io7_csr IO7_PMASK;
-       io7_csr IO7_IOMASK;
-       io7_csr IO7_UPH;
-       io7_csr IO7_UPH_TO;             /* 0x30.0400 */
-       io7_csr RBX_IREQ_OFF;
-       io7_csr RBX_INTA_OFF;
-       io7_csr INT_RTY;
-       io7_csr PO7_MONCTL;             /* 0x30.0500 */
-       io7_csr PO7_CTRA;
-       io7_csr PO7_CTRB;
-       io7_csr PO7_CTR56;
-       io7_csr PO7_SCRATCH;            /* 0x30.0600 */
-       io7_csr PO7_XTRA_A;
-       io7_csr PO7_XTRA_TS;
-       io7_csr PO7_XTRA_Z;
-       io7_csr PO7_PMASK;              /* 0x30.0700 */
-       io7_csr PO7_THRESHA;
-       io7_csr PO7_THRESHB;
-       io7_csr rsvd1[97];
-       io7_csr PO7_ERROR_SUM;          /* 0x30.2000 */
-       io7_csr PO7_BHOLE_MASK;
-       io7_csr PO7_HEI_MSK;
-       io7_csr PO7_CRD_MSK;
-       io7_csr PO7_UNCRR_SYM;          /* 0x30.2100 */
-       io7_csr PO7_CRRCT_SYM;
-       io7_csr PO7_ERR_PKT[2];
-       io7_csr PO7_UGBGE_SYM;          /* 0x30.2200 */
-       io7_csr rsbv2[887];
-       io7_csr PO7_LSI_CTL[128];       /* 0x31.0000 */
-       io7_csr rsvd3[123];
-       io7_csr HLT_CTL;                /* 0x31.3ec0 */
-       io7_csr HPI_CTL;                /* 0x31.3f00 */
-       io7_csr CRD_CTL;
-       io7_csr STV_CTL;
-       io7_csr HEI_CTL;
-       io7_csr PO7_MSI_CTL[16];        /* 0x31.4000 */
-       io7_csr rsvd4[240];
-
-       /*
-        * Interrupt Diagnostic / Test
-        */
-       struct {
-               io7_csr INT_PND;
-               io7_csr INT_CLR;
-               io7_csr INT_EOI;
-               io7_csr rsvd[29];
-       } INT_DIAG[4];
-       io7_csr rsvd5[125];             /* 0x31.a000 */
-       io7_csr MISC_PND;               /* 0x31.b800 */
-       io7_csr rsvd6[31];
-       io7_csr MSI_PND[16];            /* 0x31.c000 */
-       io7_csr rsvd7[16];
-       io7_csr MSI_CLR[16];            /* 0x31.c800 */
-} io7_port7_csrs;
-
-/* 
- * IO7 DMA Window Base register (POx_WBASEx)
- */
-#define wbase_m_ena  0x1
-#define wbase_m_sg   0x2
-#define wbase_m_dac  0x4
-#define wbase_m_addr 0xFFF00000
-union IO7_POx_WBASE {
-       struct {
-               unsigned ena : 1;       /* <0>                  */
-               unsigned sg : 1;        /* <1>                  */
-               unsigned dac : 1;       /* <2> -- window 3 only */
-               unsigned rsvd1 : 17; 
-               unsigned addr : 12;     /* <31:20>              */
-               unsigned rsvd2 : 32;
-       } bits;
-       unsigned as_long[2];
-       unsigned as_quad;
-};
-
-/*
- * IO7 IID (Interrupt IDentifier) format
- *
- * For level-sensative interrupts, int_num is encoded as:
- *
- *     bus/port        slot/device     INTx
- *     <7:5>           <4:2>           <1:0>
- */
-union IO7_IID {
-       struct {
-               unsigned int_num : 9;           /* <8:0>        */
-               unsigned tpu_mask : 4;          /* <12:9> rsvd  */
-               unsigned msi : 1;               /* 13           */
-               unsigned ipe : 10;              /* <23:14>      */
-               unsigned long rsvd : 40;                
-       } bits;
-       unsigned int as_long[2];
-       unsigned long as_quad;
-};
-
-/*
- * IO7 addressing macros
- */
-#define IO7_KERN_ADDR(addr)    (EV7_KERN_ADDR(addr))
-
-#define IO7_PORT_MASK          0x07UL  /* 3 bits of port          */
-
-#define IO7_IPE(pe)            (EV7_IPE(pe))
-#define IO7_IPORT(port)                ((~((long)(port)) & IO7_PORT_MASK) << 32)
-
-#define IO7_HOSE(pe, port)     (IO7_IPE(pe) | IO7_IPORT(port))
-
-#define IO7_MEM_PHYS(pe, port) (IO7_HOSE(pe, port) | 0x00000000UL)
-#define IO7_CONF_PHYS(pe, port)        (IO7_HOSE(pe, port) | 0xFE000000UL)
-#define IO7_IO_PHYS(pe, port)  (IO7_HOSE(pe, port) | 0xFF000000UL)
-#define IO7_CSR_PHYS(pe, port, off) \
-                                (IO7_HOSE(pe, port) | 0xFF800000UL | (off))
-#define IO7_CSRS_PHYS(pe, port)        (IO7_CSR_PHYS(pe, port, 0UL))
-#define IO7_PORT7_CSRS_PHYS(pe) (IO7_CSR_PHYS(pe, 7, 0x300000UL))
-
-#define IO7_MEM_KERN(pe, port)      (IO7_KERN_ADDR(IO7_MEM_PHYS(pe, port)))
-#define IO7_CONF_KERN(pe, port)     (IO7_KERN_ADDR(IO7_CONF_PHYS(pe, port)))
-#define IO7_IO_KERN(pe, port)       (IO7_KERN_ADDR(IO7_IO_PHYS(pe, port)))
-#define IO7_CSR_KERN(pe, port, off) (IO7_KERN_ADDR(IO7_CSR_PHYS(pe,port,off)))
-#define IO7_CSRS_KERN(pe, port)     (IO7_KERN_ADDR(IO7_CSRS_PHYS(pe, port)))
-#define IO7_PORT7_CSRS_KERN(pe)            (IO7_KERN_ADDR(IO7_PORT7_CSRS_PHYS(pe)))
-
-#define IO7_PLL_RNGA(pll)      (((pll) >> 3) & 0x7)
-#define IO7_PLL_RNGB(pll)      (((pll) >> 6) & 0x7)
-
-#define IO7_MEM_SPACE          (2UL * 1024 * 1024 * 1024)      /* 2GB MEM */
-#define IO7_IO_SPACE           (8UL * 1024 * 1024)             /* 8MB I/O */
-
-/* 
- * Offset between ram physical addresses and pci64 DAC addresses
- */
-#define IO7_DAC_OFFSET         (1UL << 49)
-
-/*
- * This is needed to satisify the IO() macro used in initializing the machvec
- */
-#define MARVEL_IACK_SC                                                         \
-        ((unsigned long)                                               \
-        (&(((io7_ioport_csrs *)IO7_CSRS_KERN(0, 0))->POx_IACK_SPECIAL)))
-
-#ifdef __KERNEL__
-
-/*
- * IO7 structs
- */
-#define IO7_NUM_PORTS 4
-#define IO7_AGP_PORT  3
-
-struct io7_port {
-       struct io7 *io7;
-       struct pci_controller *hose;
-
-       int enabled;
-       unsigned int port;
-       io7_ioport_csrs *csrs;
-
-       unsigned long saved_wbase[4];
-       unsigned long saved_wmask[4];
-       unsigned long saved_tbase[4];
-};
-
-struct io7 {
-       struct io7 *next;
-
-       unsigned int pe;
-       io7_port7_csrs *csrs;
-       struct io7_port ports[IO7_NUM_PORTS];
-
-       spinlock_t irq_lock;
-};
-
-#ifndef __EXTERN_INLINE
-# define __EXTERN_INLINE extern inline
-# define __IO_EXTERN_INLINE
-#endif
-
-/*
- * I/O functions. All access through linear space.
- */
-
-/*
- * Memory functions.  All accesses through linear space.
- */
-
-#define vucp   volatile unsigned char __force *
-#define vusp   volatile unsigned short __force *
-
-extern unsigned int marvel_ioread8(void __iomem *);
-extern void marvel_iowrite8(u8 b, void __iomem *);
-
-__EXTERN_INLINE unsigned int marvel_ioread16(void __iomem *addr)
-{
-       return __kernel_ldwu(*(vusp)addr);
-}
-
-__EXTERN_INLINE void marvel_iowrite16(u16 b, void __iomem *addr)
-{
-       __kernel_stw(b, *(vusp)addr);
-}
-
-extern void __iomem *marvel_ioremap(unsigned long addr, unsigned long size);
-extern void marvel_iounmap(volatile void __iomem *addr);
-extern void __iomem *marvel_ioportmap (unsigned long addr);
-
-__EXTERN_INLINE int marvel_is_ioaddr(unsigned long addr)
-{
-       return (addr >> 40) & 1;
-}
-
-extern int marvel_is_mmio(const volatile void __iomem *);
-
-#undef vucp
-#undef vusp
-
-#undef __IO_PREFIX
-#define __IO_PREFIX            marvel
-#define marvel_trivial_rw_bw   1
-#define marvel_trivial_rw_lq   1
-#define marvel_trivial_io_bw   0
-#define marvel_trivial_io_lq   1
-#define marvel_trivial_iounmap 0
-#include <asm/io_trivial.h>
-
-#ifdef __IO_EXTERN_INLINE
-# undef __EXTERN_INLINE
-# undef __IO_EXTERN_INLINE
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_MARVEL__H__ */
diff --git a/include/asm-alpha/core_mcpcia.h b/include/asm-alpha/core_mcpcia.h
deleted file mode 100644 (file)
index acf55b4..0000000
+++ /dev/null
@@ -1,381 +0,0 @@
-#ifndef __ALPHA_MCPCIA__H__
-#define __ALPHA_MCPCIA__H__
-
-/* Define to experiment with fitting everything into one 128MB HAE window.
-   One window per bus, that is.  */
-#define MCPCIA_ONE_HAE_WINDOW 1
-
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <asm/compiler.h>
-
-/*
- * MCPCIA is the internal name for a core logic chipset which provides
- * PCI access for the RAWHIDE family of systems.
- *
- * This file is based on:
- *
- * RAWHIDE System Programmer's Manual
- * 16-May-96
- * Rev. 1.4
- *
- */
-
-/*------------------------------------------------------------------------**
-**                                                                        **
-**  I/O procedures                                                        **
-**                                                                        **
-**      inport[b|w|t|l], outport[b|w|t|l] 8:16:24:32 IO xfers             **
-**     inportbxt: 8 bits only                                            **
-**      inport:    alias of inportw                                       **
-**      outport:   alias of outportw                                      **
-**                                                                        **
-**      inmem[b|w|t|l], outmem[b|w|t|l] 8:16:24:32 ISA memory xfers       **
-**     inmembxt: 8 bits only                                             **
-**      inmem:    alias of inmemw                                         **
-**      outmem:   alias of outmemw                                        **
-**                                                                        **
-**------------------------------------------------------------------------*/
-
-
-/* MCPCIA ADDRESS BIT DEFINITIONS
- *
- *  3333 3333 3322 2222 2222 1111 1111 11
- *  9876 5432 1098 7654 3210 9876 5432 1098 7654 3210
- *  ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
- *  1                                             000
- *  ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
- *  |                                             |\|
- *  |                               Byte Enable --+ |
- *  |                             Transfer Length --+
- *  +-- IO space, not cached
- *
- *   Byte      Transfer
- *   Enable    Length    Transfer  Byte    Address
- *   adr<6:5>  adr<4:3>  Length    Enable  Adder
- *   ---------------------------------------------
- *      00        00      Byte      1110   0x000
- *      01        00      Byte      1101   0x020
- *      10        00      Byte      1011   0x040
- *      11        00      Byte      0111   0x060
- *
- *      00        01      Word      1100   0x008
- *      01        01      Word      1001   0x028 <= Not supported in this code.
- *      10        01      Word      0011   0x048
- *
- *      00        10      Tribyte   1000   0x010
- *      01        10      Tribyte   0001   0x030
- *
- *      10        11      Longword  0000   0x058
- *
- *      Note that byte enables are asserted low.
- *
- */
-
-#define MCPCIA_MAX_HOSES 4
-
-#define MCPCIA_MID(m)          ((unsigned long)(m) << 33)
-
-/* Dodge has PCI0 and PCI1 at MID 4 and 5 respectively. 
-   Durango adds PCI2 and PCI3 at MID 6 and 7 respectively.  */
-#define MCPCIA_HOSE2MID(h)     ((h) + 4)
-
-#define MCPCIA_MEM_MASK 0x07ffffff /* SPARSE Mem region mask is 27 bits */
-
-/*
- * Memory spaces:
- */
-#define MCPCIA_SPARSE(m)       (IDENT_ADDR + 0xf000000000UL + MCPCIA_MID(m))
-#define MCPCIA_DENSE(m)                (IDENT_ADDR + 0xf100000000UL + MCPCIA_MID(m))
-#define MCPCIA_IO(m)           (IDENT_ADDR + 0xf180000000UL + MCPCIA_MID(m))
-#define MCPCIA_CONF(m)         (IDENT_ADDR + 0xf1c0000000UL + MCPCIA_MID(m))
-#define MCPCIA_CSR(m)          (IDENT_ADDR + 0xf1e0000000UL + MCPCIA_MID(m))
-#define MCPCIA_IO_IACK(m)      (IDENT_ADDR + 0xf1f0000000UL + MCPCIA_MID(m))
-#define MCPCIA_DENSE_IO(m)     (IDENT_ADDR + 0xe1fc000000UL + MCPCIA_MID(m))
-#define MCPCIA_DENSE_CONF(m)   (IDENT_ADDR + 0xe1fe000000UL + MCPCIA_MID(m))
-
-/*
- *  General Registers
- */
-#define MCPCIA_REV(m)          (MCPCIA_CSR(m) + 0x000)
-#define MCPCIA_WHOAMI(m)       (MCPCIA_CSR(m) + 0x040)
-#define MCPCIA_PCI_LAT(m)      (MCPCIA_CSR(m) + 0x080)
-#define MCPCIA_CAP_CTRL(m)     (MCPCIA_CSR(m) + 0x100)
-#define MCPCIA_HAE_MEM(m)      (MCPCIA_CSR(m) + 0x400)
-#define MCPCIA_HAE_IO(m)       (MCPCIA_CSR(m) + 0x440)
-#define _MCPCIA_IACK_SC(m)     (MCPCIA_CSR(m) + 0x480)
-#define MCPCIA_HAE_DENSE(m)    (MCPCIA_CSR(m) + 0x4C0)
-
-/*
- * Interrupt Control registers
- */
-#define MCPCIA_INT_CTL(m)      (MCPCIA_CSR(m) + 0x500)
-#define MCPCIA_INT_REQ(m)      (MCPCIA_CSR(m) + 0x540)
-#define MCPCIA_INT_TARG(m)     (MCPCIA_CSR(m) + 0x580)
-#define MCPCIA_INT_ADR(m)      (MCPCIA_CSR(m) + 0x5C0)
-#define MCPCIA_INT_ADR_EXT(m)  (MCPCIA_CSR(m) + 0x600)
-#define MCPCIA_INT_MASK0(m)    (MCPCIA_CSR(m) + 0x640)
-#define MCPCIA_INT_MASK1(m)    (MCPCIA_CSR(m) + 0x680)
-#define MCPCIA_INT_ACK0(m)     (MCPCIA_CSR(m) + 0x10003f00)
-#define MCPCIA_INT_ACK1(m)     (MCPCIA_CSR(m) + 0x10003f40)
-
-/*
- * Performance Monitor registers
- */
-#define MCPCIA_PERF_MON(m)     (MCPCIA_CSR(m) + 0x300)
-#define MCPCIA_PERF_CONT(m)    (MCPCIA_CSR(m) + 0x340)
-
-/*
- * Diagnostic Registers
- */
-#define MCPCIA_CAP_DIAG(m)     (MCPCIA_CSR(m) + 0x700)
-#define MCPCIA_TOP_OF_MEM(m)   (MCPCIA_CSR(m) + 0x7C0)
-
-/*
- * Error registers
- */
-#define MCPCIA_MC_ERR0(m)      (MCPCIA_CSR(m) + 0x800)
-#define MCPCIA_MC_ERR1(m)      (MCPCIA_CSR(m) + 0x840)
-#define MCPCIA_CAP_ERR(m)      (MCPCIA_CSR(m) + 0x880)
-#define MCPCIA_PCI_ERR1(m)     (MCPCIA_CSR(m) + 0x1040)
-#define MCPCIA_MDPA_STAT(m)    (MCPCIA_CSR(m) + 0x4000)
-#define MCPCIA_MDPA_SYN(m)     (MCPCIA_CSR(m) + 0x4040)
-#define MCPCIA_MDPA_DIAG(m)    (MCPCIA_CSR(m) + 0x4080)
-#define MCPCIA_MDPB_STAT(m)    (MCPCIA_CSR(m) + 0x8000)
-#define MCPCIA_MDPB_SYN(m)     (MCPCIA_CSR(m) + 0x8040)
-#define MCPCIA_MDPB_DIAG(m)    (MCPCIA_CSR(m) + 0x8080)
-
-/*
- * PCI Address Translation Registers.
- */
-#define MCPCIA_SG_TBIA(m)      (MCPCIA_CSR(m) + 0x1300)
-#define MCPCIA_HBASE(m)                (MCPCIA_CSR(m) + 0x1340)
-
-#define MCPCIA_W0_BASE(m)      (MCPCIA_CSR(m) + 0x1400)
-#define MCPCIA_W0_MASK(m)      (MCPCIA_CSR(m) + 0x1440)
-#define MCPCIA_T0_BASE(m)      (MCPCIA_CSR(m) + 0x1480)
-
-#define MCPCIA_W1_BASE(m)      (MCPCIA_CSR(m) + 0x1500)
-#define MCPCIA_W1_MASK(m)      (MCPCIA_CSR(m) + 0x1540)
-#define MCPCIA_T1_BASE(m)      (MCPCIA_CSR(m) + 0x1580)
-
-#define MCPCIA_W2_BASE(m)      (MCPCIA_CSR(m) + 0x1600)
-#define MCPCIA_W2_MASK(m)      (MCPCIA_CSR(m) + 0x1640)
-#define MCPCIA_T2_BASE(m)      (MCPCIA_CSR(m) + 0x1680)
-
-#define MCPCIA_W3_BASE(m)      (MCPCIA_CSR(m) + 0x1700)
-#define MCPCIA_W3_MASK(m)      (MCPCIA_CSR(m) + 0x1740)
-#define MCPCIA_T3_BASE(m)      (MCPCIA_CSR(m) + 0x1780)
-
-/* Hack!  Only words for bus 0.  */
-
-#ifndef MCPCIA_ONE_HAE_WINDOW
-#define MCPCIA_HAE_ADDRESS     MCPCIA_HAE_MEM(4)
-#endif
-#define MCPCIA_IACK_SC         _MCPCIA_IACK_SC(4)
-
-/* 
- * The canonical non-remaped I/O and MEM addresses have these values
- * subtracted out.  This is arranged so that folks manipulating ISA
- * devices can use their familiar numbers and have them map to bus 0.
- */
-
-#define MCPCIA_IO_BIAS         MCPCIA_IO(4)
-#define MCPCIA_MEM_BIAS                MCPCIA_DENSE(4)
-
-/* Offset between ram physical addresses and pci64 DAC bus addresses.  */
-#define MCPCIA_DAC_OFFSET      (1UL << 40)
-
-/*
- * Data structure for handling MCPCIA machine checks:
- */
-struct el_MCPCIA_uncorrected_frame_mcheck {
-       struct el_common header;
-       struct el_common_EV5_uncorrectable_mcheck procdata;
-};
-
-
-#ifdef __KERNEL__
-
-#ifndef __EXTERN_INLINE
-#define __EXTERN_INLINE extern inline
-#define __IO_EXTERN_INLINE
-#endif
-
-/*
- * I/O functions:
- *
- * MCPCIA, the RAWHIDE family PCI/memory support chipset for the EV5 (21164)
- * and EV56 (21164a) processors, can use either a sparse address mapping
- * scheme, or the so-called byte-word PCI address space, to get at PCI memory
- * and I/O.
- *
- * Unfortunately, we can't use BWIO with EV5, so for now, we always use SPARSE.
- */
-
-/*
- * Memory functions.  64-bit and 32-bit accesses are done through
- * dense memory space, everything else through sparse space.
- *
- * For reading and writing 8 and 16 bit quantities we need to
- * go through one of the three sparse address mapping regions
- * and use the HAE_MEM CSR to provide some bits of the address.
- * The following few routines use only sparse address region 1
- * which gives 1Gbyte of accessible space which relates exactly
- * to the amount of PCI memory mapping *into* system address space.
- * See p 6-17 of the specification but it looks something like this:
- *
- * 21164 Address:
- *
- *          3         2         1
- * 9876543210987654321098765432109876543210
- * 1ZZZZ0.PCI.QW.Address............BBLL
- *
- * ZZ = SBZ
- * BB = Byte offset
- * LL = Transfer length
- *
- * PCI Address:
- *
- * 3         2         1
- * 10987654321098765432109876543210
- * HHH....PCI.QW.Address........ 00
- *
- * HHH = 31:29 HAE_MEM CSR
- *
- */
-
-#define vip    volatile int __force *
-#define vuip   volatile unsigned int __force *
-
-#ifdef MCPCIA_ONE_HAE_WINDOW
-#define MCPCIA_FROB_MMIO                                               \
-       if (__mcpcia_is_mmio(hose)) {                                   \
-               set_hae(hose & 0xffffffff);                             \
-               hose = hose - MCPCIA_DENSE(4) + MCPCIA_SPARSE(4);       \
-       }
-#else
-#define MCPCIA_FROB_MMIO                                               \
-       if (__mcpcia_is_mmio(hose)) {                                   \
-               hose = hose - MCPCIA_DENSE(4) + MCPCIA_SPARSE(4);       \
-       }
-#endif
-
-extern inline int __mcpcia_is_mmio(unsigned long addr)
-{
-       return (addr & 0x80000000UL) == 0;
-}
-
-__EXTERN_INLINE unsigned int mcpcia_ioread8(void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long)xaddr & MCPCIA_MEM_MASK;
-       unsigned long hose = (unsigned long)xaddr & ~MCPCIA_MEM_MASK;
-       unsigned long result;
-
-       MCPCIA_FROB_MMIO;
-
-       result = *(vip) ((addr << 5) + hose + 0x00);
-       return __kernel_extbl(result, addr & 3);
-}
-
-__EXTERN_INLINE void mcpcia_iowrite8(u8 b, void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long)xaddr & MCPCIA_MEM_MASK;
-       unsigned long hose = (unsigned long)xaddr & ~MCPCIA_MEM_MASK;
-       unsigned long w;
-
-       MCPCIA_FROB_MMIO;
-
-       w = __kernel_insbl(b, addr & 3);
-       *(vuip) ((addr << 5) + hose + 0x00) = w;
-}
-
-__EXTERN_INLINE unsigned int mcpcia_ioread16(void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long)xaddr & MCPCIA_MEM_MASK;
-       unsigned long hose = (unsigned long)xaddr & ~MCPCIA_MEM_MASK;
-       unsigned long result;
-
-       MCPCIA_FROB_MMIO;
-
-       result = *(vip) ((addr << 5) + hose + 0x08);
-       return __kernel_extwl(result, addr & 3);
-}
-
-__EXTERN_INLINE void mcpcia_iowrite16(u16 b, void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long)xaddr & MCPCIA_MEM_MASK;
-       unsigned long hose = (unsigned long)xaddr & ~MCPCIA_MEM_MASK;
-       unsigned long w;
-
-       MCPCIA_FROB_MMIO;
-
-       w = __kernel_inswl(b, addr & 3);
-       *(vuip) ((addr << 5) + hose + 0x08) = w;
-}
-
-__EXTERN_INLINE unsigned int mcpcia_ioread32(void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long)xaddr;
-
-       if (!__mcpcia_is_mmio(addr))
-               addr = ((addr & 0xffff) << 5) + (addr & ~0xfffful) + 0x18;
-
-       return *(vuip)addr;
-}
-
-__EXTERN_INLINE void mcpcia_iowrite32(u32 b, void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long)xaddr;
-
-       if (!__mcpcia_is_mmio(addr))
-               addr = ((addr & 0xffff) << 5) + (addr & ~0xfffful) + 0x18;
-
-       *(vuip)addr = b;
-}
-
-
-__EXTERN_INLINE void __iomem *mcpcia_ioportmap(unsigned long addr)
-{
-       return (void __iomem *)(addr + MCPCIA_IO_BIAS);
-}
-
-__EXTERN_INLINE void __iomem *mcpcia_ioremap(unsigned long addr,
-                                            unsigned long size)
-{
-       return (void __iomem *)(addr + MCPCIA_MEM_BIAS);
-}
-
-__EXTERN_INLINE int mcpcia_is_ioaddr(unsigned long addr)
-{
-       return addr >= MCPCIA_SPARSE(0);
-}
-
-__EXTERN_INLINE int mcpcia_is_mmio(const volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       return __mcpcia_is_mmio(addr);
-}
-
-#undef MCPCIA_FROB_MMIO
-
-#undef vip
-#undef vuip
-
-#undef __IO_PREFIX
-#define __IO_PREFIX            mcpcia
-#define mcpcia_trivial_rw_bw   2
-#define mcpcia_trivial_rw_lq   1
-#define mcpcia_trivial_io_bw   0
-#define mcpcia_trivial_io_lq   0
-#define mcpcia_trivial_iounmap 1
-#include <asm/io_trivial.h>
-
-#ifdef __IO_EXTERN_INLINE
-#undef __EXTERN_INLINE
-#undef __IO_EXTERN_INLINE
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_MCPCIA__H__ */
diff --git a/include/asm-alpha/core_polaris.h b/include/asm-alpha/core_polaris.h
deleted file mode 100644 (file)
index 2f966b6..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-#ifndef __ALPHA_POLARIS__H__
-#define __ALPHA_POLARIS__H__
-
-#include <linux/types.h>
-#include <asm/compiler.h>
-
-/*
- * POLARIS is the internal name for a core logic chipset which provides
- * memory controller and PCI access for the 21164PC chip based systems.
- *
- * This file is based on:
- *
- * Polaris System Controller
- * Device Functional Specification
- * 22-Jan-98
- * Rev. 4.2
- *
- */
-
-/* Polaris memory regions */
-#define POLARIS_SPARSE_MEM_BASE                (IDENT_ADDR + 0xf800000000UL)
-#define POLARIS_DENSE_MEM_BASE         (IDENT_ADDR + 0xf900000000UL)
-#define POLARIS_SPARSE_IO_BASE         (IDENT_ADDR + 0xf980000000UL)
-#define POLARIS_SPARSE_CONFIG_BASE     (IDENT_ADDR + 0xf9c0000000UL)
-#define POLARIS_IACK_BASE              (IDENT_ADDR + 0xf9f8000000UL)
-#define POLARIS_DENSE_IO_BASE          (IDENT_ADDR + 0xf9fc000000UL)
-#define POLARIS_DENSE_CONFIG_BASE      (IDENT_ADDR + 0xf9fe000000UL)
-
-#define POLARIS_IACK_SC                        POLARIS_IACK_BASE
-
-/* The Polaris command/status registers live in PCI Config space for
- * bus 0/device 0.  As such, they may be bytes, words, or doublewords.
- */
-#define POLARIS_W_VENID                (POLARIS_DENSE_CONFIG_BASE)
-#define POLARIS_W_DEVID                (POLARIS_DENSE_CONFIG_BASE+2)
-#define POLARIS_W_CMD          (POLARIS_DENSE_CONFIG_BASE+4)
-#define POLARIS_W_STATUS       (POLARIS_DENSE_CONFIG_BASE+6)
-
-/*
- * Data structure for handling POLARIS machine checks:
- */
-struct el_POLARIS_sysdata_mcheck {
-    u_long      psc_status;
-    u_long     psc_pcictl0;
-    u_long     psc_pcictl1;
-    u_long     psc_pcictl2;
-};
-
-#ifdef __KERNEL__
-
-#ifndef __EXTERN_INLINE
-#define __EXTERN_INLINE extern inline
-#define __IO_EXTERN_INLINE
-#endif
-
-/*
- * I/O functions:
- *
- * POLARIS, the PCI/memory support chipset for the PCA56 (21164PC)
- * processors, can use either a sparse address  mapping scheme, or the 
- * so-called byte-word PCI address space, to get at PCI memory and I/O.
- *
- * However, we will support only the BWX form.
- */
-
-/*
- * Memory functions.  Polaris allows all accesses (byte/word
- * as well as long/quad) to be done through dense space.
- *
- * We will only support DENSE access via BWX insns.
- */
-
-__EXTERN_INLINE void __iomem *polaris_ioportmap(unsigned long addr)
-{
-       return (void __iomem *)(addr + POLARIS_DENSE_IO_BASE);
-}
-
-__EXTERN_INLINE void __iomem *polaris_ioremap(unsigned long addr,
-                                             unsigned long size)
-{
-       return (void __iomem *)(addr + POLARIS_DENSE_MEM_BASE);
-}
-
-__EXTERN_INLINE int polaris_is_ioaddr(unsigned long addr)
-{
-       return addr >= POLARIS_SPARSE_MEM_BASE;
-}
-
-__EXTERN_INLINE int polaris_is_mmio(const volatile void __iomem *addr)
-{
-       return (unsigned long)addr < POLARIS_SPARSE_IO_BASE;
-}
-
-#undef __IO_PREFIX
-#define __IO_PREFIX            polaris
-#define polaris_trivial_rw_bw  1
-#define polaris_trivial_rw_lq  1
-#define polaris_trivial_io_bw  1
-#define polaris_trivial_io_lq  1
-#define polaris_trivial_iounmap        1
-#include <asm/io_trivial.h>
-
-#ifdef __IO_EXTERN_INLINE
-#undef __EXTERN_INLINE
-#undef __IO_EXTERN_INLINE
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_POLARIS__H__ */
diff --git a/include/asm-alpha/core_t2.h b/include/asm-alpha/core_t2.h
deleted file mode 100644 (file)
index 46bfff5..0000000
+++ /dev/null
@@ -1,633 +0,0 @@
-#ifndef __ALPHA_T2__H__
-#define __ALPHA_T2__H__
-
-#include <linux/types.h>
-#include <linux/spinlock.h>
-#include <asm/compiler.h>
-#include <asm/system.h>
-
-/*
- * T2 is the internal name for the core logic chipset which provides
- * memory controller and PCI access for the SABLE-based systems.
- *
- * This file is based on:
- *
- * SABLE I/O Specification
- * Revision/Update Information: 1.3
- *
- * jestabro@amt.tay1.dec.com Initial Version.
- *
- */
-
-#define T2_MEM_R1_MASK 0x07ffffff  /* Mem sparse region 1 mask is 26 bits */
-
-/* GAMMA-SABLE is a SABLE with EV5-based CPUs */
-/* All LYNX machines, EV4 or EV5, use the GAMMA bias also */
-#define _GAMMA_BIAS            0x8000000000UL
-
-#if defined(CONFIG_ALPHA_GENERIC)
-#define GAMMA_BIAS             alpha_mv.sys.t2.gamma_bias
-#elif defined(CONFIG_ALPHA_GAMMA)
-#define GAMMA_BIAS             _GAMMA_BIAS
-#else
-#define GAMMA_BIAS             0
-#endif
-
-/*
- * Memory spaces:
- */
-#define T2_CONF                        (IDENT_ADDR + GAMMA_BIAS + 0x390000000UL)
-#define T2_IO                  (IDENT_ADDR + GAMMA_BIAS + 0x3a0000000UL)
-#define T2_SPARSE_MEM          (IDENT_ADDR + GAMMA_BIAS + 0x200000000UL)
-#define T2_DENSE_MEM           (IDENT_ADDR + GAMMA_BIAS + 0x3c0000000UL)
-
-#define T2_IOCSR               (IDENT_ADDR + GAMMA_BIAS + 0x38e000000UL)
-#define T2_CERR1               (IDENT_ADDR + GAMMA_BIAS + 0x38e000020UL)
-#define T2_CERR2               (IDENT_ADDR + GAMMA_BIAS + 0x38e000040UL)
-#define T2_CERR3               (IDENT_ADDR + GAMMA_BIAS + 0x38e000060UL)
-#define T2_PERR1               (IDENT_ADDR + GAMMA_BIAS + 0x38e000080UL)
-#define T2_PERR2               (IDENT_ADDR + GAMMA_BIAS + 0x38e0000a0UL)
-#define T2_PSCR                        (IDENT_ADDR + GAMMA_BIAS + 0x38e0000c0UL)
-#define T2_HAE_1               (IDENT_ADDR + GAMMA_BIAS + 0x38e0000e0UL)
-#define T2_HAE_2               (IDENT_ADDR + GAMMA_BIAS + 0x38e000100UL)
-#define T2_HBASE               (IDENT_ADDR + GAMMA_BIAS + 0x38e000120UL)
-#define T2_WBASE1              (IDENT_ADDR + GAMMA_BIAS + 0x38e000140UL)
-#define T2_WMASK1              (IDENT_ADDR + GAMMA_BIAS + 0x38e000160UL)
-#define T2_TBASE1              (IDENT_ADDR + GAMMA_BIAS + 0x38e000180UL)
-#define T2_WBASE2              (IDENT_ADDR + GAMMA_BIAS + 0x38e0001a0UL)
-#define T2_WMASK2              (IDENT_ADDR + GAMMA_BIAS + 0x38e0001c0UL)
-#define T2_TBASE2              (IDENT_ADDR + GAMMA_BIAS + 0x38e0001e0UL)
-#define T2_TLBBR               (IDENT_ADDR + GAMMA_BIAS + 0x38e000200UL)
-#define T2_IVR                 (IDENT_ADDR + GAMMA_BIAS + 0x38e000220UL)
-#define T2_HAE_3               (IDENT_ADDR + GAMMA_BIAS + 0x38e000240UL)
-#define T2_HAE_4               (IDENT_ADDR + GAMMA_BIAS + 0x38e000260UL)
-
-/* The CSRs below are T3/T4 only */
-#define T2_WBASE3              (IDENT_ADDR + GAMMA_BIAS + 0x38e000280UL)
-#define T2_WMASK3              (IDENT_ADDR + GAMMA_BIAS + 0x38e0002a0UL)
-#define T2_TBASE3              (IDENT_ADDR + GAMMA_BIAS + 0x38e0002c0UL)
-
-#define T2_TDR0                        (IDENT_ADDR + GAMMA_BIAS + 0x38e000300UL)
-#define T2_TDR1                        (IDENT_ADDR + GAMMA_BIAS + 0x38e000320UL)
-#define T2_TDR2                        (IDENT_ADDR + GAMMA_BIAS + 0x38e000340UL)
-#define T2_TDR3                        (IDENT_ADDR + GAMMA_BIAS + 0x38e000360UL)
-#define T2_TDR4                        (IDENT_ADDR + GAMMA_BIAS + 0x38e000380UL)
-#define T2_TDR5                        (IDENT_ADDR + GAMMA_BIAS + 0x38e0003a0UL)
-#define T2_TDR6                        (IDENT_ADDR + GAMMA_BIAS + 0x38e0003c0UL)
-#define T2_TDR7                        (IDENT_ADDR + GAMMA_BIAS + 0x38e0003e0UL)
-
-#define T2_WBASE4              (IDENT_ADDR + GAMMA_BIAS + 0x38e000400UL)
-#define T2_WMASK4              (IDENT_ADDR + GAMMA_BIAS + 0x38e000420UL)
-#define T2_TBASE4              (IDENT_ADDR + GAMMA_BIAS + 0x38e000440UL)
-
-#define T2_AIR                 (IDENT_ADDR + GAMMA_BIAS + 0x38e000460UL)
-#define T2_VAR                 (IDENT_ADDR + GAMMA_BIAS + 0x38e000480UL)
-#define T2_DIR                 (IDENT_ADDR + GAMMA_BIAS + 0x38e0004a0UL)
-#define T2_ICE                 (IDENT_ADDR + GAMMA_BIAS + 0x38e0004c0UL)
-
-#define T2_HAE_ADDRESS         T2_HAE_1
-
-/*  T2 CSRs are in the non-cachable primary IO space from 3.8000.0000 to
- 3.8fff.ffff
- *
- *  +--------------+ 3 8000 0000
- *  | CPU 0 CSRs   |
- *  +--------------+ 3 8100 0000
- *  | CPU 1 CSRs   |
- *  +--------------+ 3 8200 0000
- *  | CPU 2 CSRs   |
- *  +--------------+ 3 8300 0000
- *  | CPU 3 CSRs   |
- *  +--------------+ 3 8400 0000
- *  | CPU Reserved |
- *  +--------------+ 3 8700 0000
- *  | Mem Reserved |
- *  +--------------+ 3 8800 0000
- *  | Mem 0 CSRs   |
- *  +--------------+ 3 8900 0000
- *  | Mem 1 CSRs   |
- *  +--------------+ 3 8a00 0000
- *  | Mem 2 CSRs   |
- *  +--------------+ 3 8b00 0000
- *  | Mem 3 CSRs   |
- *  +--------------+ 3 8c00 0000
- *  | Mem Reserved |
- *  +--------------+ 3 8e00 0000
- *  | PCI Bridge   |
- *  +--------------+ 3 8f00 0000
- *  | Expansion IO |
- *  +--------------+ 3 9000 0000
- *
- *
- */
-#define T2_CPU0_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x380000000L)
-#define T2_CPU1_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x381000000L)
-#define T2_CPU2_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x382000000L)
-#define T2_CPU3_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x383000000L)
-
-#define T2_CPUn_BASE(n)                (T2_CPU0_BASE + (((n)&3) * 0x001000000L))
-
-#define T2_MEM0_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x388000000L)
-#define T2_MEM1_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x389000000L)
-#define T2_MEM2_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x38a000000L)
-#define T2_MEM3_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x38b000000L)
-
-
-/*
- * Sable CPU Module CSRS
- *
- * These are CSRs for hardware other than the CPU chip on the CPU module.
- * The CPU module has Backup Cache control logic, Cbus control logic, and
- * interrupt control logic on it.  There is a duplicate tag store to speed
- * up maintaining cache coherency.
- */
-
-struct sable_cpu_csr {
-  unsigned long bcc;     long fill_00[3]; /* Backup Cache Control */
-  unsigned long bcce;    long fill_01[3]; /* Backup Cache Correctable Error */
-  unsigned long bccea;   long fill_02[3]; /* B-Cache Corr Err Address Latch */
-  unsigned long bcue;    long fill_03[3]; /* B-Cache Uncorrectable Error */
-  unsigned long bcuea;   long fill_04[3]; /* B-Cache Uncorr Err Addr Latch */
-  unsigned long dter;    long fill_05[3]; /* Duplicate Tag Error */
-  unsigned long cbctl;   long fill_06[3]; /* CBus Control */
-  unsigned long cbe;     long fill_07[3]; /* CBus Error */
-  unsigned long cbeal;   long fill_08[3]; /* CBus Error Addr Latch low */
-  unsigned long cbeah;   long fill_09[3]; /* CBus Error Addr Latch high */
-  unsigned long pmbx;    long fill_10[3]; /* Processor Mailbox */
-  unsigned long ipir;    long fill_11[3]; /* Inter-Processor Int Request */
-  unsigned long sic;     long fill_12[3]; /* System Interrupt Clear */
-  unsigned long adlk;    long fill_13[3]; /* Address Lock (LDxL/STxC) */
-  unsigned long madrl;   long fill_14[3]; /* CBus Miss Address */
-  unsigned long rev;     long fill_15[3]; /* CMIC Revision */
-};
-
-/*
- * Data structure for handling T2 machine checks:
- */
-struct el_t2_frame_header {
-       unsigned int    elcf_fid;       /* Frame ID (from above) */
-       unsigned int    elcf_size;      /* Size of frame in bytes */
-};
-
-struct el_t2_procdata_mcheck {
-       unsigned long   elfmc_paltemp[32];      /* PAL TEMP REGS. */
-       /* EV4-specific fields */
-       unsigned long   elfmc_exc_addr; /* Addr of excepting insn. */
-       unsigned long   elfmc_exc_sum;  /* Summary of arith traps. */
-       unsigned long   elfmc_exc_mask; /* Exception mask (from exc_sum). */
-       unsigned long   elfmc_iccsr;    /* IBox hardware enables. */
-       unsigned long   elfmc_pal_base; /* Base address for PALcode. */
-       unsigned long   elfmc_hier;     /* Hardware Interrupt Enable. */
-       unsigned long   elfmc_hirr;     /* Hardware Interrupt Request. */
-       unsigned long   elfmc_mm_csr;   /* D-stream fault info. */
-       unsigned long   elfmc_dc_stat;  /* D-cache status (ECC/Parity Err). */
-       unsigned long   elfmc_dc_addr;  /* EV3 Phys Addr for ECC/DPERR. */
-       unsigned long   elfmc_abox_ctl; /* ABox Control Register. */
-       unsigned long   elfmc_biu_stat; /* BIU Status. */
-       unsigned long   elfmc_biu_addr; /* BUI Address. */
-       unsigned long   elfmc_biu_ctl;  /* BIU Control. */
-       unsigned long   elfmc_fill_syndrome; /* For correcting ECC errors. */
-       unsigned long   elfmc_fill_addr;/* Cache block which was being read. */
-       unsigned long   elfmc_va;       /* Effective VA of fault or miss. */
-       unsigned long   elfmc_bc_tag;   /* Backup Cache Tag Probe Results. */
-};
-
-/*
- * Sable processor specific Machine Check Data segment.
- */
-
-struct el_t2_logout_header {
-       unsigned int    elfl_size;      /* size in bytes of logout area. */
-       unsigned int    elfl_sbz1:31;   /* Should be zero. */
-       unsigned int    elfl_retry:1;   /* Retry flag. */
-       unsigned int    elfl_procoffset; /* Processor-specific offset. */
-       unsigned int    elfl_sysoffset;  /* Offset of system-specific. */
-       unsigned int    elfl_error_type;        /* PAL error type code. */
-       unsigned int    elfl_frame_rev;         /* PAL Frame revision. */
-};
-struct el_t2_sysdata_mcheck {
-       unsigned long    elcmc_bcc;           /* CSR 0 */
-       unsigned long    elcmc_bcce;          /* CSR 1 */
-       unsigned long    elcmc_bccea;      /* CSR 2 */
-       unsigned long    elcmc_bcue;          /* CSR 3 */
-       unsigned long    elcmc_bcuea;      /* CSR 4 */
-       unsigned long    elcmc_dter;          /* CSR 5 */
-       unsigned long    elcmc_cbctl;      /* CSR 6 */
-       unsigned long    elcmc_cbe;           /* CSR 7 */
-       unsigned long    elcmc_cbeal;      /* CSR 8 */
-       unsigned long    elcmc_cbeah;      /* CSR 9 */
-       unsigned long    elcmc_pmbx;          /* CSR 10 */
-       unsigned long    elcmc_ipir;          /* CSR 11 */
-       unsigned long    elcmc_sic;           /* CSR 12 */
-       unsigned long    elcmc_adlk;          /* CSR 13 */
-       unsigned long    elcmc_madrl;      /* CSR 14 */
-       unsigned long    elcmc_crrev4;     /* CSR 15 */
-};
-
-/*
- * Sable memory error frame - sable pfms section 3.42
- */
-struct el_t2_data_memory {
-       struct  el_t2_frame_header elcm_hdr;    /* ID$MEM-FERR = 0x08 */
-       unsigned int  elcm_module;      /* Module id. */
-       unsigned int  elcm_res04;       /* Reserved. */
-       unsigned long elcm_merr;        /* CSR0: Error Reg 1. */
-       unsigned long elcm_mcmd1;       /* CSR1: Command Trap 1. */
-       unsigned long elcm_mcmd2;       /* CSR2: Command Trap 2. */
-       unsigned long elcm_mconf;       /* CSR3: Configuration. */
-       unsigned long elcm_medc1;       /* CSR4: EDC Status 1. */
-       unsigned long elcm_medc2;       /* CSR5: EDC Status 2. */
-       unsigned long elcm_medcc;       /* CSR6: EDC Control. */
-       unsigned long elcm_msctl;       /* CSR7: Stream Buffer Control. */
-       unsigned long elcm_mref;        /* CSR8: Refresh Control. */
-       unsigned long elcm_filter;      /* CSR9: CRD Filter Control. */
-};
-
-
-/*
- * Sable other CPU error frame - sable pfms section 3.43
- */
-struct el_t2_data_other_cpu {
-       short         elco_cpuid;       /* CPU ID */
-       short         elco_res02[3];
-       unsigned long elco_bcc; /* CSR 0 */
-       unsigned long elco_bcce;        /* CSR 1 */
-       unsigned long elco_bccea;       /* CSR 2 */
-       unsigned long elco_bcue;        /* CSR 3 */
-       unsigned long elco_bcuea;       /* CSR 4 */
-       unsigned long elco_dter;        /* CSR 5 */
-       unsigned long elco_cbctl;       /* CSR 6 */
-       unsigned long elco_cbe; /* CSR 7 */
-       unsigned long elco_cbeal;       /* CSR 8 */
-       unsigned long elco_cbeah;       /* CSR 9 */
-       unsigned long elco_pmbx;        /* CSR 10 */
-       unsigned long elco_ipir;        /* CSR 11 */
-       unsigned long elco_sic; /* CSR 12 */
-       unsigned long elco_adlk;        /* CSR 13 */
-       unsigned long elco_madrl;       /* CSR 14 */
-       unsigned long elco_crrev4;      /* CSR 15 */
-};
-
-/*
- * Sable other CPU error frame - sable pfms section 3.44
- */
-struct el_t2_data_t2{
-       struct el_t2_frame_header elct_hdr;     /* ID$T2-FRAME */
-       unsigned long elct_iocsr;       /* IO Control and Status Register */
-       unsigned long elct_cerr1;       /* Cbus Error Register 1 */
-       unsigned long elct_cerr2;       /* Cbus Error Register 2 */
-       unsigned long elct_cerr3;       /* Cbus Error Register 3 */
-       unsigned long elct_perr1;       /* PCI Error Register 1 */
-       unsigned long elct_perr2;       /* PCI Error Register 2 */
-       unsigned long elct_hae0_1;      /* High Address Extension Register 1 */
-       unsigned long elct_hae0_2;      /* High Address Extension Register 2 */
-       unsigned long elct_hbase;       /* High Base Register */
-       unsigned long elct_wbase1;      /* Window Base Register 1 */
-       unsigned long elct_wmask1;      /* Window Mask Register 1 */
-       unsigned long elct_tbase1;      /* Translated Base Register 1 */
-       unsigned long elct_wbase2;      /* Window Base Register 2 */
-       unsigned long elct_wmask2;      /* Window Mask Register 2 */
-       unsigned long elct_tbase2;      /* Translated Base Register 2 */
-       unsigned long elct_tdr0;        /* TLB Data Register 0 */
-       unsigned long elct_tdr1;        /* TLB Data Register 1 */
-       unsigned long elct_tdr2;        /* TLB Data Register 2 */
-       unsigned long elct_tdr3;        /* TLB Data Register 3 */
-       unsigned long elct_tdr4;        /* TLB Data Register 4 */
-       unsigned long elct_tdr5;        /* TLB Data Register 5 */
-       unsigned long elct_tdr6;        /* TLB Data Register 6 */
-       unsigned long elct_tdr7;        /* TLB Data Register 7 */
-};
-
-/*
- * Sable error log data structure - sable pfms section 3.40
- */
-struct el_t2_data_corrected {
-       unsigned long elcpb_biu_stat;
-       unsigned long elcpb_biu_addr;
-       unsigned long elcpb_biu_ctl;
-       unsigned long elcpb_fill_syndrome;
-       unsigned long elcpb_fill_addr;
-       unsigned long elcpb_bc_tag;
-};
-
-/*
- * Sable error log data structure
- * Note there are 4 memory slots on sable (see t2.h)
- */
-struct el_t2_frame_mcheck {
-       struct el_t2_frame_header elfmc_header; /* ID$P-FRAME_MCHECK */
-       struct el_t2_logout_header elfmc_hdr;
-       struct el_t2_procdata_mcheck elfmc_procdata;
-       struct el_t2_sysdata_mcheck elfmc_sysdata;
-       struct el_t2_data_t2 elfmc_t2data;
-       struct el_t2_data_memory elfmc_memdata[4];
-       struct el_t2_frame_header elfmc_footer; /* empty */
-};
-
-
-/*
- * Sable error log data structures on memory errors
- */
-struct el_t2_frame_corrected {
-       struct el_t2_frame_header elfcc_header; /* ID$P-BC-COR */
-       struct el_t2_logout_header elfcc_hdr;
-       struct el_t2_data_corrected elfcc_procdata;
-/*     struct el_t2_data_t2 elfcc_t2data;              */
-/*     struct el_t2_data_memory elfcc_memdata[4];      */
-       struct el_t2_frame_header elfcc_footer; /* empty */
-};
-
-
-#ifdef __KERNEL__
-
-#ifndef __EXTERN_INLINE
-#define __EXTERN_INLINE extern inline
-#define __IO_EXTERN_INLINE
-#endif
-
-/*
- * I/O functions:
- *
- * T2 (the core logic PCI/memory support chipset for the SABLE
- * series of processors uses a sparse address mapping scheme to
- * get at PCI memory and I/O.
- */
-
-#define vip    volatile int *
-#define vuip   volatile unsigned int *
-
-extern inline u8 t2_inb(unsigned long addr)
-{
-       long result = *(vip) ((addr << 5) + T2_IO + 0x00);
-       return __kernel_extbl(result, addr & 3);
-}
-
-extern inline void t2_outb(u8 b, unsigned long addr)
-{
-       unsigned long w;
-
-       w = __kernel_insbl(b, addr & 3);
-       *(vuip) ((addr << 5) + T2_IO + 0x00) = w;
-       mb();
-}
-
-extern inline u16 t2_inw(unsigned long addr)
-{
-       long result = *(vip) ((addr << 5) + T2_IO + 0x08);
-       return __kernel_extwl(result, addr & 3);
-}
-
-extern inline void t2_outw(u16 b, unsigned long addr)
-{
-       unsigned long w;
-
-       w = __kernel_inswl(b, addr & 3);
-       *(vuip) ((addr << 5) + T2_IO + 0x08) = w;
-       mb();
-}
-
-extern inline u32 t2_inl(unsigned long addr)
-{
-       return *(vuip) ((addr << 5) + T2_IO + 0x18);
-}
-
-extern inline void t2_outl(u32 b, unsigned long addr)
-{
-       *(vuip) ((addr << 5) + T2_IO + 0x18) = b;
-       mb();
-}
-
-
-/*
- * Memory functions.
- *
- * For reading and writing 8 and 16 bit quantities we need to
- * go through one of the three sparse address mapping regions
- * and use the HAE_MEM CSR to provide some bits of the address.
- * The following few routines use only sparse address region 1
- * which gives 1Gbyte of accessible space which relates exactly
- * to the amount of PCI memory mapping *into* system address space.
- * See p 6-17 of the specification but it looks something like this:
- *
- * 21164 Address:
- *
- *          3         2         1
- * 9876543210987654321098765432109876543210
- * 1ZZZZ0.PCI.QW.Address............BBLL
- *
- * ZZ = SBZ
- * BB = Byte offset
- * LL = Transfer length
- *
- * PCI Address:
- *
- * 3         2         1
- * 10987654321098765432109876543210
- * HHH....PCI.QW.Address........ 00
- *
- * HHH = 31:29 HAE_MEM CSR
- *
- */
-
-#define t2_set_hae { \
-       msb = addr  >> 27; \
-       addr &= T2_MEM_R1_MASK; \
-       set_hae(msb); \
-}
-
-extern spinlock_t t2_hae_lock;
-
-/*
- * NOTE: take T2_DENSE_MEM off in each readX/writeX routine, since
- *       they may be called directly, rather than through the
- *       ioreadNN/iowriteNN routines.
- */
-
-__EXTERN_INLINE u8 t2_readb(const volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
-       unsigned long result, msb;
-       unsigned long flags;
-       spin_lock_irqsave(&t2_hae_lock, flags);
-
-       t2_set_hae;
-
-       result = *(vip) ((addr << 5) + T2_SPARSE_MEM + 0x00);
-       spin_unlock_irqrestore(&t2_hae_lock, flags);
-       return __kernel_extbl(result, addr & 3);
-}
-
-__EXTERN_INLINE u16 t2_readw(const volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
-       unsigned long result, msb;
-       unsigned long flags;
-       spin_lock_irqsave(&t2_hae_lock, flags);
-
-       t2_set_hae;
-
-       result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08);
-       spin_unlock_irqrestore(&t2_hae_lock, flags);
-       return __kernel_extwl(result, addr & 3);
-}
-
-/*
- * On SABLE with T2, we must use SPARSE memory even for 32-bit access,
- * because we cannot access all of DENSE without changing its HAE.
- */
-__EXTERN_INLINE u32 t2_readl(const volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
-       unsigned long result, msb;
-       unsigned long flags;
-       spin_lock_irqsave(&t2_hae_lock, flags);
-
-       t2_set_hae;
-
-       result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18);
-       spin_unlock_irqrestore(&t2_hae_lock, flags);
-       return result & 0xffffffffUL;
-}
-
-__EXTERN_INLINE u64 t2_readq(const volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
-       unsigned long r0, r1, work, msb;
-       unsigned long flags;
-       spin_lock_irqsave(&t2_hae_lock, flags);
-
-       t2_set_hae;
-
-       work = (addr << 5) + T2_SPARSE_MEM + 0x18;
-       r0 = *(vuip)(work);
-       r1 = *(vuip)(work + (4 << 5));
-       spin_unlock_irqrestore(&t2_hae_lock, flags);
-       return r1 << 32 | r0;
-}
-
-__EXTERN_INLINE void t2_writeb(u8 b, volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
-       unsigned long msb, w;
-       unsigned long flags;
-       spin_lock_irqsave(&t2_hae_lock, flags);
-
-       t2_set_hae;
-
-       w = __kernel_insbl(b, addr & 3);
-       *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x00) = w;
-       spin_unlock_irqrestore(&t2_hae_lock, flags);
-}
-
-__EXTERN_INLINE void t2_writew(u16 b, volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
-       unsigned long msb, w;
-       unsigned long flags;
-       spin_lock_irqsave(&t2_hae_lock, flags);
-
-       t2_set_hae;
-
-       w = __kernel_inswl(b, addr & 3);
-       *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08) = w;
-       spin_unlock_irqrestore(&t2_hae_lock, flags);
-}
-
-/*
- * On SABLE with T2, we must use SPARSE memory even for 32-bit access,
- * because we cannot access all of DENSE without changing its HAE.
- */
-__EXTERN_INLINE void t2_writel(u32 b, volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
-       unsigned long msb;
-       unsigned long flags;
-       spin_lock_irqsave(&t2_hae_lock, flags);
-
-       t2_set_hae;
-
-       *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18) = b;
-       spin_unlock_irqrestore(&t2_hae_lock, flags);
-}
-
-__EXTERN_INLINE void t2_writeq(u64 b, volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
-       unsigned long msb, work;
-       unsigned long flags;
-       spin_lock_irqsave(&t2_hae_lock, flags);
-
-       t2_set_hae;
-
-       work = (addr << 5) + T2_SPARSE_MEM + 0x18;
-       *(vuip)work = b;
-       *(vuip)(work + (4 << 5)) = b >> 32;
-       spin_unlock_irqrestore(&t2_hae_lock, flags);
-}
-
-__EXTERN_INLINE void __iomem *t2_ioportmap(unsigned long addr)
-{
-       return (void __iomem *)(addr + T2_IO);
-}
-
-__EXTERN_INLINE void __iomem *t2_ioremap(unsigned long addr, 
-                                        unsigned long size)
-{
-       return (void __iomem *)(addr + T2_DENSE_MEM);
-}
-
-__EXTERN_INLINE int t2_is_ioaddr(unsigned long addr)
-{
-       return (long)addr >= 0;
-}
-
-__EXTERN_INLINE int t2_is_mmio(const volatile void __iomem *addr)
-{
-       return (unsigned long)addr >= T2_DENSE_MEM;
-}
-
-/* New-style ioread interface.  The mmio routines are so ugly for T2 that
-   it doesn't make sense to merge the pio and mmio routines.  */
-
-#define IOPORT(OS, NS)                                                 \
-__EXTERN_INLINE unsigned int t2_ioread##NS(void __iomem *xaddr)                \
-{                                                                      \
-       if (t2_is_mmio(xaddr))                                          \
-               return t2_read##OS(xaddr);                              \
-       else                                                            \
-               return t2_in##OS((unsigned long)xaddr - T2_IO);         \
-}                                                                      \
-__EXTERN_INLINE void t2_iowrite##NS(u##NS b, void __iomem *xaddr)      \
-{                                                                      \
-       if (t2_is_mmio(xaddr))                                          \
-               t2_write##OS(b, xaddr);                                 \
-       else                                                            \
-               t2_out##OS(b, (unsigned long)xaddr - T2_IO);            \
-}
-
-IOPORT(b, 8)
-IOPORT(w, 16)
-IOPORT(l, 32)
-
-#undef IOPORT
-
-#undef vip
-#undef vuip
-
-#undef __IO_PREFIX
-#define __IO_PREFIX            t2
-#define t2_trivial_rw_bw       0
-#define t2_trivial_rw_lq       0
-#define t2_trivial_io_bw       0
-#define t2_trivial_io_lq       0
-#define t2_trivial_iounmap     1
-#include <asm/io_trivial.h>
-
-#ifdef __IO_EXTERN_INLINE
-#undef __EXTERN_INLINE
-#undef __IO_EXTERN_INLINE
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_T2__H__ */
diff --git a/include/asm-alpha/core_titan.h b/include/asm-alpha/core_titan.h
deleted file mode 100644 (file)
index a17f6f3..0000000
+++ /dev/null
@@ -1,410 +0,0 @@
-#ifndef __ALPHA_TITAN__H__
-#define __ALPHA_TITAN__H__
-
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <asm/compiler.h>
-
-/*
- * TITAN is the internal names for a core logic chipset which provides
- * memory controller and PCI/AGP access for 21264 based systems.
- *
- * This file is based on:
- *
- * Titan Chipset Engineering Specification
- * Revision 0.12
- * 13 July 1999
- *
- */
-
-/* XXX: Do we need to conditionalize on this?  */
-#ifdef USE_48_BIT_KSEG
-#define TI_BIAS 0x80000000000UL
-#else
-#define TI_BIAS 0x10000000000UL
-#endif
-
-/*
- * CChip, DChip, and PChip registers
- */
-
-typedef struct {
-       volatile unsigned long csr __attribute__((aligned(64)));
-} titan_64;
-
-typedef struct {
-       titan_64        csc;
-       titan_64        mtr;
-       titan_64        misc;
-       titan_64        mpd;
-       titan_64        aar0;
-       titan_64        aar1;
-       titan_64        aar2;
-       titan_64        aar3;
-       titan_64        dim0;
-       titan_64        dim1;
-       titan_64        dir0;
-       titan_64        dir1;
-       titan_64        drir;
-       titan_64        prben;
-       titan_64        iic0;
-       titan_64        iic1;
-       titan_64        mpr0;
-       titan_64        mpr1;
-       titan_64        mpr2;
-       titan_64        mpr3;
-       titan_64        rsvd[2];
-       titan_64        ttr;
-       titan_64        tdr;
-       titan_64        dim2;
-       titan_64        dim3;
-       titan_64        dir2;
-       titan_64        dir3;
-       titan_64        iic2;
-       titan_64        iic3;
-       titan_64        pwr;
-       titan_64        reserved[17];
-       titan_64        cmonctla;
-       titan_64        cmonctlb;
-       titan_64        cmoncnt01;
-       titan_64        cmoncnt23;
-       titan_64        cpen;
-} titan_cchip;
-
-typedef struct {
-       titan_64        dsc;
-       titan_64        str;
-       titan_64        drev;
-       titan_64        dsc2;
-} titan_dchip;
-
-typedef struct {
-       titan_64        wsba[4];
-       titan_64        wsm[4];
-       titan_64        tba[4];
-       titan_64        pctl;
-       titan_64        plat;
-       titan_64        reserved0[2];
-       union {
-               struct {
-                       titan_64        serror;
-                       titan_64        serren;
-                       titan_64        serrset;
-                       titan_64        reserved0;
-                       titan_64        gperror;
-                       titan_64        gperren;
-                       titan_64        gperrset;
-                       titan_64        reserved1;
-                       titan_64        gtlbiv;
-                       titan_64        gtlbia;
-                       titan_64        reserved2[2];
-                       titan_64        sctl;
-                       titan_64        reserved3[3];
-               } g;
-               struct {
-                       titan_64        agperror;
-                       titan_64        agperren;
-                       titan_64        agperrset;
-                       titan_64        agplastwr;
-                       titan_64        aperror;
-                       titan_64        aperren;
-                       titan_64        aperrset;
-                       titan_64        reserved0;
-                       titan_64        atlbiv;
-                       titan_64        atlbia;
-                       titan_64        reserved1[6];
-               } a;
-       } port_specific;
-       titan_64        sprst;
-       titan_64        reserved1[31];
-} titan_pachip_port;
-
-typedef struct {
-       titan_pachip_port       g_port;
-       titan_pachip_port       a_port;
-} titan_pachip;
-
-#define TITAN_cchip    ((titan_cchip  *)(IDENT_ADDR+TI_BIAS+0x1A0000000UL))
-#define TITAN_dchip            ((titan_dchip  *)(IDENT_ADDR+TI_BIAS+0x1B0000800UL))
-#define TITAN_pachip0  ((titan_pachip *)(IDENT_ADDR+TI_BIAS+0x180000000UL))
-#define TITAN_pachip1  ((titan_pachip *)(IDENT_ADDR+TI_BIAS+0x380000000UL))
-extern unsigned TITAN_agp;
-extern int TITAN_bootcpu;
-
-/*
- * TITAN PA-chip Window Space Base Address register.
- * (WSBA[0-2])
- */
-#define wsba_m_ena 0x1                
-#define wsba_m_sg 0x2
-#define wsba_m_addr 0xFFF00000  
-#define wmask_k_sz1gb 0x3FF00000                   
-union TPAchipWSBA {
-       struct  {
-               unsigned wsba_v_ena : 1;
-               unsigned wsba_v_sg : 1;
-               unsigned wsba_v_rsvd1 : 18;
-               unsigned wsba_v_addr : 12;
-               unsigned wsba_v_rsvd2 : 32;
-        } wsba_r_bits;
-       int wsba_q_whole [2];
-};
-
-/*
- * TITAN PA-chip Control Register
- * This definition covers both the G-Port GPCTL and the A-PORT APCTL.
- * Bits <51:0> are the same in both cases. APCTL<63:52> are only 
- * applicable to AGP.
- */
-#define pctl_m_fbtb                    0x00000001
-#define pctl_m_thdis                   0x00000002
-#define pctl_m_chaindis                0x00000004
-#define pctl_m_tgtlat                  0x00000018
-#define pctl_m_hole                    0x00000020
-#define pctl_m_mwin                    0x00000040
-#define pctl_m_arbena                  0x00000080
-#define pctl_m_prigrp                  0x0000FF00
-#define pctl_m_ppri                    0x00010000
-#define pctl_m_pcispd66                0x00020000
-#define pctl_m_cngstlt                 0x003C0000
-#define pctl_m_ptpdesten               0x3FC00000
-#define pctl_m_dpcen                   0x40000000
-#define pctl_m_apcen           0x0000000080000000UL
-#define pctl_m_dcrtv           0x0000000300000000UL
-#define pctl_m_en_stepping     0x0000000400000000UL
-#define apctl_m_rsvd1          0x000FFFF800000000UL
-#define apctl_m_agp_rate       0x0030000000000000UL
-#define apctl_m_agp_sba_en     0x0040000000000000UL
-#define apctl_m_agp_en         0x0080000000000000UL
-#define apctl_m_rsvd2          0x0100000000000000UL
-#define apctl_m_agp_present    0x0200000000000000UL
-#define apctl_agp_hp_rd                0x1C00000000000000UL
-#define apctl_agp_lp_rd                0xE000000000000000UL
-#define gpctl_m_rsvd           0xFFFFFFF800000000UL
-union TPAchipPCTL {
-       struct {
-               unsigned pctl_v_fbtb : 1;               /* A/G [0]     */
-               unsigned pctl_v_thdis : 1;              /* A/G [1]     */
-               unsigned pctl_v_chaindis : 1;           /* A/G [2]     */
-               unsigned pctl_v_tgtlat : 2;             /* A/G [4:3]   */
-               unsigned pctl_v_hole : 1;               /* A/G [5]     */
-               unsigned pctl_v_mwin : 1;               /* A/G [6]     */
-               unsigned pctl_v_arbena : 1;             /* A/G [7]     */
-               unsigned pctl_v_prigrp : 8;             /* A/G [15:8]  */
-               unsigned pctl_v_ppri : 1;               /* A/G [16]    */
-               unsigned pctl_v_pcispd66 : 1;           /* A/G [17]    */
-               unsigned pctl_v_cngstlt : 4;            /* A/G [21:18] */
-               unsigned pctl_v_ptpdesten : 8;          /* A/G [29:22] */
-               unsigned pctl_v_dpcen : 1;              /* A/G [30]    */
-               unsigned pctl_v_apcen : 1;              /* A/G [31]    */
-               unsigned pctl_v_dcrtv : 2;              /* A/G [33:32] */
-               unsigned pctl_v_en_stepping :1;         /* A/G [34]    */
-               unsigned apctl_v_rsvd1 : 17;            /* A   [51:35] */
-               unsigned apctl_v_agp_rate : 2;          /* A   [53:52] */
-               unsigned apctl_v_agp_sba_en : 1;        /* A   [54]    */
-               unsigned apctl_v_agp_en : 1;            /* A   [55]    */
-               unsigned apctl_v_rsvd2 : 1;             /* A   [56]    */
-               unsigned apctl_v_agp_present : 1;       /* A   [57]    */
-               unsigned apctl_v_agp_hp_rd : 3;         /* A   [60:58] */
-               unsigned apctl_v_agp_lp_rd : 3;         /* A   [63:61] */
-       } pctl_r_bits;
-       unsigned int pctl_l_whole [2];
-       unsigned long pctl_q_whole;
-};
-
-/*
- * SERROR / SERREN / SERRSET
- */
-union TPAchipSERR {
-       struct {
-               unsigned serr_v_lost_uecc : 1;          /* [0]          */
-               unsigned serr_v_uecc : 1;               /* [1]          */
-               unsigned serr_v_cre : 1;                /* [2]          */
-               unsigned serr_v_nxio : 1;               /* [3]          */
-               unsigned serr_v_lost_cre : 1;           /* [4]          */
-               unsigned serr_v_rsvd0 : 10;             /* [14:5]       */
-               unsigned serr_v_addr : 32;              /* [46:15]      */
-               unsigned serr_v_rsvd1 : 5;              /* [51:47]      */
-               unsigned serr_v_source : 2;             /* [53:52]      */
-               unsigned serr_v_cmd : 2;                /* [55:54]      */
-               unsigned serr_v_syn : 8;                /* [63:56]      */
-       } serr_r_bits;
-       unsigned int serr_l_whole[2];
-       unsigned long serr_q_whole;
-};
-
-/*
- * GPERROR / APERROR / GPERREN / APERREN / GPERRSET / APERRSET
- */
-union TPAchipPERR {
-       struct {
-               unsigned long perr_v_lost : 1;          /* [0]          */
-               unsigned long perr_v_serr : 1;          /* [1]          */
-               unsigned long perr_v_perr : 1;          /* [2]          */
-               unsigned long perr_v_dcrto : 1;         /* [3]          */
-               unsigned long perr_v_sge : 1;           /* [4]          */
-               unsigned long perr_v_ape : 1;           /* [5]          */
-               unsigned long perr_v_ta : 1;            /* [6]          */
-               unsigned long perr_v_dpe : 1;           /* [7]          */
-               unsigned long perr_v_nds : 1;           /* [8]          */
-               unsigned long perr_v_iptpr : 1;         /* [9]          */
-               unsigned long perr_v_iptpw : 1;         /* [10]         */
-               unsigned long perr_v_rsvd0 : 3;         /* [13:11]      */
-               unsigned long perr_v_addr : 33;         /* [46:14]      */
-               unsigned long perr_v_dac : 1;           /* [47]         */
-               unsigned long perr_v_mwin : 1;          /* [48]         */
-               unsigned long perr_v_rsvd1 : 3;         /* [51:49]      */
-               unsigned long perr_v_cmd : 4;           /* [55:52]      */
-               unsigned long perr_v_rsvd2 : 8;         /* [63:56]      */
-       } perr_r_bits;
-       unsigned int perr_l_whole[2];
-       unsigned long perr_q_whole;
-};
-
-/*
- * AGPERROR / AGPERREN / AGPERRSET
- */
-union TPAchipAGPERR {
-       struct {
-               unsigned agperr_v_lost : 1;             /* [0]          */
-               unsigned agperr_v_lpqfull : 1;          /* [1]          */
-               unsigned apgerr_v_hpqfull : 1;          /* [2]          */
-               unsigned agperr_v_rescmd : 1;           /* [3]          */
-               unsigned agperr_v_ipte : 1;             /* [4]          */
-               unsigned agperr_v_ptp : 1;              /* [5]          */
-               unsigned agperr_v_nowindow : 1;         /* [6]          */
-               unsigned agperr_v_rsvd0 : 8;            /* [14:7]       */
-               unsigned agperr_v_addr : 32;            /* [46:15]      */
-               unsigned agperr_v_rsvd1 : 1;            /* [47]         */
-               unsigned agperr_v_dac : 1;              /* [48]         */
-               unsigned agperr_v_mwin : 1;             /* [49]         */
-               unsigned agperr_v_cmd : 3;              /* [52:50]      */
-               unsigned agperr_v_length : 6;           /* [58:53]      */
-               unsigned agperr_v_fence : 1;            /* [59]         */
-               unsigned agperr_v_rsvd2 : 4;            /* [63:60]      */
-       } agperr_r_bits;
-       unsigned int agperr_l_whole[2];
-       unsigned long agperr_q_whole;
-};
-/*
- * Memory spaces:
- * Hose numbers are assigned as follows:
- *             0 - pachip 0 / G Port
- *             1 - pachip 1 / G Port
- *             2 - pachip 0 / A Port
- *             3 - pachip 1 / A Port
- */
-#define TITAN_HOSE_SHIFT       (33) 
-#define TITAN_HOSE(h)          (((unsigned long)(h)) << TITAN_HOSE_SHIFT)
-#define TITAN_BASE             (IDENT_ADDR + TI_BIAS)
-#define TITAN_MEM(h)           (TITAN_BASE+TITAN_HOSE(h)+0x000000000UL)
-#define _TITAN_IACK_SC(h)      (TITAN_BASE+TITAN_HOSE(h)+0x1F8000000UL)
-#define TITAN_IO(h)            (TITAN_BASE+TITAN_HOSE(h)+0x1FC000000UL)
-#define TITAN_CONF(h)          (TITAN_BASE+TITAN_HOSE(h)+0x1FE000000UL)
-
-#define TITAN_HOSE_MASK                TITAN_HOSE(3)
-#define TITAN_IACK_SC          _TITAN_IACK_SC(0) /* hack! */
-
-/* 
- * The canonical non-remaped I/O and MEM addresses have these values
- * subtracted out.  This is arranged so that folks manipulating ISA
- * devices can use their familiar numbers and have them map to bus 0.
- */
-
-#define TITAN_IO_BIAS          TITAN_IO(0)
-#define TITAN_MEM_BIAS         TITAN_MEM(0)
-
-/* The IO address space is larger than 0xffff */
-#define TITAN_IO_SPACE         (TITAN_CONF(0) - TITAN_IO(0))
-
-/* TIG Space */
-#define TITAN_TIG_SPACE                (TITAN_BASE + 0x100000000UL)
-
-/* Offset between ram physical addresses and pci64 DAC bus addresses.  */
-/* ??? Just a guess.  Ought to confirm it hasn't been moved.  */
-#define TITAN_DAC_OFFSET       (1UL << 40)
-
-/*
- * Data structure for handling TITAN machine checks:
- */
-#define SCB_Q_SYSERR   0x620
-#define SCB_Q_PROCERR  0x630
-#define SCB_Q_SYSMCHK  0x660
-#define SCB_Q_PROCMCHK 0x670
-#define SCB_Q_SYSEVENT 0x680   /* environmental / system management */
-struct el_TITAN_sysdata_mcheck {
-       u64 summary;    /* 0x00 */
-       u64 c_dirx;     /* 0x08 */
-       u64 c_misc;     /* 0x10 */
-       u64 p0_serror;  /* 0x18 */
-       u64 p0_gperror; /* 0x20 */
-       u64 p0_aperror; /* 0x28 */
-       u64 p0_agperror;/* 0x30 */
-       u64 p1_serror;  /* 0x38 */
-       u64 p1_gperror; /* 0x40 */
-       u64 p1_aperror; /* 0x48 */
-       u64 p1_agperror;/* 0x50 */
-};
-
-/*
- * System area for a privateer 680 environmental/system management mcheck 
- */
-struct el_PRIVATEER_envdata_mcheck {
-       u64 summary;    /* 0x00 */
-       u64 c_dirx;     /* 0x08 */
-       u64 smir;       /* 0x10 */
-       u64 cpuir;      /* 0x18 */
-       u64 psir;       /* 0x20 */
-       u64 fault;      /* 0x28 */
-       u64 sys_doors;  /* 0x30 */
-       u64 temp_warn;  /* 0x38 */
-       u64 fan_ctrl;   /* 0x40 */
-       u64 code;       /* 0x48 */
-       u64 reserved;   /* 0x50 */
-};
-
-#ifdef __KERNEL__
-
-#ifndef __EXTERN_INLINE
-#define __EXTERN_INLINE extern inline
-#define __IO_EXTERN_INLINE
-#endif
-
-/*
- * I/O functions:
- *
- * TITAN, a 21??? PCI/memory support chipset for the EV6 (21264)
- * can only use linear accesses to get at PCI/AGP memory and I/O spaces.
- */
-
-/*
- * Memory functions.  all accesses are done through linear space.
- */
-extern void __iomem *titan_ioportmap(unsigned long addr);
-extern void __iomem *titan_ioremap(unsigned long addr, unsigned long size);
-extern void titan_iounmap(volatile void __iomem *addr);
-
-__EXTERN_INLINE int titan_is_ioaddr(unsigned long addr)
-{
-       return addr >= TITAN_BASE;
-}
-
-extern int titan_is_mmio(const volatile void __iomem *addr);
-
-#undef __IO_PREFIX
-#define __IO_PREFIX            titan
-#define titan_trivial_rw_bw    1
-#define titan_trivial_rw_lq    1
-#define titan_trivial_io_bw    1
-#define titan_trivial_io_lq    1
-#define titan_trivial_iounmap  0
-#include <asm/io_trivial.h>
-
-#ifdef __IO_EXTERN_INLINE
-#undef __EXTERN_INLINE
-#undef __IO_EXTERN_INLINE
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_TITAN__H__ */
diff --git a/include/asm-alpha/core_tsunami.h b/include/asm-alpha/core_tsunami.h
deleted file mode 100644 (file)
index 58d4fe4..0000000
+++ /dev/null
@@ -1,335 +0,0 @@
-#ifndef __ALPHA_TSUNAMI__H__
-#define __ALPHA_TSUNAMI__H__
-
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <asm/compiler.h>
-
-/*
- * TSUNAMI/TYPHOON are the internal names for the core logic chipset which
- * provides memory controller and PCI access for the 21264 based systems.
- *
- * This file is based on:
- *
- * Tsunami System Programmers Manual
- * Preliminary, Chapters 2-5
- *
- */
-
-/* XXX: Do we need to conditionalize on this?  */
-#ifdef USE_48_BIT_KSEG
-#define TS_BIAS 0x80000000000UL
-#else
-#define TS_BIAS 0x10000000000UL
-#endif
-
-/*
- * CChip, DChip, and PChip registers
- */
-
-typedef struct {
-       volatile unsigned long csr __attribute__((aligned(64)));
-} tsunami_64;
-
-typedef struct {
-       tsunami_64      csc;
-       tsunami_64      mtr;
-       tsunami_64      misc;
-       tsunami_64      mpd;
-       tsunami_64      aar0;
-       tsunami_64      aar1;
-       tsunami_64      aar2;
-       tsunami_64      aar3;
-       tsunami_64      dim0;
-       tsunami_64      dim1;
-       tsunami_64      dir0;
-       tsunami_64      dir1;
-       tsunami_64      drir;
-       tsunami_64      prben;
-       tsunami_64      iic;    /* a.k.a. iic0 */
-       tsunami_64      wdr;    /* a.k.a. iic1 */
-       tsunami_64      mpr0;
-       tsunami_64      mpr1;
-       tsunami_64      mpr2;
-       tsunami_64      mpr3;
-       tsunami_64      mctl;
-       tsunami_64      __pad1;
-       tsunami_64      ttr;
-       tsunami_64      tdr;
-       tsunami_64      dim2;
-       tsunami_64      dim3;
-       tsunami_64      dir2;
-       tsunami_64      dir3;
-       tsunami_64      iic2;
-       tsunami_64      iic3;
-} tsunami_cchip;
-
-typedef struct {
-       tsunami_64      dsc;
-       tsunami_64      str;
-       tsunami_64      drev;
-} tsunami_dchip;
-
-typedef struct {
-       tsunami_64      wsba[4];
-       tsunami_64      wsm[4];
-       tsunami_64      tba[4];
-       tsunami_64      pctl;
-       tsunami_64      plat;
-       tsunami_64      reserved;
-       tsunami_64      perror;
-       tsunami_64      perrmask;
-       tsunami_64      perrset;
-       tsunami_64      tlbiv;
-       tsunami_64      tlbia;
-       tsunami_64      pmonctl;
-       tsunami_64      pmoncnt;
-} tsunami_pchip;
-
-#define TSUNAMI_cchip  ((tsunami_cchip *)(IDENT_ADDR+TS_BIAS+0x1A0000000UL))
-#define TSUNAMI_dchip  ((tsunami_dchip *)(IDENT_ADDR+TS_BIAS+0x1B0000800UL))
-#define TSUNAMI_pchip0 ((tsunami_pchip *)(IDENT_ADDR+TS_BIAS+0x180000000UL))
-#define TSUNAMI_pchip1 ((tsunami_pchip *)(IDENT_ADDR+TS_BIAS+0x380000000UL))
-extern int TSUNAMI_bootcpu;
-
-/*
- * TSUNAMI Pchip Error register.
- */
-
-#define perror_m_lost 0x1
-#define perror_m_serr 0x2
-#define perror_m_perr 0x4
-#define perror_m_dcrto 0x8
-#define perror_m_sge 0x10
-#define perror_m_ape 0x20
-#define perror_m_ta 0x40
-#define perror_m_rdpe 0x80
-#define perror_m_nds 0x100
-#define perror_m_rto 0x200
-#define perror_m_uecc 0x400
-#define perror_m_cre 0x800
-#define perror_m_addrl 0xFFFFFFFF0000UL
-#define perror_m_addrh 0x7000000000000UL
-#define perror_m_cmd 0xF0000000000000UL
-#define perror_m_syn 0xFF00000000000000UL
-union TPchipPERROR {   
-       struct  {
-               unsigned int perror_v_lost : 1;
-               unsigned perror_v_serr : 1;
-               unsigned perror_v_perr : 1;
-               unsigned perror_v_dcrto : 1;
-               unsigned perror_v_sge : 1;
-               unsigned perror_v_ape : 1;
-               unsigned perror_v_ta : 1;
-               unsigned perror_v_rdpe : 1;
-               unsigned perror_v_nds : 1;
-               unsigned perror_v_rto : 1;
-               unsigned perror_v_uecc : 1;
-               unsigned perror_v_cre : 1;                 
-               unsigned perror_v_rsvd1 : 4;
-               unsigned perror_v_addrl : 32;
-               unsigned perror_v_addrh : 3;
-               unsigned perror_v_rsvd2 : 1;
-               unsigned perror_v_cmd : 4;
-               unsigned perror_v_syn : 8;
-       } perror_r_bits;
-       int perror_q_whole [2];
-};                       
-
-/*
- * TSUNAMI Pchip Window Space Base Address register.
- */
-#define wsba_m_ena 0x1                
-#define wsba_m_sg 0x2
-#define wsba_m_ptp 0x4
-#define wsba_m_addr 0xFFF00000  
-#define wmask_k_sz1gb 0x3FF00000                   
-union TPchipWSBA {
-       struct  {
-               unsigned wsba_v_ena : 1;
-               unsigned wsba_v_sg : 1;
-               unsigned wsba_v_ptp : 1;
-               unsigned wsba_v_rsvd1 : 17;
-               unsigned wsba_v_addr : 12;
-               unsigned wsba_v_rsvd2 : 32;
-       } wsba_r_bits;
-       int wsba_q_whole [2];
-};
-
-/*
- * TSUNAMI Pchip Control Register
- */
-#define pctl_m_fdsc 0x1
-#define pctl_m_fbtb 0x2
-#define pctl_m_thdis 0x4
-#define pctl_m_chaindis 0x8
-#define pctl_m_tgtlat 0x10
-#define pctl_m_hole 0x20
-#define pctl_m_mwin 0x40
-#define pctl_m_arbena 0x80
-#define pctl_m_prigrp 0x7F00
-#define pctl_m_ppri 0x8000
-#define pctl_m_rsvd1 0x30000
-#define pctl_m_eccen 0x40000
-#define pctl_m_padm 0x80000
-#define pctl_m_cdqmax 0xF00000
-#define pctl_m_rev 0xFF000000
-#define pctl_m_crqmax 0xF00000000UL
-#define pctl_m_ptpmax 0xF000000000UL
-#define pctl_m_pclkx 0x30000000000UL
-#define pctl_m_fdsdis 0x40000000000UL
-#define pctl_m_fdwdis 0x80000000000UL
-#define pctl_m_ptevrfy 0x100000000000UL
-#define pctl_m_rpp 0x200000000000UL
-#define pctl_m_pid 0xC00000000000UL
-#define pctl_m_rsvd2 0xFFFF000000000000UL
-
-union TPchipPCTL {
-       struct {
-               unsigned pctl_v_fdsc : 1;
-               unsigned pctl_v_fbtb : 1;
-               unsigned pctl_v_thdis : 1;
-               unsigned pctl_v_chaindis : 1;
-               unsigned pctl_v_tgtlat : 1;
-               unsigned pctl_v_hole : 1;
-               unsigned pctl_v_mwin : 1;
-               unsigned pctl_v_arbena : 1;
-               unsigned pctl_v_prigrp : 7;
-               unsigned pctl_v_ppri : 1;
-               unsigned pctl_v_rsvd1 : 2;
-               unsigned pctl_v_eccen : 1;
-               unsigned pctl_v_padm : 1;
-               unsigned pctl_v_cdqmax : 4;
-               unsigned pctl_v_rev : 8;
-               unsigned pctl_v_crqmax : 4;
-               unsigned pctl_v_ptpmax : 4;
-               unsigned pctl_v_pclkx : 2;
-               unsigned pctl_v_fdsdis : 1;
-               unsigned pctl_v_fdwdis : 1;
-               unsigned pctl_v_ptevrfy : 1;
-               unsigned pctl_v_rpp : 1;
-               unsigned pctl_v_pid : 2;
-               unsigned pctl_v_rsvd2 : 16;
-       } pctl_r_bits;
-       int pctl_q_whole [2];
-};
-
-/*
- * TSUNAMI Pchip Error Mask Register.
- */
-#define perrmask_m_lost 0x1
-#define perrmask_m_serr 0x2
-#define perrmask_m_perr 0x4
-#define perrmask_m_dcrto 0x8
-#define perrmask_m_sge 0x10
-#define perrmask_m_ape 0x20
-#define perrmask_m_ta 0x40
-#define perrmask_m_rdpe 0x80
-#define perrmask_m_nds 0x100
-#define perrmask_m_rto 0x200
-#define perrmask_m_uecc 0x400
-#define perrmask_m_cre 0x800
-#define perrmask_m_rsvd 0xFFFFFFFFFFFFF000UL
-union TPchipPERRMASK {   
-       struct  {
-               unsigned int perrmask_v_lost : 1;
-               unsigned perrmask_v_serr : 1;
-               unsigned perrmask_v_perr : 1;
-               unsigned perrmask_v_dcrto : 1;
-               unsigned perrmask_v_sge : 1;
-               unsigned perrmask_v_ape : 1;
-               unsigned perrmask_v_ta : 1;
-               unsigned perrmask_v_rdpe : 1;
-               unsigned perrmask_v_nds : 1;
-               unsigned perrmask_v_rto : 1;
-               unsigned perrmask_v_uecc : 1;
-               unsigned perrmask_v_cre : 1;                 
-               unsigned perrmask_v_rsvd1 : 20;
-               unsigned perrmask_v_rsvd2 : 32;
-       } perrmask_r_bits;
-       int perrmask_q_whole [2];
-};                       
-
-/*
- * Memory spaces:
- */
-#define TSUNAMI_HOSE(h)                (((unsigned long)(h)) << 33)
-#define TSUNAMI_BASE           (IDENT_ADDR + TS_BIAS)
-
-#define TSUNAMI_MEM(h)         (TSUNAMI_BASE+TSUNAMI_HOSE(h) + 0x000000000UL)
-#define _TSUNAMI_IACK_SC(h)    (TSUNAMI_BASE+TSUNAMI_HOSE(h) + 0x1F8000000UL)
-#define TSUNAMI_IO(h)          (TSUNAMI_BASE+TSUNAMI_HOSE(h) + 0x1FC000000UL)
-#define TSUNAMI_CONF(h)                (TSUNAMI_BASE+TSUNAMI_HOSE(h) + 0x1FE000000UL)
-
-#define TSUNAMI_IACK_SC                _TSUNAMI_IACK_SC(0) /* hack! */
-
-
-/* 
- * The canonical non-remaped I/O and MEM addresses have these values
- * subtracted out.  This is arranged so that folks manipulating ISA
- * devices can use their familiar numbers and have them map to bus 0.
- */
-
-#define TSUNAMI_IO_BIAS          TSUNAMI_IO(0)
-#define TSUNAMI_MEM_BIAS         TSUNAMI_MEM(0)
-
-/* The IO address space is larger than 0xffff */
-#define TSUNAMI_IO_SPACE       (TSUNAMI_CONF(0) - TSUNAMI_IO(0))
-
-/* Offset between ram physical addresses and pci64 DAC bus addresses.  */
-#define TSUNAMI_DAC_OFFSET     (1UL << 40)
-
-/*
- * Data structure for handling TSUNAMI machine checks:
- */
-struct el_TSUNAMI_sysdata_mcheck {
-};
-
-
-#ifdef __KERNEL__
-
-#ifndef __EXTERN_INLINE
-#define __EXTERN_INLINE extern inline
-#define __IO_EXTERN_INLINE
-#endif
-
-/*
- * I/O functions:
- *
- * TSUNAMI, the 21??? PCI/memory support chipset for the EV6 (21264)
- * can only use linear accesses to get at PCI memory and I/O spaces.
- */
-
-/*
- * Memory functions.  all accesses are done through linear space.
- */
-extern void __iomem *tsunami_ioportmap(unsigned long addr);
-extern void __iomem *tsunami_ioremap(unsigned long addr, unsigned long size);
-__EXTERN_INLINE int tsunami_is_ioaddr(unsigned long addr)
-{
-       return addr >= TSUNAMI_BASE;
-}
-
-__EXTERN_INLINE int tsunami_is_mmio(const volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       return (addr & 0x100000000UL) == 0;
-}
-
-#undef __IO_PREFIX
-#define __IO_PREFIX            tsunami
-#define tsunami_trivial_rw_bw  1
-#define tsunami_trivial_rw_lq  1
-#define tsunami_trivial_io_bw  1
-#define tsunami_trivial_io_lq  1
-#define tsunami_trivial_iounmap        1
-#include <asm/io_trivial.h>
-
-#ifdef __IO_EXTERN_INLINE
-#undef __EXTERN_INLINE
-#undef __IO_EXTERN_INLINE
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_TSUNAMI__H__ */
diff --git a/include/asm-alpha/core_wildfire.h b/include/asm-alpha/core_wildfire.h
deleted file mode 100644 (file)
index cd562f5..0000000
+++ /dev/null
@@ -1,318 +0,0 @@
-#ifndef __ALPHA_WILDFIRE__H__
-#define __ALPHA_WILDFIRE__H__
-
-#include <linux/types.h>
-#include <asm/compiler.h>
-
-#define WILDFIRE_MAX_QBB       8       /* more than 8 requires other mods */
-#define WILDFIRE_PCA_PER_QBB   4
-#define WILDFIRE_IRQ_PER_PCA   64
-
-#define WILDFIRE_NR_IRQS \
-  (WILDFIRE_MAX_QBB * WILDFIRE_PCA_PER_QBB * WILDFIRE_IRQ_PER_PCA)
-
-extern unsigned char wildfire_hard_qbb_map[WILDFIRE_MAX_QBB];
-extern unsigned char wildfire_soft_qbb_map[WILDFIRE_MAX_QBB];
-#define QBB_MAP_EMPTY  0xff
-
-extern unsigned long wildfire_hard_qbb_mask;
-extern unsigned long wildfire_soft_qbb_mask;
-extern unsigned long wildfire_gp_mask;
-extern unsigned long wildfire_hs_mask;
-extern unsigned long wildfire_iop_mask;
-extern unsigned long wildfire_ior_mask;
-extern unsigned long wildfire_pca_mask;
-extern unsigned long wildfire_cpu_mask;
-extern unsigned long wildfire_mem_mask;
-
-#define WILDFIRE_QBB_EXISTS(qbbno) (wildfire_soft_qbb_mask & (1 << (qbbno)))
-
-#define WILDFIRE_MEM_EXISTS(qbbno) (wildfire_mem_mask & (0xf << ((qbbno) << 2)))
-
-#define WILDFIRE_PCA_EXISTS(qbbno, pcano) \
-               (wildfire_pca_mask & (1 << (((qbbno) << 2) + (pcano))))
-
-typedef struct {
-       volatile unsigned long csr __attribute__((aligned(64)));
-} wildfire_64;
-
-typedef struct {
-       volatile unsigned long csr __attribute__((aligned(256)));
-} wildfire_256;
-
-typedef struct {
-       volatile unsigned long csr __attribute__((aligned(2048)));
-} wildfire_2k;
-
-typedef struct {
-       wildfire_64     qsd_whami;
-       wildfire_64     qsd_rev;
-       wildfire_64     qsd_port_present;
-       wildfire_64     qsd_port_active;
-       wildfire_64     qsd_fault_ena;
-       wildfire_64     qsd_cpu_int_ena;
-       wildfire_64     qsd_mem_config;
-       wildfire_64     qsd_err_sum;
-       wildfire_64     ce_sum[4];
-       wildfire_64     dev_init[4];
-       wildfire_64     it_int[4];
-       wildfire_64     ip_int[4];
-       wildfire_64     uce_sum[4];
-       wildfire_64     se_sum__non_dev_int[4];
-       wildfire_64     scratch[4];
-       wildfire_64     qsd_timer;
-       wildfire_64     qsd_diag;
-} wildfire_qsd;
-
-typedef struct {
-       wildfire_256    qsd_whami;
-       wildfire_256    __pad1;
-       wildfire_256    ce_sum;
-       wildfire_256    dev_init;
-       wildfire_256    it_int;
-       wildfire_256    ip_int;
-       wildfire_256    uce_sum;
-       wildfire_256    se_sum;
-} wildfire_fast_qsd;
-
-typedef struct {
-       wildfire_2k     qsa_qbb_id;
-       wildfire_2k     __pad1;
-       wildfire_2k     qsa_port_ena;
-       wildfire_2k     qsa_scratch;
-       wildfire_2k     qsa_config[5];
-       wildfire_2k     qsa_ref_int;
-       wildfire_2k     qsa_qbb_pop[2];
-       wildfire_2k     qsa_dtag_fc;
-       wildfire_2k     __pad2[3];
-       wildfire_2k     qsa_diag;
-       wildfire_2k     qsa_diag_lock[4];
-       wildfire_2k     __pad3[11];
-       wildfire_2k     qsa_cpu_err_sum;
-       wildfire_2k     qsa_misc_err_sum;
-       wildfire_2k     qsa_tmo_err_sum;
-       wildfire_2k     qsa_err_ena;
-       wildfire_2k     qsa_tmo_config;
-       wildfire_2k     qsa_ill_cmd_err_sum;
-       wildfire_2k     __pad4[26];
-       wildfire_2k     qsa_busy_mask;
-       wildfire_2k     qsa_arr_valid;
-       wildfire_2k     __pad5[2];
-       wildfire_2k     qsa_port_map[4];
-       wildfire_2k     qsa_arr_addr[8];
-       wildfire_2k     qsa_arr_mask[8];
-} wildfire_qsa;
-
-typedef struct {
-       wildfire_64     ioa_config;
-       wildfire_64     iod_config;
-       wildfire_64     iop_switch_credits;
-       wildfire_64     __pad1;
-       wildfire_64     iop_hose_credits;
-       wildfire_64     __pad2[11];
-       struct {
-               wildfire_64     __pad3;
-               wildfire_64     init;
-       } iop_hose[4];
-       wildfire_64     ioa_hose_0_ctrl;
-       wildfire_64     iod_hose_0_ctrl;
-       wildfire_64     ioa_hose_1_ctrl;
-       wildfire_64     iod_hose_1_ctrl;
-       wildfire_64     ioa_hose_2_ctrl;
-       wildfire_64     iod_hose_2_ctrl;
-       wildfire_64     ioa_hose_3_ctrl;
-       wildfire_64     iod_hose_3_ctrl;
-       struct {
-               wildfire_64     target;
-               wildfire_64     __pad4;
-       } iop_dev_int[4];
-
-       wildfire_64     iop_err_int_target;
-       wildfire_64     __pad5[7];
-       wildfire_64     iop_qbb_err_sum;
-       wildfire_64     __pad6;
-       wildfire_64     iop_qbb_se_sum;
-       wildfire_64     __pad7;
-       wildfire_64     ioa_err_sum;
-       wildfire_64     iod_err_sum;
-       wildfire_64     __pad8[4];
-       wildfire_64     ioa_diag_force_err;
-       wildfire_64     iod_diag_force_err;
-       wildfire_64     __pad9[4];
-       wildfire_64     iop_diag_send_err_int;
-       wildfire_64     __pad10[15];
-       wildfire_64     ioa_scratch;
-       wildfire_64     iod_scratch;
-} wildfire_iop;
-
-typedef struct {
-       wildfire_2k     gpa_qbb_map[4];
-       wildfire_2k     gpa_mem_pop_map;
-       wildfire_2k     gpa_scratch;
-       wildfire_2k     gpa_diag;
-       wildfire_2k     gpa_config_0;
-       wildfire_2k     __pad1;
-       wildfire_2k     gpa_init_id;
-       wildfire_2k     gpa_config_2;
-       /* not complete */
-} wildfire_gp;
-
-typedef struct {
-       wildfire_64     pca_what_am_i;
-       wildfire_64     pca_err_sum;
-       wildfire_64     pca_diag_force_err;
-       wildfire_64     pca_diag_send_err_int;
-       wildfire_64     pca_hose_credits;
-       wildfire_64     pca_scratch;
-       wildfire_64     pca_micro_addr;
-       wildfire_64     pca_micro_data;
-       wildfire_64     pca_pend_int;
-       wildfire_64     pca_sent_int;
-       wildfire_64     __pad1;
-       wildfire_64     pca_stdio_edge_level;
-       wildfire_64     __pad2[52];
-       struct {
-               wildfire_64     target;
-               wildfire_64     enable;
-       } pca_int[4];
-       wildfire_64     __pad3[56];
-       wildfire_64     pca_alt_sent_int[32];
-} wildfire_pca;
-
-typedef struct {
-       wildfire_64     ne_what_am_i;
-       /* not complete */
-} wildfire_ne;
-
-typedef struct {
-       wildfire_64     fe_what_am_i;
-       /* not complete */
-} wildfire_fe;
-
-typedef struct {
-       wildfire_64     pci_io_addr_ext;
-       wildfire_64     pci_ctrl;
-       wildfire_64     pci_err_sum;
-       wildfire_64     pci_err_addr;
-       wildfire_64     pci_stall_cnt;
-       wildfire_64     pci_iack_special;
-       wildfire_64     __pad1[2];
-       wildfire_64     pci_pend_int;
-       wildfire_64     pci_sent_int;
-       wildfire_64     __pad2[54];
-       struct {
-               wildfire_64     wbase;
-               wildfire_64     wmask;
-               wildfire_64     tbase;
-       } pci_window[4];
-       wildfire_64     pci_flush_tlb;
-       wildfire_64     pci_perf_mon;
-} wildfire_pci;
-
-#define WILDFIRE_ENTITY_SHIFT          18
-
-#define WILDFIRE_GP_ENTITY             (0x10UL << WILDFIRE_ENTITY_SHIFT)
-#define WILDFIRE_IOP_ENTITY            (0x08UL << WILDFIRE_ENTITY_SHIFT)
-#define WILDFIRE_QSA_ENTITY            (0x04UL << WILDFIRE_ENTITY_SHIFT)
-#define WILDFIRE_QSD_ENTITY_SLOW       (0x05UL << WILDFIRE_ENTITY_SHIFT)
-#define WILDFIRE_QSD_ENTITY_FAST       (0x01UL << WILDFIRE_ENTITY_SHIFT)
-
-#define WILDFIRE_PCA_ENTITY(pca)       ((0xc|(pca))<<WILDFIRE_ENTITY_SHIFT)
-
-#define WILDFIRE_BASE          (IDENT_ADDR | (1UL << 40))
-
-#define WILDFIRE_QBB_MASK      0x0fUL  /* for now, only 4 bits/16 QBBs */
-
-#define WILDFIRE_QBB(q)                ((~((long)(q)) & WILDFIRE_QBB_MASK) << 36)
-#define WILDFIRE_HOSE(h)       ((long)(h) << 33)
-
-#define WILDFIRE_QBB_IO(q)     (WILDFIRE_BASE | WILDFIRE_QBB(q))
-#define WILDFIRE_QBB_HOSE(q,h) (WILDFIRE_QBB_IO(q) | WILDFIRE_HOSE(h))
-
-#define WILDFIRE_MEM(q,h)      (WILDFIRE_QBB_HOSE(q,h) | 0x000000000UL)
-#define WILDFIRE_CONF(q,h)     (WILDFIRE_QBB_HOSE(q,h) | 0x1FE000000UL)
-#define WILDFIRE_IO(q,h)       (WILDFIRE_QBB_HOSE(q,h) | 0x1FF000000UL)
-
-#define WILDFIRE_qsd(q) \
- ((wildfire_qsd *)(WILDFIRE_QBB_IO(q)|WILDFIRE_QSD_ENTITY_SLOW|(((1UL<<13)-1)<<23)))
-
-#define WILDFIRE_fast_qsd() \
- ((wildfire_fast_qsd *)(WILDFIRE_QBB_IO(0)|WILDFIRE_QSD_ENTITY_FAST|(((1UL<<13)-1)<<23)))
-
-#define WILDFIRE_qsa(q) \
- ((wildfire_qsa *)(WILDFIRE_QBB_IO(q)|WILDFIRE_QSA_ENTITY|(((1UL<<13)-1)<<23)))
-
-#define WILDFIRE_iop(q) \
- ((wildfire_iop *)(WILDFIRE_QBB_IO(q)|WILDFIRE_IOP_ENTITY|(((1UL<<13)-1)<<23)))
-
-#define WILDFIRE_gp(q) \
- ((wildfire_gp *)(WILDFIRE_QBB_IO(q)|WILDFIRE_GP_ENTITY|(((1UL<<13)-1)<<23)))
-
-#define WILDFIRE_pca(q,pca) \
- ((wildfire_pca *)(WILDFIRE_QBB_IO(q)|WILDFIRE_PCA_ENTITY(pca)|(((1UL<<13)-1)<<23)))
-
-#define WILDFIRE_ne(q,pca) \
- ((wildfire_ne *)(WILDFIRE_QBB_IO(q)|WILDFIRE_PCA_ENTITY(pca)|(((1UL<<13)-1)<<23)|(1UL<<16)))
-
-#define WILDFIRE_fe(q,pca) \
- ((wildfire_fe *)(WILDFIRE_QBB_IO(q)|WILDFIRE_PCA_ENTITY(pca)|(((1UL<<13)-1)<<23)|(3UL<<15)))
-
-#define WILDFIRE_pci(q,h) \
- ((wildfire_pci *)(WILDFIRE_QBB_IO(q)|WILDFIRE_PCA_ENTITY(((h)&6)>>1)|((((h)&1)|2)<<16)|(((1UL<<13)-1)<<23)))
-
-#define WILDFIRE_IO_BIAS        WILDFIRE_IO(0,0)
-#define WILDFIRE_MEM_BIAS       WILDFIRE_MEM(0,0) /* ??? */
-
-/* The IO address space is larger than 0xffff */
-#define WILDFIRE_IO_SPACE      (8UL*1024*1024)
-
-#ifdef __KERNEL__
-
-#ifndef __EXTERN_INLINE
-#define __EXTERN_INLINE extern inline
-#define __IO_EXTERN_INLINE
-#endif
-
-/*
- * Memory functions.  all accesses are done through linear space.
- */
-
-__EXTERN_INLINE void __iomem *wildfire_ioportmap(unsigned long addr)
-{
-       return (void __iomem *)(addr + WILDFIRE_IO_BIAS);
-}
-
-__EXTERN_INLINE void __iomem *wildfire_ioremap(unsigned long addr, 
-                                              unsigned long size)
-{
-       return (void __iomem *)(addr + WILDFIRE_MEM_BIAS);
-}
-
-__EXTERN_INLINE int wildfire_is_ioaddr(unsigned long addr)
-{
-       return addr >= WILDFIRE_BASE;
-}
-
-__EXTERN_INLINE int wildfire_is_mmio(const volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long)xaddr;
-       return (addr & 0x100000000UL) == 0;
-}
-
-#undef __IO_PREFIX
-#define __IO_PREFIX                    wildfire
-#define wildfire_trivial_rw_bw         1
-#define wildfire_trivial_rw_lq         1
-#define wildfire_trivial_io_bw         1
-#define wildfire_trivial_io_lq         1
-#define wildfire_trivial_iounmap       1
-#include <asm/io_trivial.h>
-
-#ifdef __IO_EXTERN_INLINE
-#undef __EXTERN_INLINE
-#undef __IO_EXTERN_INLINE
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_WILDFIRE__H__ */
diff --git a/include/asm-alpha/cputime.h b/include/asm-alpha/cputime.h
deleted file mode 100644 (file)
index 19577fd..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef __ALPHA_CPUTIME_H
-#define __ALPHA_CPUTIME_H
-
-#include <asm-generic/cputime.h>
-
-#endif /* __ALPHA_CPUTIME_H */
diff --git a/include/asm-alpha/current.h b/include/asm-alpha/current.h
deleted file mode 100644 (file)
index 094d285..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef _ALPHA_CURRENT_H
-#define _ALPHA_CURRENT_H
-
-#include <linux/thread_info.h>
-
-#define get_current()  (current_thread_info()->task)
-#define current                get_current()
-
-#endif /* _ALPHA_CURRENT_H */
diff --git a/include/asm-alpha/delay.h b/include/asm-alpha/delay.h
deleted file mode 100644 (file)
index 2aa3f41..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef __ALPHA_DELAY_H
-#define __ALPHA_DELAY_H
-
-extern void __delay(int loops);
-extern void udelay(unsigned long usecs);
-
-extern void ndelay(unsigned long nsecs);
-#define ndelay ndelay
-
-#endif /* defined(__ALPHA_DELAY_H) */
diff --git a/include/asm-alpha/device.h b/include/asm-alpha/device.h
deleted file mode 100644 (file)
index d8f9872..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * Arch specific extensions to struct device
- *
- * This file is released under the GPLv2
- */
-#include <asm-generic/device.h>
-
diff --git a/include/asm-alpha/div64.h b/include/asm-alpha/div64.h
deleted file mode 100644 (file)
index 6cd978c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <asm-generic/div64.h>
diff --git a/include/asm-alpha/dma-mapping.h b/include/asm-alpha/dma-mapping.h
deleted file mode 100644 (file)
index a5801ae..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef _ALPHA_DMA_MAPPING_H
-#define _ALPHA_DMA_MAPPING_H
-
-
-#ifdef CONFIG_PCI
-
-#include <linux/pci.h>
-
-#define dma_map_single(dev, va, size, dir)             \
-               pci_map_single(alpha_gendev_to_pci(dev), va, size, dir)
-#define dma_unmap_single(dev, addr, size, dir)         \
-               pci_unmap_single(alpha_gendev_to_pci(dev), addr, size, dir)
-#define dma_alloc_coherent(dev, size, addr, gfp)       \
-             __pci_alloc_consistent(alpha_gendev_to_pci(dev), size, addr, gfp)
-#define dma_free_coherent(dev, size, va, addr)         \
-               pci_free_consistent(alpha_gendev_to_pci(dev), size, va, addr)
-#define dma_map_page(dev, page, off, size, dir)                \
-               pci_map_page(alpha_gendev_to_pci(dev), page, off, size, dir)
-#define dma_unmap_page(dev, addr, size, dir)           \
-               pci_unmap_page(alpha_gendev_to_pci(dev), addr, size, dir)
-#define dma_map_sg(dev, sg, nents, dir)                        \
-               pci_map_sg(alpha_gendev_to_pci(dev), sg, nents, dir)
-#define dma_unmap_sg(dev, sg, nents, dir)              \
-               pci_unmap_sg(alpha_gendev_to_pci(dev), sg, nents, dir)
-#define dma_supported(dev, mask)                       \
-               pci_dma_supported(alpha_gendev_to_pci(dev), mask)
-#define dma_mapping_error(dev, addr)                           \
-               pci_dma_mapping_error(alpha_gendev_to_pci(dev), addr)
-
-#else  /* no PCI - no IOMMU. */
-
-struct scatterlist;
-void *dma_alloc_coherent(struct device *dev, size_t size,
-                        dma_addr_t *dma_handle, gfp_t gfp);
-int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
-              enum dma_data_direction direction);
-
-#define dma_free_coherent(dev, size, va, addr)         \
-               free_pages((unsigned long)va, get_order(size))
-#define dma_supported(dev, mask)               (mask < 0x00ffffffUL ? 0 : 1)
-#define dma_map_single(dev, va, size, dir)     virt_to_phys(va)
-#define dma_map_page(dev, page, off, size, dir)        (page_to_pa(page) + off)
-
-#define dma_unmap_single(dev, addr, size, dir) ((void)0)
-#define dma_unmap_page(dev, addr, size, dir)   ((void)0)
-#define dma_unmap_sg(dev, sg, nents, dir)      ((void)0)
-
-#define dma_mapping_error(dev, addr)  (0)
-
-#endif /* !CONFIG_PCI */
-
-#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)
-
-int dma_set_mask(struct device *dev, u64 mask);
-
-#define dma_sync_single_for_cpu(dev, addr, size, dir)    ((void)0)
-#define dma_sync_single_for_device(dev, addr, size, dir)  ((void)0)
-#define dma_sync_single_range(dev, addr, off, size, dir)  ((void)0)
-#define dma_sync_sg_for_cpu(dev, sg, nents, dir)         ((void)0)
-#define dma_sync_sg_for_device(dev, sg, nents, dir)      ((void)0)
-#define dma_cache_sync(dev, va, size, dir)               ((void)0)
-#define dma_sync_single_range_for_cpu(dev, addr, offset, size, dir)    ((void)0)
-#define dma_sync_single_range_for_device(dev, addr, offset, size, dir) ((void)0)
-
-#define dma_get_cache_alignment()                        L1_CACHE_BYTES
-
-#endif /* _ALPHA_DMA_MAPPING_H */
diff --git a/include/asm-alpha/dma.h b/include/asm-alpha/dma.h
deleted file mode 100644 (file)
index 87cfdbd..0000000
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * include/asm-alpha/dma.h
- *
- * This is essentially the same as the i386 DMA stuff, as the AlphaPCs
- * use ISA-compatible dma.  The only extension is support for high-page
- * registers that allow to set the top 8 bits of a 32-bit DMA address.
- * This register should be written last when setting up a DMA address
- * as this will also enable DMA across 64 KB boundaries.
- */
-
-/* $Id: dma.h,v 1.7 1992/12/14 00:29:34 root Exp root $
- * linux/include/asm/dma.h: Defines for using and allocating dma channels.
- * Written by Hennus Bergman, 1992.
- * High DMA channel support & info by Hannu Savolainen
- * and John Boyd, Nov. 1992.
- */
-
-#ifndef _ASM_DMA_H
-#define _ASM_DMA_H
-
-#include <linux/spinlock.h>
-#include <asm/io.h>
-
-#define dma_outb       outb
-#define dma_inb                inb
-
-/*
- * NOTES about DMA transfers:
- *
- *  controller 1: channels 0-3, byte operations, ports 00-1F
- *  controller 2: channels 4-7, word operations, ports C0-DF
- *
- *  - ALL registers are 8 bits only, regardless of transfer size
- *  - channel 4 is not used - cascades 1 into 2.
- *  - channels 0-3 are byte - addresses/counts are for physical bytes
- *  - channels 5-7 are word - addresses/counts are for physical words
- *  - transfers must not cross physical 64K (0-3) or 128K (5-7) boundaries
- *  - transfer count loaded to registers is 1 less than actual count
- *  - controller 2 offsets are all even (2x offsets for controller 1)
- *  - page registers for 5-7 don't use data bit 0, represent 128K pages
- *  - page registers for 0-3 use bit 0, represent 64K pages
- *
- * DMA transfers are limited to the lower 16MB of _physical_ memory.  
- * Note that addresses loaded into registers must be _physical_ addresses,
- * not logical addresses (which may differ if paging is active).
- *
- *  Address mapping for channels 0-3:
- *
- *   A23 ... A16 A15 ... A8  A7 ... A0    (Physical addresses)
- *    |  ...  |   |  ... |   |  ... |
- *    |  ...  |   |  ... |   |  ... |
- *    |  ...  |   |  ... |   |  ... |
- *   P7  ...  P0  A7 ... A0  A7 ... A0   
- * |    Page    | Addr MSB | Addr LSB |   (DMA registers)
- *
- *  Address mapping for channels 5-7:
- *
- *   A23 ... A17 A16 A15 ... A9 A8 A7 ... A1 A0    (Physical addresses)
- *    |  ...  |   \   \   ... \  \  \  ... \  \
- *    |  ...  |    \   \   ... \  \  \  ... \  (not used)
- *    |  ...  |     \   \   ... \  \  \  ... \
- *   P7  ...  P1 (0) A7 A6  ... A0 A7 A6 ... A0   
- * |      Page      |  Addr MSB   |  Addr LSB  |   (DMA registers)
- *
- * Again, channels 5-7 transfer _physical_ words (16 bits), so addresses
- * and counts _must_ be word-aligned (the lowest address bit is _ignored_ at
- * the hardware level, so odd-byte transfers aren't possible).
- *
- * Transfer count (_not # bytes_) is limited to 64K, represented as actual
- * count - 1 : 64K => 0xFFFF, 1 => 0x0000.  Thus, count is always 1 or more,
- * and up to 128K bytes may be transferred on channels 5-7 in one operation. 
- *
- */
-
-#define MAX_DMA_CHANNELS       8
-
-/*
-  ISA DMA limitations on Alpha platforms,
-
-  These may be due to SIO (PCI<->ISA bridge) chipset limitation, or
-  just a wiring limit.
-*/
-
-/* The maximum address for ISA DMA transfer on Alpha XL, due to an
-   hardware SIO limitation, is 64MB.
-*/
-#define ALPHA_XL_MAX_ISA_DMA_ADDRESS           0x04000000UL
-
-/* The maximum address for ISA DMA transfer on RUFFIAN,
-   due to an hardware SIO limitation, is 16MB.
-*/
-#define ALPHA_RUFFIAN_MAX_ISA_DMA_ADDRESS      0x01000000UL
-
-/* The maximum address for ISA DMA transfer on SABLE, and some ALCORs,
-   due to an hardware SIO chip limitation, is 2GB.
-*/
-#define ALPHA_SABLE_MAX_ISA_DMA_ADDRESS                0x80000000UL
-#define ALPHA_ALCOR_MAX_ISA_DMA_ADDRESS                0x80000000UL
-
-/*
-  Maximum address for all the others is the complete 32-bit bus
-  address space.
-*/
-#define ALPHA_MAX_ISA_DMA_ADDRESS              0x100000000UL
-
-#ifdef CONFIG_ALPHA_GENERIC
-# define MAX_ISA_DMA_ADDRESS           (alpha_mv.max_isa_dma_address)
-#else
-# if defined(CONFIG_ALPHA_XL)
-#  define MAX_ISA_DMA_ADDRESS          ALPHA_XL_MAX_ISA_DMA_ADDRESS
-# elif defined(CONFIG_ALPHA_RUFFIAN)
-#  define MAX_ISA_DMA_ADDRESS          ALPHA_RUFFIAN_MAX_ISA_DMA_ADDRESS
-# elif defined(CONFIG_ALPHA_SABLE)
-#  define MAX_ISA_DMA_ADDRESS          ALPHA_SABLE_MAX_ISA_DMA_ADDRESS
-# elif defined(CONFIG_ALPHA_ALCOR)
-#  define MAX_ISA_DMA_ADDRESS          ALPHA_ALCOR_MAX_ISA_DMA_ADDRESS
-# else
-#  define MAX_ISA_DMA_ADDRESS          ALPHA_MAX_ISA_DMA_ADDRESS
-# endif
-#endif
-
-/* If we have the iommu, we don't have any address limitations on DMA.
-   Otherwise (Nautilus, RX164), we have to have 0-16 Mb DMA zone
-   like i386. */
-#define MAX_DMA_ADDRESS                (alpha_mv.mv_pci_tbi ?  \
-                                ~0UL : IDENT_ADDR + 0x01000000)
-
-/* 8237 DMA controllers */
-#define IO_DMA1_BASE   0x00    /* 8 bit slave DMA, channels 0..3 */
-#define IO_DMA2_BASE   0xC0    /* 16 bit master DMA, ch 4(=slave input)..7 */
-
-/* DMA controller registers */
-#define DMA1_CMD_REG           0x08    /* command register (w) */
-#define DMA1_STAT_REG          0x08    /* status register (r) */
-#define DMA1_REQ_REG            0x09    /* request register (w) */
-#define DMA1_MASK_REG          0x0A    /* single-channel mask (w) */
-#define DMA1_MODE_REG          0x0B    /* mode register (w) */
-#define DMA1_CLEAR_FF_REG      0x0C    /* clear pointer flip-flop (w) */
-#define DMA1_TEMP_REG           0x0D    /* Temporary Register (r) */
-#define DMA1_RESET_REG         0x0D    /* Master Clear (w) */
-#define DMA1_CLR_MASK_REG       0x0E    /* Clear Mask */
-#define DMA1_MASK_ALL_REG       0x0F    /* all-channels mask (w) */
-#define DMA1_EXT_MODE_REG      (0x400 | DMA1_MODE_REG)
-
-#define DMA2_CMD_REG           0xD0    /* command register (w) */
-#define DMA2_STAT_REG          0xD0    /* status register (r) */
-#define DMA2_REQ_REG            0xD2    /* request register (w) */
-#define DMA2_MASK_REG          0xD4    /* single-channel mask (w) */
-#define DMA2_MODE_REG          0xD6    /* mode register (w) */
-#define DMA2_CLEAR_FF_REG      0xD8    /* clear pointer flip-flop (w) */
-#define DMA2_TEMP_REG           0xDA    /* Temporary Register (r) */
-#define DMA2_RESET_REG         0xDA    /* Master Clear (w) */
-#define DMA2_CLR_MASK_REG       0xDC    /* Clear Mask */
-#define DMA2_MASK_ALL_REG       0xDE    /* all-channels mask (w) */
-#define DMA2_EXT_MODE_REG      (0x400 | DMA2_MODE_REG)
-
-#define DMA_ADDR_0              0x00    /* DMA address registers */
-#define DMA_ADDR_1              0x02
-#define DMA_ADDR_2              0x04
-#define DMA_ADDR_3              0x06
-#define DMA_ADDR_4              0xC0
-#define DMA_ADDR_5              0xC4
-#define DMA_ADDR_6              0xC8
-#define DMA_ADDR_7              0xCC
-
-#define DMA_CNT_0               0x01    /* DMA count registers */
-#define DMA_CNT_1               0x03
-#define DMA_CNT_2               0x05
-#define DMA_CNT_3               0x07
-#define DMA_CNT_4               0xC2
-#define DMA_CNT_5               0xC6
-#define DMA_CNT_6               0xCA
-#define DMA_CNT_7               0xCE
-
-#define DMA_PAGE_0              0x87    /* DMA page registers */
-#define DMA_PAGE_1              0x83
-#define DMA_PAGE_2              0x81
-#define DMA_PAGE_3              0x82
-#define DMA_PAGE_5              0x8B
-#define DMA_PAGE_6              0x89
-#define DMA_PAGE_7              0x8A
-
-#define DMA_HIPAGE_0           (0x400 | DMA_PAGE_0)
-#define DMA_HIPAGE_1           (0x400 | DMA_PAGE_1)
-#define DMA_HIPAGE_2           (0x400 | DMA_PAGE_2)
-#define DMA_HIPAGE_3           (0x400 | DMA_PAGE_3)
-#define DMA_HIPAGE_4           (0x400 | DMA_PAGE_4)
-#define DMA_HIPAGE_5           (0x400 | DMA_PAGE_5)
-#define DMA_HIPAGE_6           (0x400 | DMA_PAGE_6)
-#define DMA_HIPAGE_7           (0x400 | DMA_PAGE_7)
-
-#define DMA_MODE_READ  0x44    /* I/O to memory, no autoinit, increment, single mode */
-#define DMA_MODE_WRITE 0x48    /* memory to I/O, no autoinit, increment, single mode */
-#define DMA_MODE_CASCADE 0xC0   /* pass thru DREQ->HRQ, DACK<-HLDA only */
-
-#define DMA_AUTOINIT   0x10
-
-extern spinlock_t  dma_spin_lock;
-
-static __inline__ unsigned long claim_dma_lock(void)
-{
-       unsigned long flags;
-       spin_lock_irqsave(&dma_spin_lock, flags);
-       return flags;
-}
-
-static __inline__ void release_dma_lock(unsigned long flags)
-{
-       spin_unlock_irqrestore(&dma_spin_lock, flags);
-}
-
-/* enable/disable a specific DMA channel */
-static __inline__ void enable_dma(unsigned int dmanr)
-{
-       if (dmanr<=3)
-               dma_outb(dmanr,  DMA1_MASK_REG);
-       else
-               dma_outb(dmanr & 3,  DMA2_MASK_REG);
-}
-
-static __inline__ void disable_dma(unsigned int dmanr)
-{
-       if (dmanr<=3)
-               dma_outb(dmanr | 4,  DMA1_MASK_REG);
-       else
-               dma_outb((dmanr & 3) | 4,  DMA2_MASK_REG);
-}
-
-/* Clear the 'DMA Pointer Flip Flop'.
- * Write 0 for LSB/MSB, 1 for MSB/LSB access.
- * Use this once to initialize the FF to a known state.
- * After that, keep track of it. :-)
- * --- In order to do that, the DMA routines below should ---
- * --- only be used while interrupts are disabled! ---
- */
-static __inline__ void clear_dma_ff(unsigned int dmanr)
-{
-       if (dmanr<=3)
-               dma_outb(0,  DMA1_CLEAR_FF_REG);
-       else
-               dma_outb(0,  DMA2_CLEAR_FF_REG);
-}
-
-/* set mode (above) for a specific DMA channel */
-static __inline__ void set_dma_mode(unsigned int dmanr, char mode)
-{
-       if (dmanr<=3)
-               dma_outb(mode | dmanr,  DMA1_MODE_REG);
-       else
-               dma_outb(mode | (dmanr&3),  DMA2_MODE_REG);
-}
-
-/* set extended mode for a specific DMA channel */
-static __inline__ void set_dma_ext_mode(unsigned int dmanr, char ext_mode)
-{
-       if (dmanr<=3)
-               dma_outb(ext_mode | dmanr,  DMA1_EXT_MODE_REG);
-       else
-               dma_outb(ext_mode | (dmanr&3),  DMA2_EXT_MODE_REG);
-}
-
-/* Set only the page register bits of the transfer address.
- * This is used for successive transfers when we know the contents of
- * the lower 16 bits of the DMA current address register.
- */
-static __inline__ void set_dma_page(unsigned int dmanr, unsigned int pagenr)
-{
-       switch(dmanr) {
-               case 0:
-                       dma_outb(pagenr, DMA_PAGE_0);
-                       dma_outb((pagenr >> 8), DMA_HIPAGE_0);
-                       break;
-               case 1:
-                       dma_outb(pagenr, DMA_PAGE_1);
-                       dma_outb((pagenr >> 8), DMA_HIPAGE_1);
-                       break;
-               case 2:
-                       dma_outb(pagenr, DMA_PAGE_2);
-                       dma_outb((pagenr >> 8), DMA_HIPAGE_2);
-                       break;
-               case 3:
-                       dma_outb(pagenr, DMA_PAGE_3);
-                       dma_outb((pagenr >> 8), DMA_HIPAGE_3);
-                       break;
-               case 5:
-                       dma_outb(pagenr & 0xfe, DMA_PAGE_5);
-                       dma_outb((pagenr >> 8), DMA_HIPAGE_5);
-                       break;
-               case 6:
-                       dma_outb(pagenr & 0xfe, DMA_PAGE_6);
-                       dma_outb((pagenr >> 8), DMA_HIPAGE_6);
-                       break;
-               case 7:
-                       dma_outb(pagenr & 0xfe, DMA_PAGE_7);
-                       dma_outb((pagenr >> 8), DMA_HIPAGE_7);
-                       break;
-       }
-}
-
-
-/* Set transfer address & page bits for specific DMA channel.
- * Assumes dma flipflop is clear.
- */
-static __inline__ void set_dma_addr(unsigned int dmanr, unsigned int a)
-{
-       if (dmanr <= 3)  {
-           dma_outb( a & 0xff, ((dmanr&3)<<1) + IO_DMA1_BASE );
-            dma_outb( (a>>8) & 0xff, ((dmanr&3)<<1) + IO_DMA1_BASE );
-       }  else  {
-           dma_outb( (a>>1) & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE );
-           dma_outb( (a>>9) & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE );
-       }
-       set_dma_page(dmanr, a>>16);     /* set hipage last to enable 32-bit mode */
-}
-
-
-/* Set transfer size (max 64k for DMA1..3, 128k for DMA5..7) for
- * a specific DMA channel.
- * You must ensure the parameters are valid.
- * NOTE: from a manual: "the number of transfers is one more
- * than the initial word count"! This is taken into account.
- * Assumes dma flip-flop is clear.
- * NOTE 2: "count" represents _bytes_ and must be even for channels 5-7.
- */
-static __inline__ void set_dma_count(unsigned int dmanr, unsigned int count)
-{
-        count--;
-       if (dmanr <= 3)  {
-           dma_outb( count & 0xff, ((dmanr&3)<<1) + 1 + IO_DMA1_BASE );
-           dma_outb( (count>>8) & 0xff, ((dmanr&3)<<1) + 1 + IO_DMA1_BASE );
-        } else {
-           dma_outb( (count>>1) & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE );
-           dma_outb( (count>>9) & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE );
-        }
-}
-
-
-/* Get DMA residue count. After a DMA transfer, this
- * should return zero. Reading this while a DMA transfer is
- * still in progress will return unpredictable results.
- * If called before the channel has been used, it may return 1.
- * Otherwise, it returns the number of _bytes_ left to transfer.
- *
- * Assumes DMA flip-flop is clear.
- */
-static __inline__ int get_dma_residue(unsigned int dmanr)
-{
-       unsigned int io_port = (dmanr<=3)? ((dmanr&3)<<1) + 1 + IO_DMA1_BASE
-                                        : ((dmanr&3)<<2) + 2 + IO_DMA2_BASE;
-
-       /* using short to get 16-bit wrap around */
-       unsigned short count;
-
-       count = 1 + dma_inb(io_port);
-       count += dma_inb(io_port) << 8;
-       
-       return (dmanr<=3)? count : (count<<1);
-}
-
-
-/* These are in kernel/dma.c: */
-extern int request_dma(unsigned int dmanr, const char * device_id);    /* reserve a DMA channel */
-extern void free_dma(unsigned int dmanr);      /* release it again */
-#define KERNEL_HAVE_CHECK_DMA
-extern int check_dma(unsigned int dmanr);
-
-/* From PCI */
-
-#ifdef CONFIG_PCI
-extern int isa_dma_bridge_buggy;
-#else
-#define isa_dma_bridge_buggy   (0)
-#endif
-
-
-#endif /* _ASM_DMA_H */
diff --git a/include/asm-alpha/elf.h b/include/asm-alpha/elf.h
deleted file mode 100644 (file)
index fc1002e..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-#ifndef __ASM_ALPHA_ELF_H
-#define __ASM_ALPHA_ELF_H
-
-#include <asm/auxvec.h>
-
-/* Special values for the st_other field in the symbol table.  */
-
-#define STO_ALPHA_NOPV         0x80
-#define STO_ALPHA_STD_GPLOAD   0x88
-
-/*
- * Alpha ELF relocation types
- */
-#define R_ALPHA_NONE            0       /* No reloc */
-#define R_ALPHA_REFLONG         1       /* Direct 32 bit */
-#define R_ALPHA_REFQUAD         2       /* Direct 64 bit */
-#define R_ALPHA_GPREL32         3       /* GP relative 32 bit */
-#define R_ALPHA_LITERAL         4       /* GP relative 16 bit w/optimization */
-#define R_ALPHA_LITUSE          5       /* Optimization hint for LITERAL */
-#define R_ALPHA_GPDISP          6       /* Add displacement to GP */
-#define R_ALPHA_BRADDR          7       /* PC+4 relative 23 bit shifted */
-#define R_ALPHA_HINT            8       /* PC+4 relative 16 bit shifted */
-#define R_ALPHA_SREL16          9       /* PC relative 16 bit */
-#define R_ALPHA_SREL32          10      /* PC relative 32 bit */
-#define R_ALPHA_SREL64          11      /* PC relative 64 bit */
-#define R_ALPHA_GPRELHIGH       17      /* GP relative 32 bit, high 16 bits */
-#define R_ALPHA_GPRELLOW        18      /* GP relative 32 bit, low 16 bits */
-#define R_ALPHA_GPREL16         19      /* GP relative 16 bit */
-#define R_ALPHA_COPY            24      /* Copy symbol at runtime */
-#define R_ALPHA_GLOB_DAT        25      /* Create GOT entry */
-#define R_ALPHA_JMP_SLOT        26      /* Create PLT entry */
-#define R_ALPHA_RELATIVE        27      /* Adjust by program base */
-#define R_ALPHA_BRSGP          28
-#define R_ALPHA_TLSGD           29
-#define R_ALPHA_TLS_LDM         30
-#define R_ALPHA_DTPMOD64        31
-#define R_ALPHA_GOTDTPREL       32
-#define R_ALPHA_DTPREL64        33
-#define R_ALPHA_DTPRELHI        34
-#define R_ALPHA_DTPRELLO        35
-#define R_ALPHA_DTPREL16        36
-#define R_ALPHA_GOTTPREL        37
-#define R_ALPHA_TPREL64         38
-#define R_ALPHA_TPRELHI         39
-#define R_ALPHA_TPRELLO         40
-#define R_ALPHA_TPREL16         41
-
-#define SHF_ALPHA_GPREL                0x10000000
-
-/* Legal values for e_flags field of Elf64_Ehdr.  */
-
-#define EF_ALPHA_32BIT         1       /* All addresses are below 2GB */
-
-/*
- * ELF register definitions..
- */
-
-/*
- * The OSF/1 version of <sys/procfs.h> makes gregset_t 46 entries long.
- * I have no idea why that is so.  For now, we just leave it at 33
- * (32 general regs + processor status word). 
- */
-#define ELF_NGREG      33
-#define ELF_NFPREG     32
-
-typedef unsigned long elf_greg_t;
-typedef elf_greg_t elf_gregset_t[ELF_NGREG];
-
-typedef double elf_fpreg_t;
-typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
-
-/*
- * This is used to ensure we don't load something for the wrong architecture.
- */
-#define elf_check_arch(x) ((x)->e_machine == EM_ALPHA)
-
-/*
- * These are used to set parameters in the core dumps.
- */
-#define ELF_CLASS      ELFCLASS64
-#define ELF_DATA       ELFDATA2LSB
-#define ELF_ARCH       EM_ALPHA
-
-#define USE_ELF_CORE_DUMP
-#define ELF_EXEC_PAGESIZE      8192
-
-/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
-   use of this is to invoke "./ld.so someprog" to test out a new version of
-   the loader.  We need to make sure that it is out of the way of the program
-   that it will "exec", and that there is sufficient room for the brk.  */
-
-#define ELF_ET_DYN_BASE                (TASK_UNMAPPED_BASE + 0x1000000)
-
-/* $0 is set by ld.so to a pointer to a function which might be 
-   registered using atexit.  This provides a mean for the dynamic
-   linker to call DT_FINI functions for shared libraries that have
-   been loaded before the code runs.
-
-   So that we can use the same startup file with static executables,
-   we start programs with a value of 0 to indicate that there is no
-   such function.  */
-
-#define ELF_PLAT_INIT(_r, load_addr)   _r->r0 = 0
-
-/* The registers are layed out in pt_regs for PAL and syscall
-   convenience.  Re-order them for the linear elf_gregset_t.  */
-
-struct pt_regs;
-struct thread_info;
-struct task_struct;
-extern void dump_elf_thread(elf_greg_t *dest, struct pt_regs *pt,
-                           struct thread_info *ti);
-#define ELF_CORE_COPY_REGS(DEST, REGS) \
-       dump_elf_thread(DEST, REGS, current_thread_info());
-
-/* Similar, but for a thread other than current.  */
-
-extern int dump_elf_task(elf_greg_t *dest, struct task_struct *task);
-#define ELF_CORE_COPY_TASK_REGS(TASK, DEST) \
-       dump_elf_task(*(DEST), TASK)
-
-/* Similar, but for the FP registers.  */
-
-extern int dump_elf_task_fp(elf_fpreg_t *dest, struct task_struct *task);
-#define ELF_CORE_COPY_FPREGS(TASK, DEST) \
-       dump_elf_task_fp(*(DEST), TASK)
-
-/* This yields a mask that user programs can use to figure out what
-   instruction set this CPU supports.  This is trivial on Alpha, 
-   but not so on other machines. */
-
-#define ELF_HWCAP  (~amask(-1))
-
-/* This yields a string that ld.so will use to load implementation
-   specific libraries for optimization.  This is more specific in
-   intent than poking at uname or /proc/cpuinfo.  */
-
-#define ELF_PLATFORM                           \
-({                                             \
-       enum implver_enum i_ = implver();       \
-       ( i_ == IMPLVER_EV4 ? "ev4"             \
-       : i_ == IMPLVER_EV5                     \
-         ? (amask(AMASK_BWX) ? "ev5" : "ev56") \
-       : amask (AMASK_CIX) ? "ev6" : "ev67");  \
-})
-
-#define SET_PERSONALITY(EX, IBCS2)                             \
-       set_personality(((EX).e_flags & EF_ALPHA_32BIT)         \
-          ? PER_LINUX_32BIT : (IBCS2) ? PER_SVR4 : PER_LINUX)
-
-extern int alpha_l1i_cacheshape;
-extern int alpha_l1d_cacheshape;
-extern int alpha_l2_cacheshape;
-extern int alpha_l3_cacheshape;
-
-/* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */
-#define ARCH_DLINFO                                            \
-  do {                                                         \
-    NEW_AUX_ENT(AT_L1I_CACHESHAPE, alpha_l1i_cacheshape);      \
-    NEW_AUX_ENT(AT_L1D_CACHESHAPE, alpha_l1d_cacheshape);      \
-    NEW_AUX_ENT(AT_L2_CACHESHAPE, alpha_l2_cacheshape);                \
-    NEW_AUX_ENT(AT_L3_CACHESHAPE, alpha_l3_cacheshape);                \
-  } while (0)
-
-#endif /* __ASM_ALPHA_ELF_H */
diff --git a/include/asm-alpha/emergency-restart.h b/include/asm-alpha/emergency-restart.h
deleted file mode 100644 (file)
index 108d8c4..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _ASM_EMERGENCY_RESTART_H
-#define _ASM_EMERGENCY_RESTART_H
-
-#include <asm-generic/emergency-restart.h>
-
-#endif /* _ASM_EMERGENCY_RESTART_H */
diff --git a/include/asm-alpha/err_common.h b/include/asm-alpha/err_common.h
deleted file mode 100644 (file)
index c250959..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *     linux/include/asm-alpha/err_common.h
- *
- *     Copyright (C) 2000 Jeff Wiedemeier (Compaq Computer Corporation)
- *
- *     Contains declarations and macros to support Alpha error handling
- *     implementations.
- */
-
-#ifndef __ALPHA_ERR_COMMON_H
-#define __ALPHA_ERR_COMMON_H 1
-
-/*
- * SCB Vector definitions
- */
-#define SCB_Q_SYSERR   0x620
-#define SCB_Q_PROCERR  0x630
-#define SCB_Q_SYSMCHK  0x660
-#define SCB_Q_PROCMCHK 0x670
-#define SCB_Q_SYSEVENT 0x680
-
-/*
- * Disposition definitions for logout frame parser
- */
-#define MCHK_DISPOSITION_UNKNOWN_ERROR         0x00
-#define MCHK_DISPOSITION_REPORT                        0x01
-#define MCHK_DISPOSITION_DISMISS               0x02
-
-/*
- * Error Log definitions
- */
-/*
- * Types
- */
-
-#define EL_CLASS__TERMINATION          (0)
-#  define EL_TYPE__TERMINATION__TERMINATION            (0)
-#define EL_CLASS__HEADER               (5)
-#  define EL_TYPE__HEADER__SYSTEM_ERROR_FRAME          (1)
-#  define EL_TYPE__HEADER__SYSTEM_EVENT_FRAME          (2)
-#  define EL_TYPE__HEADER__HALT_FRAME                  (3)
-#  define EL_TYPE__HEADER__LOGOUT_FRAME                        (19)
-#define EL_CLASS__GENERAL_NOTIFICATION (9)
-#define EL_CLASS__PCI_ERROR_FRAME      (11)
-#define EL_CLASS__REGATTA_FAMILY       (12)
-#  define EL_TYPE__REGATTA__PROCESSOR_ERROR_FRAME      (1)
-#  define EL_TYPE__REGATTA__SYSTEM_ERROR_FRAME         (2)
-#  define EL_TYPE__REGATTA__ENVIRONMENTAL_FRAME                (3)
-#  define EL_TYPE__REGATTA__TITAN_PCHIP0_EXTENDED      (8)
-#  define EL_TYPE__REGATTA__TITAN_PCHIP1_EXTENDED      (9)
-#  define EL_TYPE__REGATTA__TITAN_MEMORY_EXTENDED      (10)
-#  define EL_TYPE__REGATTA__PROCESSOR_DBL_ERROR_HALT   (11)
-#  define EL_TYPE__REGATTA__SYSTEM_DBL_ERROR_HALT      (12)
-#define EL_CLASS__PAL                   (14)
-#  define EL_TYPE__PAL__LOGOUT_FRAME                    (1)
-#  define EL_TYPE__PAL__EV7_PROCESSOR                  (4)
-#  define EL_TYPE__PAL__EV7_ZBOX                       (5)
-#  define EL_TYPE__PAL__EV7_RBOX                       (6)
-#  define EL_TYPE__PAL__EV7_IO                         (7)
-#  define EL_TYPE__PAL__ENV__AMBIENT_TEMPERATURE       (10)
-#  define EL_TYPE__PAL__ENV__AIRMOVER_FAN              (11)
-#  define EL_TYPE__PAL__ENV__VOLTAGE                   (12)
-#  define EL_TYPE__PAL__ENV__INTRUSION                 (13)
-#  define EL_TYPE__PAL__ENV__POWER_SUPPLY              (14)
-#  define EL_TYPE__PAL__ENV__LAN                       (15)
-#  define EL_TYPE__PAL__ENV__HOT_PLUG                  (16)
-
-union el_timestamp {
-       struct {
-               u8 second;
-               u8 minute;
-               u8 hour;
-               u8 day;
-               u8 month;
-               u8 year;
-       } b;
-       u64 as_int;
-};
-
-struct el_subpacket {
-       u16 length;             /* length of header (in bytes)  */
-       u16 class;              /* header class and type...     */
-       u16 type;               /* ...determine content         */
-       u16 revision;           /* header revision              */
-       union {
-               struct {        /* Class 5, Type 1 - System Error       */
-                       u32 frame_length;
-                       u32 frame_packet_count;                 
-               } sys_err;                      
-               struct {        /* Class 5, Type 2 - System Event       */
-                       union el_timestamp timestamp;
-                       u32 frame_length;
-                       u32 frame_packet_count;                 
-               } sys_event;
-               struct {        /* Class 5, Type 3 - Double Error Halt  */
-                       u16 halt_code;
-                       u16 reserved;
-                       union el_timestamp timestamp;
-                       u32 frame_length;
-                       u32 frame_packet_count;
-               } err_halt;
-               struct {        /* Clasee 5, Type 19 - Logout Frame Header */
-                       u32 frame_length;
-                       u32 frame_flags;
-                       u32 cpu_offset; 
-                       u32 system_offset;
-               } logout_header;
-               struct {        /* Class 12 - Regatta                   */
-                       u64 cpuid;
-                       u64 data_start[1];
-               } regatta_frame;
-               struct {        /* Raw                                  */
-                       u64 data_start[1];
-               } raw;
-       } by_type;
-};
-
-#endif /* __ALPHA_ERR_COMMON_H */
diff --git a/include/asm-alpha/err_ev6.h b/include/asm-alpha/err_ev6.h
deleted file mode 100644 (file)
index ea63779..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef __ALPHA_ERR_EV6_H
-#define __ALPHA_ERR_EV6_H 1
-
-/* Dummy include for now. */
-
-#endif /* __ALPHA_ERR_EV6_H */
diff --git a/include/asm-alpha/err_ev7.h b/include/asm-alpha/err_ev7.h
deleted file mode 100644 (file)
index 87f9977..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-#ifndef __ALPHA_ERR_EV7_H
-#define __ALPHA_ERR_EV7_H 1
-
-/*
- * Data for el packet class PAL (14), type LOGOUT_FRAME (1)
- */
-struct ev7_pal_logout_subpacket {
-       u32 mchk_code;
-       u32 subpacket_count;
-       u64 whami;
-       u64 rbox_whami;
-       u64 rbox_int;
-       u64 exc_addr;
-       union el_timestamp timestamp;
-       u64 halt_code;
-       u64 reserved;
-};
-
-/*
- * Data for el packet class PAL (14), type EV7_PROCESSOR (4)
- */
-struct ev7_pal_processor_subpacket {
-       u64 i_stat;
-       u64 dc_stat;
-       u64 c_addr;
-       u64 c_syndrome_1;
-       u64 c_syndrome_0;
-       u64 c_stat;
-       u64 c_sts;
-       u64 mm_stat;
-       u64 exc_addr;
-       u64 ier_cm;
-       u64 isum;
-       u64 pal_base;
-       u64 i_ctl;
-       u64 process_context;
-       u64 cbox_ctl;
-       u64 cbox_stp_ctl;
-       u64 cbox_acc_ctl;
-       u64 cbox_lcl_set;
-       u64 cbox_gbl_set;
-       u64 bbox_ctl;
-       u64 bbox_err_sts;
-       u64 bbox_err_idx;
-       u64 cbox_ddp_err_sts;
-       u64 bbox_dat_rmp;
-       u64 reserved[2];
-};
-
-/*
- * Data for el packet class PAL (14), type EV7_ZBOX (5)
- */
-struct ev7_pal_zbox_subpacket {
-       u32 zbox0_dram_err_status_1;
-       u32 zbox0_dram_err_status_2;
-       u32 zbox0_dram_err_status_3;
-       u32 zbox0_dram_err_ctl;
-       u32 zbox0_dram_err_adr;
-       u32 zbox0_dift_timeout;
-       u32 zbox0_dram_mapper_ctl;
-       u32 zbox0_frc_err_adr;
-       u32 zbox0_dift_err_status;
-       u32 reserved1;
-       u32 zbox1_dram_err_status_1;
-       u32 zbox1_dram_err_status_2;
-       u32 zbox1_dram_err_status_3;
-       u32 zbox1_dram_err_ctl;
-       u32 zbox1_dram_err_adr;
-       u32 zbox1_dift_timeout;
-       u32 zbox1_dram_mapper_ctl;
-       u32 zbox1_frc_err_adr;
-       u32 zbox1_dift_err_status;
-       u32 reserved2;
-       u64 cbox_ctl;
-       u64 cbox_stp_ctl;
-       u64 zbox0_error_pa;
-       u64 zbox1_error_pa;
-       u64 zbox0_ored_syndrome;
-       u64 zbox1_ored_syndrome;
-       u64 reserved3[2];
-};
-
-/*
- * Data for el packet class PAL (14), type EV7_RBOX (6)
- */
-struct ev7_pal_rbox_subpacket {
-       u64 rbox_cfg;
-       u64 rbox_n_cfg;
-       u64 rbox_s_cfg;
-       u64 rbox_e_cfg;
-       u64 rbox_w_cfg;
-       u64 rbox_n_err;
-       u64 rbox_s_err;
-       u64 rbox_e_err;
-       u64 rbox_w_err;
-       u64 rbox_io_cfg;
-       u64 rbox_io_err;
-       u64 rbox_l_err;
-       u64 rbox_whoami;
-       u64 rbox_imask;
-       u64 rbox_intq;
-       u64 rbox_int;
-       u64 reserved[2];
-};
-
-/*
- * Data for el packet class PAL (14), type EV7_IO (7)
- */
-struct ev7_pal_io_one_port {
-       u64 pox_err_sum;
-       u64 pox_tlb_err;
-       u64 pox_spl_cmplt;
-       u64 pox_trans_sum;
-       u64 pox_first_err;
-       u64 pox_mult_err;
-       u64 pox_dm_source;
-       u64 pox_dm_dest;
-       u64 pox_dm_size;
-       u64 pox_dm_ctrl;
-       u64 reserved;
-};
-
-struct ev7_pal_io_subpacket {
-       u64 io_asic_rev;
-       u64 io_sys_rev;
-       u64 io7_uph;
-       u64 hpi_ctl;
-       u64 crd_ctl;
-       u64 hei_ctl;
-       u64 po7_error_sum;
-       u64 po7_uncrr_sym;
-       u64 po7_crrct_sym;
-       u64 po7_ugbge_sym;
-       u64 po7_err_pkt0;
-       u64 po7_err_pkt1;
-       u64 reserved[2];
-       struct ev7_pal_io_one_port ports[4];
-};
-
-/*
- * Environmental subpacket. Data used for el packets:
- *        class PAL (14), type AMBIENT_TEMPERATURE (10)
- *        class PAL (14), type AIRMOVER_FAN (11)
- *        class PAL (14), type VOLTAGE (12)
- *        class PAL (14), type INTRUSION (13)
- *        class PAL (14), type POWER_SUPPLY (14)
- *        class PAL (14), type LAN (15)
- *        class PAL (14), type HOT_PLUG (16)
- */
-struct ev7_pal_environmental_subpacket {
-       u16 cabinet;
-       u16 drawer;
-       u16 reserved1[2];
-       u8 module_type;
-       u8 unit_id;             /* unit reporting condition */
-       u8 reserved2;
-       u8 condition;           /* condition reported       */
-};
-
-/*
- * Convert environmental type to index
- */
-static inline int ev7_lf_env_index(int type)
-{
-       BUG_ON((type < EL_TYPE__PAL__ENV__AMBIENT_TEMPERATURE) 
-              || (type > EL_TYPE__PAL__ENV__HOT_PLUG));
-
-       return type - EL_TYPE__PAL__ENV__AMBIENT_TEMPERATURE;
-}
-
-/*
- * Data for generic el packet class PAL.
- */
-struct ev7_pal_subpacket {
-       union {
-               struct ev7_pal_logout_subpacket logout;      /* Type     1 */
-               struct ev7_pal_processor_subpacket ev7;      /* Type     4 */
-               struct ev7_pal_zbox_subpacket zbox;          /* Type     5 */
-               struct ev7_pal_rbox_subpacket rbox;          /* Type     6 */
-               struct ev7_pal_io_subpacket io;              /* Type     7 */
-               struct ev7_pal_environmental_subpacket env;  /* Type 10-16 */
-               u64 as_quad[1];                              /* Raw u64    */
-       } by_type;
-};
-
-/*
- * Struct to contain collected logout from subpackets.
- */
-struct ev7_lf_subpackets {
-       struct ev7_pal_logout_subpacket *logout;                /* Type  1 */
-       struct ev7_pal_processor_subpacket *ev7;                /* Type  4 */
-       struct ev7_pal_zbox_subpacket *zbox;                    /* Type  5 */
-       struct ev7_pal_rbox_subpacket *rbox;                    /* Type  6 */
-       struct ev7_pal_io_subpacket *io;                        /* Type  7 */
-       struct ev7_pal_environmental_subpacket *env[7];      /* Type 10-16 */
-
-       unsigned int io_pid;
-};
-
-#endif /* __ALPHA_ERR_EV7_H */
-
-
diff --git a/include/asm-alpha/errno.h b/include/asm-alpha/errno.h
deleted file mode 100644 (file)
index 69e2655..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-#ifndef _ALPHA_ERRNO_H
-#define _ALPHA_ERRNO_H
-
-#include <asm-generic/errno-base.h>
-
-#undef EAGAIN                  /* 11 in errno-base.h */
-
-#define        EDEADLK         11      /* Resource deadlock would occur */
-
-#define        EAGAIN          35      /* Try again */
-#define        EWOULDBLOCK     EAGAIN  /* Operation would block */
-#define        EINPROGRESS     36      /* Operation now in progress */
-#define        EALREADY        37      /* Operation already in progress */
-#define        ENOTSOCK        38      /* Socket operation on non-socket */
-#define        EDESTADDRREQ    39      /* Destination address required */
-#define        EMSGSIZE        40      /* Message too long */
-#define        EPROTOTYPE      41      /* Protocol wrong type for socket */
-#define        ENOPROTOOPT     42      /* Protocol not available */
-#define        EPROTONOSUPPORT 43      /* Protocol not supported */
-#define        ESOCKTNOSUPPORT 44      /* Socket type not supported */
-#define        EOPNOTSUPP      45      /* Operation not supported on transport endpoint */
-#define        EPFNOSUPPORT    46      /* Protocol family not supported */
-#define        EAFNOSUPPORT    47      /* Address family not supported by protocol */
-#define        EADDRINUSE      48      /* Address already in use */
-#define        EADDRNOTAVAIL   49      /* Cannot assign requested address */
-#define        ENETDOWN        50      /* Network is down */
-#define        ENETUNREACH     51      /* Network is unreachable */
-#define        ENETRESET       52      /* Network dropped connection because of reset */
-#define        ECONNABORTED    53      /* Software caused connection abort */
-#define        ECONNRESET      54      /* Connection reset by peer */
-#define        ENOBUFS         55      /* No buffer space available */
-#define        EISCONN         56      /* Transport endpoint is already connected */
-#define        ENOTCONN        57      /* Transport endpoint is not connected */
-#define        ESHUTDOWN       58      /* Cannot send after transport endpoint shutdown */
-#define        ETOOMANYREFS    59      /* Too many references: cannot splice */
-#define        ETIMEDOUT       60      /* Connection timed out */
-#define        ECONNREFUSED    61      /* Connection refused */
-#define        ELOOP           62      /* Too many symbolic links encountered */
-#define        ENAMETOOLONG    63      /* File name too long */
-#define        EHOSTDOWN       64      /* Host is down */
-#define        EHOSTUNREACH    65      /* No route to host */
-#define        ENOTEMPTY       66      /* Directory not empty */
-
-#define        EUSERS          68      /* Too many users */
-#define        EDQUOT          69      /* Quota exceeded */
-#define        ESTALE          70      /* Stale NFS file handle */
-#define        EREMOTE         71      /* Object is remote */
-
-#define        ENOLCK          77      /* No record locks available */
-#define        ENOSYS          78      /* Function not implemented */
-
-#define        ENOMSG          80      /* No message of desired type */
-#define        EIDRM           81      /* Identifier removed */
-#define        ENOSR           82      /* Out of streams resources */
-#define        ETIME           83      /* Timer expired */
-#define        EBADMSG         84      /* Not a data message */
-#define        EPROTO          85      /* Protocol error */
-#define        ENODATA         86      /* No data available */
-#define        ENOSTR          87      /* Device not a stream */
-
-#define        ENOPKG          92      /* Package not installed */
-
-#define        EILSEQ          116     /* Illegal byte sequence */
-
-/* The following are just random noise.. */
-#define        ECHRNG          88      /* Channel number out of range */
-#define        EL2NSYNC        89      /* Level 2 not synchronized */
-#define        EL3HLT          90      /* Level 3 halted */
-#define        EL3RST          91      /* Level 3 reset */
-
-#define        ELNRNG          93      /* Link number out of range */
-#define        EUNATCH         94      /* Protocol driver not attached */
-#define        ENOCSI          95      /* No CSI structure available */
-#define        EL2HLT          96      /* Level 2 halted */
-#define        EBADE           97      /* Invalid exchange */
-#define        EBADR           98      /* Invalid request descriptor */
-#define        EXFULL          99      /* Exchange full */
-#define        ENOANO          100     /* No anode */
-#define        EBADRQC         101     /* Invalid request code */
-#define        EBADSLT         102     /* Invalid slot */
-
-#define        EDEADLOCK       EDEADLK
-
-#define        EBFONT          104     /* Bad font file format */
-#define        ENONET          105     /* Machine is not on the network */
-#define        ENOLINK         106     /* Link has been severed */
-#define        EADV            107     /* Advertise error */
-#define        ESRMNT          108     /* Srmount error */
-#define        ECOMM           109     /* Communication error on send */
-#define        EMULTIHOP       110     /* Multihop attempted */
-#define        EDOTDOT         111     /* RFS specific error */
-#define        EOVERFLOW       112     /* Value too large for defined data type */
-#define        ENOTUNIQ        113     /* Name not unique on network */
-#define        EBADFD          114     /* File descriptor in bad state */
-#define        EREMCHG         115     /* Remote address changed */
-
-#define        EUCLEAN         117     /* Structure needs cleaning */
-#define        ENOTNAM         118     /* Not a XENIX named type file */
-#define        ENAVAIL         119     /* No XENIX semaphores available */
-#define        EISNAM          120     /* Is a named type file */
-#define        EREMOTEIO       121     /* Remote I/O error */
-
-#define        ELIBACC         122     /* Can not access a needed shared library */
-#define        ELIBBAD         123     /* Accessing a corrupted shared library */
-#define        ELIBSCN         124     /* .lib section in a.out corrupted */
-#define        ELIBMAX         125     /* Attempting to link in too many shared libraries */
-#define        ELIBEXEC        126     /* Cannot exec a shared library directly */
-#define        ERESTART        127     /* Interrupted system call should be restarted */
-#define        ESTRPIPE        128     /* Streams pipe error */
-
-#define ENOMEDIUM      129     /* No medium found */
-#define EMEDIUMTYPE    130     /* Wrong medium type */
-#define        ECANCELED       131     /* Operation Cancelled */
-#define        ENOKEY          132     /* Required key not available */
-#define        EKEYEXPIRED     133     /* Key has expired */
-#define        EKEYREVOKED     134     /* Key has been revoked */
-#define        EKEYREJECTED    135     /* Key was rejected by service */
-
-/* for robust mutexes */
-#define        EOWNERDEAD      136     /* Owner died */
-#define        ENOTRECOVERABLE 137     /* State not recoverable */
-
-#endif
diff --git a/include/asm-alpha/fb.h b/include/asm-alpha/fb.h
deleted file mode 100644 (file)
index fa9bbb9..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _ASM_FB_H_
-#define _ASM_FB_H_
-#include <linux/device.h>
-
-/* Caching is off in the I/O space quadrant by design.  */
-#define fb_pgprotect(...) do {} while (0)
-
-static inline int fb_is_primary_device(struct fb_info *info)
-{
-       return 0;
-}
-
-#endif /* _ASM_FB_H_ */
diff --git a/include/asm-alpha/fcntl.h b/include/asm-alpha/fcntl.h
deleted file mode 100644 (file)
index 25da001..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef _ALPHA_FCNTL_H
-#define _ALPHA_FCNTL_H
-
-/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
-   located on an ext2 file system */
-#define O_CREAT                 01000  /* not fcntl */
-#define O_TRUNC                 02000  /* not fcntl */
-#define O_EXCL          04000  /* not fcntl */
-#define O_NOCTTY       010000  /* not fcntl */
-
-#define O_NONBLOCK      00004
-#define O_APPEND        00010
-#define O_SYNC         040000
-#define O_DIRECTORY    0100000 /* must be a directory */
-#define O_NOFOLLOW     0200000 /* don't follow links */
-#define O_LARGEFILE    0400000 /* will be set by the kernel on every open */
-#define O_DIRECT       02000000 /* direct disk access - should check with OSF/1 */
-#define O_NOATIME      04000000
-#define O_CLOEXEC      010000000 /* set close_on_exec */
-
-#define F_GETLK                7
-#define F_SETLK                8
-#define F_SETLKW       9
-
-#define F_SETOWN       5       /*  for sockets. */
-#define F_GETOWN       6       /*  for sockets. */
-#define F_SETSIG       10      /*  for sockets. */
-#define F_GETSIG       11      /*  for sockets. */
-
-/* for posix fcntl() and lockf() */
-#define F_RDLCK                1
-#define F_WRLCK                2
-#define F_UNLCK                8
-
-/* for old implementation of bsd flock () */
-#define F_EXLCK                16      /* or 3 */
-#define F_SHLCK                32      /* or 4 */
-
-#define F_INPROGRESS   64
-
-#include <asm-generic/fcntl.h>
-
-#endif
diff --git a/include/asm-alpha/floppy.h b/include/asm-alpha/floppy.h
deleted file mode 100644 (file)
index 0be5041..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Architecture specific parts of the Floppy driver
- *
- * 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) 1995
- */
-#ifndef __ASM_ALPHA_FLOPPY_H
-#define __ASM_ALPHA_FLOPPY_H
-
-
-#define fd_inb(port)                   inb_p(port)
-#define fd_outb(value,port)            outb_p(value,port)
-
-#define fd_enable_dma()         enable_dma(FLOPPY_DMA)
-#define fd_disable_dma()        disable_dma(FLOPPY_DMA)
-#define fd_request_dma()        request_dma(FLOPPY_DMA,"floppy")
-#define fd_free_dma()           free_dma(FLOPPY_DMA)
-#define fd_clear_dma_ff()       clear_dma_ff(FLOPPY_DMA)
-#define fd_set_dma_mode(mode)   set_dma_mode(FLOPPY_DMA,mode)
-#define fd_set_dma_addr(addr)   set_dma_addr(FLOPPY_DMA,virt_to_bus(addr))
-#define fd_set_dma_count(count) set_dma_count(FLOPPY_DMA,count)
-#define fd_enable_irq()         enable_irq(FLOPPY_IRQ)
-#define fd_disable_irq()        disable_irq(FLOPPY_IRQ)
-#define fd_cacheflush(addr,size) /* nothing */
-#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>
-
-#define fd_dma_setup(addr,size,mode,io) alpha_fd_dma_setup(addr,size,mode,io)
-
-static __inline__ int 
-alpha_fd_dma_setup(char *addr, unsigned long size, int mode, int io)
-{
-       static unsigned long prev_size;
-       static dma_addr_t bus_addr = 0;
-       static char *prev_addr;
-       static int prev_dir;
-       int dir;
-
-       dir = (mode != DMA_MODE_READ) ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE;
-
-       if (bus_addr 
-           && (addr != prev_addr || size != prev_size || dir != prev_dir)) {
-               /* different from last time -- unmap prev */
-               pci_unmap_single(isa_bridge, bus_addr, prev_size, prev_dir);
-               bus_addr = 0;
-       }
-
-       if (!bus_addr)  /* need to map it */
-               bus_addr = pci_map_single(isa_bridge, addr, size, dir);
-
-       /* remember this one as prev */
-       prev_addr = addr;
-       prev_size = size;
-       prev_dir = dir;
-
-       fd_clear_dma_ff();
-       fd_cacheflush(addr, size);
-       fd_set_dma_mode(mode);
-       set_dma_addr(FLOPPY_DMA, bus_addr);
-       fd_set_dma_count(size);
-       virtual_dma_port = io;
-       fd_enable_dma();
-
-       return 0;
-}
-
-#endif /* CONFIG_PCI */
-
-__inline__ void virtual_dma_init(void)
-{
-       /* Nothing to do on an Alpha */
-}
-
-static int FDC1 = 0x3f0;
-static int FDC2 = -1;
-
-/*
- * Again, the CMOS information doesn't work on the alpha..
- */
-#define FLOPPY0_TYPE 6
-#define FLOPPY1_TYPE 0
-
-#define N_FDC 2
-#define N_DRIVE 8
-
-/*
- * Most Alphas have no problems with floppy DMA crossing 64k borders,
- * except for certain ones, like XL and RUFFIAN.
- *
- * However, the test is simple and fast, and this *is* floppy, after all,
- * so we do it for all platforms, just to make sure.
- *
- * This is advantageous in other circumstances as well, as in moving
- * about the PCI DMA windows and forcing the floppy to start doing
- * scatter-gather when it never had before, and there *is* a problem
- * on that platform... ;-}
- */
-
-static inline unsigned long CROSS_64KB(void *a, unsigned long s)
-{
-       unsigned long p = (unsigned long)a;
-       return ((p + s - 1) ^ p) & ~0xffffUL;
-}
-
-#define EXTRA_FLOPPY_PARAMS
-
-#endif /* __ASM_ALPHA_FLOPPY_H */
diff --git a/include/asm-alpha/fpu.h b/include/asm-alpha/fpu.h
deleted file mode 100644 (file)
index ecb17a7..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-#ifndef __ASM_ALPHA_FPU_H
-#define __ASM_ALPHA_FPU_H
-
-/*
- * Alpha floating-point control register defines:
- */
-#define FPCR_DNOD      (1UL<<47)       /* denorm INV trap disable */
-#define FPCR_DNZ       (1UL<<48)       /* denorms to zero */
-#define FPCR_INVD      (1UL<<49)       /* invalid op disable (opt.) */
-#define FPCR_DZED      (1UL<<50)       /* division by zero disable (opt.) */
-#define FPCR_OVFD      (1UL<<51)       /* overflow disable (optional) */
-#define FPCR_INV       (1UL<<52)       /* invalid operation */
-#define FPCR_DZE       (1UL<<53)       /* division by zero */
-#define FPCR_OVF       (1UL<<54)       /* overflow */
-#define FPCR_UNF       (1UL<<55)       /* underflow */
-#define FPCR_INE       (1UL<<56)       /* inexact */
-#define FPCR_IOV       (1UL<<57)       /* integer overflow */
-#define FPCR_UNDZ      (1UL<<60)       /* underflow to zero (opt.) */
-#define FPCR_UNFD      (1UL<<61)       /* underflow disable (opt.) */
-#define FPCR_INED      (1UL<<62)       /* inexact disable (opt.) */
-#define FPCR_SUM       (1UL<<63)       /* summary bit */
-
-#define FPCR_DYN_SHIFT 58              /* first dynamic rounding mode bit */
-#define FPCR_DYN_CHOPPED (0x0UL << FPCR_DYN_SHIFT)     /* towards 0 */
-#define FPCR_DYN_MINUS  (0x1UL << FPCR_DYN_SHIFT)      /* towards -INF */
-#define FPCR_DYN_NORMAL         (0x2UL << FPCR_DYN_SHIFT)      /* towards nearest */
-#define FPCR_DYN_PLUS   (0x3UL << FPCR_DYN_SHIFT)      /* towards +INF */
-#define FPCR_DYN_MASK   (0x3UL << FPCR_DYN_SHIFT)
-
-#define FPCR_MASK      0xffff800000000000L
-
-/*
- * IEEE trap enables are implemented in software.  These per-thread
- * bits are stored in the "ieee_state" field of "struct thread_info".
- * Thus, the bits are defined so as not to conflict with the
- * floating-point enable bit (which is architected).  On top of that,
- * we want to make these bits compatible with OSF/1 so
- * ieee_set_fp_control() etc. can be implemented easily and
- * compatibly.  The corresponding definitions are in
- * /usr/include/machine/fpu.h under OSF/1.
- */
-#define IEEE_TRAP_ENABLE_INV   (1UL<<1)        /* invalid op */
-#define IEEE_TRAP_ENABLE_DZE   (1UL<<2)        /* division by zero */
-#define IEEE_TRAP_ENABLE_OVF   (1UL<<3)        /* overflow */
-#define IEEE_TRAP_ENABLE_UNF   (1UL<<4)        /* underflow */
-#define IEEE_TRAP_ENABLE_INE   (1UL<<5)        /* inexact */
-#define IEEE_TRAP_ENABLE_DNO   (1UL<<6)        /* denorm */
-#define IEEE_TRAP_ENABLE_MASK  (IEEE_TRAP_ENABLE_INV | IEEE_TRAP_ENABLE_DZE |\
-                                IEEE_TRAP_ENABLE_OVF | IEEE_TRAP_ENABLE_UNF |\
-                                IEEE_TRAP_ENABLE_INE | IEEE_TRAP_ENABLE_DNO)
-
-/* Denorm and Underflow flushing */
-#define IEEE_MAP_DMZ           (1UL<<12)       /* Map denorm inputs to zero */
-#define IEEE_MAP_UMZ           (1UL<<13)       /* Map underflowed outputs to zero */
-
-#define IEEE_MAP_MASK          (IEEE_MAP_DMZ | IEEE_MAP_UMZ)
-
-/* status bits coming from fpcr: */
-#define IEEE_STATUS_INV                (1UL<<17)
-#define IEEE_STATUS_DZE                (1UL<<18)
-#define IEEE_STATUS_OVF                (1UL<<19)
-#define IEEE_STATUS_UNF                (1UL<<20)
-#define IEEE_STATUS_INE                (1UL<<21)
-#define IEEE_STATUS_DNO                (1UL<<22)
-
-#define IEEE_STATUS_MASK       (IEEE_STATUS_INV | IEEE_STATUS_DZE |    \
-                                IEEE_STATUS_OVF | IEEE_STATUS_UNF |    \
-                                IEEE_STATUS_INE | IEEE_STATUS_DNO)
-
-#define IEEE_SW_MASK           (IEEE_TRAP_ENABLE_MASK |                \
-                                IEEE_STATUS_MASK | IEEE_MAP_MASK)
-
-#define IEEE_CURRENT_RM_SHIFT  32
-#define IEEE_CURRENT_RM_MASK   (3UL<<IEEE_CURRENT_RM_SHIFT)
-
-#define IEEE_STATUS_TO_EXCSUM_SHIFT    16
-
-#define IEEE_INHERIT    (1UL<<63)      /* inherit on thread create? */
-
-/*
- * Convert the software IEEE trap enable and status bits into the
- * hardware fpcr format. 
- *
- * Digital Unix engineers receive my thanks for not defining the
- * software bits identical to the hardware bits.  The chip designers
- * receive my thanks for making all the not-implemented fpcr bits
- * RAZ forcing us to use system calls to read/write this value.
- */
-
-static inline unsigned long
-ieee_swcr_to_fpcr(unsigned long sw)
-{
-       unsigned long fp;
-       fp = (sw & IEEE_STATUS_MASK) << 35;
-       fp |= (sw & IEEE_MAP_DMZ) << 36;
-       fp |= (sw & IEEE_STATUS_MASK ? FPCR_SUM : 0);
-       fp |= (~sw & (IEEE_TRAP_ENABLE_INV
-                     | IEEE_TRAP_ENABLE_DZE
-                     | IEEE_TRAP_ENABLE_OVF)) << 48;
-       fp |= (~sw & (IEEE_TRAP_ENABLE_UNF | IEEE_TRAP_ENABLE_INE)) << 57;
-       fp |= (sw & IEEE_MAP_UMZ ? FPCR_UNDZ | FPCR_UNFD : 0);
-       fp |= (~sw & IEEE_TRAP_ENABLE_DNO) << 41;
-       return fp;
-}
-
-static inline unsigned long
-ieee_fpcr_to_swcr(unsigned long fp)
-{
-       unsigned long sw;
-       sw = (fp >> 35) & IEEE_STATUS_MASK;
-       sw |= (fp >> 36) & IEEE_MAP_DMZ;
-       sw |= (~fp >> 48) & (IEEE_TRAP_ENABLE_INV
-                            | IEEE_TRAP_ENABLE_DZE
-                            | IEEE_TRAP_ENABLE_OVF);
-       sw |= (~fp >> 57) & (IEEE_TRAP_ENABLE_UNF | IEEE_TRAP_ENABLE_INE);
-       sw |= (fp >> 47) & IEEE_MAP_UMZ;
-       sw |= (~fp >> 41) & IEEE_TRAP_ENABLE_DNO;
-       return sw;
-}
-
-#ifdef __KERNEL__
-
-/* The following two functions don't need trapb/excb instructions
-   around the mf_fpcr/mt_fpcr instructions because (a) the kernel
-   never generates arithmetic faults and (b) call_pal instructions
-   are implied trap barriers.  */
-
-static inline unsigned long
-rdfpcr(void)
-{
-       unsigned long tmp, ret;
-
-#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
-       __asm__ __volatile__ (
-               "ftoit $f0,%0\n\t"
-               "mf_fpcr $f0\n\t"
-               "ftoit $f0,%1\n\t"
-               "itoft %0,$f0"
-               : "=r"(tmp), "=r"(ret));
-#else
-       __asm__ __volatile__ (
-               "stt $f0,%0\n\t"
-               "mf_fpcr $f0\n\t"
-               "stt $f0,%1\n\t"
-               "ldt $f0,%0"
-               : "=m"(tmp), "=m"(ret));
-#endif
-
-       return ret;
-}
-
-static inline void
-wrfpcr(unsigned long val)
-{
-       unsigned long tmp;
-
-#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
-       __asm__ __volatile__ (
-               "ftoit $f0,%0\n\t"
-               "itoft %1,$f0\n\t"
-               "mt_fpcr $f0\n\t"
-               "itoft %0,$f0"
-               : "=&r"(tmp) : "r"(val));
-#else
-       __asm__ __volatile__ (
-               "stt $f0,%0\n\t"
-               "ldt $f0,%1\n\t"
-               "mt_fpcr $f0\n\t"
-               "ldt $f0,%0"
-               : "=m"(tmp) : "m"(val));
-#endif
-}
-
-static inline unsigned long
-swcr_update_status(unsigned long swcr, unsigned long fpcr)
-{
-       /* EV6 implements most of the bits in hardware.  Collect
-          the acrued exception bits from the real fpcr.  */
-       if (implver() == IMPLVER_EV6) {
-               swcr &= ~IEEE_STATUS_MASK;
-               swcr |= (fpcr >> 35) & IEEE_STATUS_MASK;
-       }
-       return swcr;
-}
-
-extern unsigned long alpha_read_fp_reg (unsigned long reg);
-extern void alpha_write_fp_reg (unsigned long reg, unsigned long val);
-extern unsigned long alpha_read_fp_reg_s (unsigned long reg);
-extern void alpha_write_fp_reg_s (unsigned long reg, unsigned long val);
-
-#endif /* __KERNEL__ */
-
-#endif /* __ASM_ALPHA_FPU_H */
diff --git a/include/asm-alpha/futex.h b/include/asm-alpha/futex.h
deleted file mode 100644 (file)
index 6a332a9..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _ASM_FUTEX_H
-#define _ASM_FUTEX_H
-
-#include <asm-generic/futex.h>
-
-#endif
diff --git a/include/asm-alpha/gct.h b/include/asm-alpha/gct.h
deleted file mode 100644 (file)
index 3504c70..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef __ALPHA_GCT_H
-#define __ALPHA_GCT_H
-
-typedef u64 gct_id;
-typedef u64 gct6_handle;
-
-typedef struct __gct6_node {
-       u8 type;        
-       u8 subtype;
-       u16 size;
-       u32 hd_extension;
-       gct6_handle owner;
-       gct6_handle active_user;
-       gct_id id;
-       u64 flags;
-       u16 rev;
-       u16 change_counter;
-       u16 max_child;
-       u16 reserved1;
-       gct6_handle saved_owner;
-       gct6_handle affinity;
-       gct6_handle parent;
-       gct6_handle next;
-       gct6_handle prev;
-       gct6_handle child;
-       u64 fw_flags;
-       u64 os_usage;
-       u64 fru_id;
-       u32 checksum;
-       u32 magic;      /* 'GLXY' */
-} gct6_node;
-
-typedef struct {
-       u8 type;        
-       u8 subtype;
-       void (*callout)(gct6_node *);
-} gct6_search_struct;
-
-#define GCT_NODE_MAGIC   0x59584c47    /* 'GLXY' */
-
-/* 
- * node types 
- */
-#define GCT_TYPE_HOSE                  0x0E
-
-/*
- * node subtypes
- */
-#define GCT_SUBTYPE_IO_PORT_MODULE     0x2C
-
-#define GCT_NODE_PTR(off) ((gct6_node *)((char *)hwrpb +               \
-                                        hwrpb->frut_offset +           \
-                                        (gct6_handle)(off)))           \
-
-int gct6_find_nodes(gct6_node *, gct6_search_struct *);
-
-#endif /* __ALPHA_GCT_H */
-
diff --git a/include/asm-alpha/gentrap.h b/include/asm-alpha/gentrap.h
deleted file mode 100644 (file)
index ae50cc3..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef _ASMAXP_GENTRAP_H
-#define _ASMAXP_GENTRAP_H
-
-/*
- * Definitions for gentrap causes.  They are generated by user-level
- * programs and therefore should be compatible with the corresponding
- * OSF/1 definitions.
- */
-#define GEN_INTOVF     -1      /* integer overflow */
-#define GEN_INTDIV     -2      /* integer division by zero */
-#define GEN_FLTOVF     -3      /* fp overflow */
-#define GEN_FLTDIV     -4      /* fp division by zero */
-#define GEN_FLTUND     -5      /* fp underflow */
-#define GEN_FLTINV     -6      /* invalid fp operand */
-#define GEN_FLTINE     -7      /* inexact fp operand */
-#define GEN_DECOVF     -8      /* decimal overflow (for COBOL??) */
-#define GEN_DECDIV     -9      /* decimal division by zero */
-#define GEN_DECINV     -10     /* invalid decimal operand */
-#define GEN_ROPRAND    -11     /* reserved operand */
-#define GEN_ASSERTERR  -12     /* assertion error */
-#define GEN_NULPTRERR  -13     /* null pointer error */
-#define GEN_STKOVF     -14     /* stack overflow */
-#define GEN_STRLENERR  -15     /* string length error */
-#define GEN_SUBSTRERR  -16     /* substring error */
-#define GEN_RANGERR    -17     /* range error */
-#define GEN_SUBRNG     -18
-#define GEN_SUBRNG1    -19      
-#define GEN_SUBRNG2    -20
-#define GEN_SUBRNG3    -21     /* these report range errors for */
-#define GEN_SUBRNG4    -22     /* subscripting (indexing) at levels 0..7 */
-#define GEN_SUBRNG5    -23
-#define GEN_SUBRNG6    -24
-#define GEN_SUBRNG7    -25
-
-/* the remaining codes (-26..-1023) are reserved. */
-
-#endif /* _ASMAXP_GENTRAP_H */
diff --git a/include/asm-alpha/hardirq.h b/include/asm-alpha/hardirq.h
deleted file mode 100644 (file)
index d953e23..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef _ALPHA_HARDIRQ_H
-#define _ALPHA_HARDIRQ_H
-
-#include <linux/threads.h>
-#include <linux/cache.h>
-
-
-/* entry.S is sensitive to the offsets of these fields */
-typedef struct {
-       unsigned long __softirq_pending;
-} ____cacheline_aligned irq_cpustat_t;
-
-#include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
-
-void ack_bad_irq(unsigned int irq);
-
-#define HARDIRQ_BITS   12
-
-/*
- * The hardirq mask has to be large enough to have
- * space for potentially nestable IRQ sources in the system
- * to nest on a single CPU. On Alpha, interrupts are masked at the CPU
- * by IPL as well as at the system level. We only have 8 IPLs (UNIX PALcode)
- * so we really only have 8 nestable IRQs, but allow some overhead
- */
-#if (1 << HARDIRQ_BITS) < 16
-#error HARDIRQ_BITS is too low!
-#endif
-
-#endif /* _ALPHA_HARDIRQ_H */
diff --git a/include/asm-alpha/hw_irq.h b/include/asm-alpha/hw_irq.h
deleted file mode 100644 (file)
index a37db0f..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _ALPHA_HW_IRQ_H
-#define _ALPHA_HW_IRQ_H
-
-
-extern volatile unsigned long irq_err_count;
-
-#ifdef CONFIG_ALPHA_GENERIC
-#define ACTUAL_NR_IRQS alpha_mv.nr_irqs
-#else
-#define ACTUAL_NR_IRQS NR_IRQS
-#endif
-
-#endif
diff --git a/include/asm-alpha/hwrpb.h b/include/asm-alpha/hwrpb.h
deleted file mode 100644 (file)
index 8e8f871..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-#ifndef __ALPHA_HWRPB_H
-#define __ALPHA_HWRPB_H
-
-#define INIT_HWRPB ((struct hwrpb_struct *) 0x10000000)
-
-/*
- * DEC processor types for Alpha systems.  Found in HWRPB.
- * These values are architected.
- */
-
-#define EV3_CPU                 1       /* EV3                  */
-#define EV4_CPU                 2       /* EV4 (21064)          */
-#define LCA4_CPU                4       /* LCA4 (21066/21068)   */
-#define EV5_CPU                 5       /* EV5 (21164)          */
-#define EV45_CPU                6       /* EV4.5 (21064/xxx)    */
-#define EV56_CPU               7       /* EV5.6 (21164)        */
-#define EV6_CPU                        8       /* EV6 (21264)          */
-#define PCA56_CPU              9       /* PCA56 (21164PC)      */
-#define PCA57_CPU              10      /* PCA57 (notyet)       */
-#define EV67_CPU               11      /* EV67 (21264A)        */
-#define EV68CB_CPU             12      /* EV68CB (21264C)      */
-#define EV68AL_CPU             13      /* EV68AL (21264B)      */
-#define EV68CX_CPU             14      /* EV68CX (21264D)      */
-#define EV7_CPU                        15      /* EV7 (21364)          */
-#define EV79_CPU               16      /* EV79 (21364??)       */
-#define EV69_CPU               17      /* EV69 (21264/EV69A)   */
-
-/*
- * DEC system types for Alpha systems.  Found in HWRPB.
- * These values are architected.
- */
-
-#define ST_ADU                   1     /* Alpha ADU systype    */
-#define ST_DEC_4000              2     /* Cobra systype        */
-#define ST_DEC_7000              3     /* Ruby systype         */
-#define ST_DEC_3000_500                  4     /* Flamingo systype     */
-#define ST_DEC_2000_300                  6     /* Jensen systype       */
-#define ST_DEC_3000_300                  7     /* Pelican systype      */
-#define ST_DEC_2100_A500         9     /* Sable systype        */
-#define ST_DEC_AXPVME_64        10     /* AXPvme system type   */
-#define ST_DEC_AXPPCI_33        11     /* NoName system type   */
-#define ST_DEC_TLASER           12     /* Turbolaser systype   */
-#define ST_DEC_2100_A50                 13     /* Avanti systype       */
-#define ST_DEC_MUSTANG          14     /* Mustang systype      */
-#define ST_DEC_ALCOR            15     /* Alcor (EV5) systype  */
-#define ST_DEC_1000             17     /* Mikasa systype       */
-#define ST_DEC_EB64             18     /* EB64 systype         */
-#define ST_DEC_EB66             19     /* EB66 systype         */
-#define ST_DEC_EB64P            20     /* EB64+ systype        */
-#define ST_DEC_BURNS            21     /* laptop systype       */
-#define ST_DEC_RAWHIDE          22     /* Rawhide systype      */
-#define ST_DEC_K2               23     /* K2 systype           */
-#define ST_DEC_LYNX             24     /* Lynx systype         */
-#define ST_DEC_XL               25     /* Alpha XL systype     */
-#define ST_DEC_EB164            26     /* EB164 systype        */
-#define ST_DEC_NORITAKE                 27     /* Noritake systype     */
-#define ST_DEC_CORTEX           28     /* Cortex systype       */
-#define ST_DEC_MIATA            30     /* Miata systype        */
-#define ST_DEC_XXM              31     /* XXM systype          */
-#define ST_DEC_TAKARA           32     /* Takara systype       */
-#define ST_DEC_YUKON            33     /* Yukon systype        */
-#define ST_DEC_TSUNAMI          34     /* Tsunami systype      */
-#define ST_DEC_WILDFIRE                 35     /* Wildfire systype     */
-#define ST_DEC_CUSCO            36     /* CUSCO systype        */
-#define ST_DEC_EIGER            37     /* Eiger systype        */
-#define ST_DEC_TITAN            38     /* Titan systype        */
-#define ST_DEC_MARVEL           39     /* Marvel systype       */
-
-/* UNOFFICIAL!!! */
-#define ST_UNOFFICIAL_BIAS     100
-#define ST_DTI_RUFFIAN         101     /* RUFFIAN systype      */
-
-/* Alpha Processor, Inc. systems */
-#define ST_API_BIAS            200
-#define ST_API_NAUTILUS                201     /* UP1000 systype       */
-
-struct pcb_struct {
-       unsigned long ksp;
-       unsigned long usp;
-       unsigned long ptbr;
-       unsigned int pcc;
-       unsigned int asn;
-       unsigned long unique;
-       unsigned long flags;
-       unsigned long res1, res2;
-};
-
-struct percpu_struct {
-       unsigned long hwpcb[16];
-       unsigned long flags;
-       unsigned long pal_mem_size;
-       unsigned long pal_scratch_size;
-       unsigned long pal_mem_pa;
-       unsigned long pal_scratch_pa;
-       unsigned long pal_revision;
-       unsigned long type;
-       unsigned long variation;
-       unsigned long revision;
-       unsigned long serial_no[2];
-       unsigned long logout_area_pa;
-       unsigned long logout_area_len;
-       unsigned long halt_PCBB;
-       unsigned long halt_PC;
-       unsigned long halt_PS;
-       unsigned long halt_arg;
-       unsigned long halt_ra;
-       unsigned long halt_pv;
-       unsigned long halt_reason;
-       unsigned long res;
-       unsigned long ipc_buffer[21];
-       unsigned long palcode_avail[16];
-       unsigned long compatibility;
-       unsigned long console_data_log_pa;
-       unsigned long console_data_log_length;
-       unsigned long bcache_info;
-};
-
-struct procdesc_struct {
-       unsigned long weird_vms_stuff;
-       unsigned long address;
-};
-
-struct vf_map_struct {
-       unsigned long va;
-       unsigned long pa;
-       unsigned long count;
-};
-
-struct crb_struct {
-       struct procdesc_struct * dispatch_va;
-       struct procdesc_struct * dispatch_pa;
-       struct procdesc_struct * fixup_va;
-       struct procdesc_struct * fixup_pa;
-       /* virtual->physical map */
-       unsigned long map_entries;
-       unsigned long map_pages;
-       struct vf_map_struct map[1];
-};
-
-struct memclust_struct {
-       unsigned long start_pfn;
-       unsigned long numpages;
-       unsigned long numtested;
-       unsigned long bitmap_va;
-       unsigned long bitmap_pa;
-       unsigned long bitmap_chksum;
-       unsigned long usage;
-};
-
-struct memdesc_struct {
-       unsigned long chksum;
-       unsigned long optional_pa;
-       unsigned long numclusters;
-       struct memclust_struct cluster[0];
-};
-
-struct dsr_struct {
-       long smm;                       /* SMM nubber used by LMF       */
-       unsigned long  lurt_off;        /* offset to LURT table         */
-       unsigned long  sysname_off;     /* offset to sysname char count */
-};
-
-struct hwrpb_struct {
-       unsigned long phys_addr;        /* check: physical address of the hwrpb */
-       unsigned long id;               /* check: "HWRPB\0\0\0" */
-       unsigned long revision; 
-       unsigned long size;             /* size of hwrpb */
-       unsigned long cpuid;
-       unsigned long pagesize;         /* 8192, I hope */
-       unsigned long pa_bits;          /* number of physical address bits */
-       unsigned long max_asn;
-       unsigned char ssn[16];          /* system serial number: big bother is watching */
-       unsigned long sys_type;
-       unsigned long sys_variation;
-       unsigned long sys_revision;
-       unsigned long intr_freq;        /* interval clock frequency * 4096 */
-       unsigned long cycle_freq;       /* cycle counter frequency */
-       unsigned long vptb;             /* Virtual Page Table Base address */
-       unsigned long res1;
-       unsigned long tbhb_offset;      /* Translation Buffer Hint Block */
-       unsigned long nr_processors;
-       unsigned long processor_size;
-       unsigned long processor_offset;
-       unsigned long ctb_nr;
-       unsigned long ctb_size;         /* console terminal block size */
-       unsigned long ctbt_offset;      /* console terminal block table offset */
-       unsigned long crb_offset;       /* console callback routine block */
-       unsigned long mddt_offset;      /* memory data descriptor table */
-       unsigned long cdb_offset;       /* configuration data block (or NULL) */
-       unsigned long frut_offset;      /* FRU table (or NULL) */
-       void (*save_terminal)(unsigned long);
-       unsigned long save_terminal_data;
-       void (*restore_terminal)(unsigned long);
-       unsigned long restore_terminal_data;
-       void (*CPU_restart)(unsigned long);
-       unsigned long CPU_restart_data;
-       unsigned long res2;
-       unsigned long res3;
-       unsigned long chksum;
-       unsigned long rxrdy;
-       unsigned long txrdy;
-       unsigned long dsr_offset;       /* "Dynamic System Recognition Data Block Table" */
-};
-
-#ifdef __KERNEL__
-
-extern struct hwrpb_struct *hwrpb;
-
-static inline void
-hwrpb_update_checksum(struct hwrpb_struct *h)
-{
-       unsigned long sum = 0, *l;
-        for (l = (unsigned long *) h; l < (unsigned long *) &h->chksum; ++l)
-                sum += *l;
-        h->chksum = sum;
-}
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_HWRPB_H */
diff --git a/include/asm-alpha/io.h b/include/asm-alpha/io.h
deleted file mode 100644 (file)
index e971ab0..0000000
+++ /dev/null
@@ -1,577 +0,0 @@
-#ifndef __ALPHA_IO_H
-#define __ALPHA_IO_H
-
-#ifdef __KERNEL__
-
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <asm/compiler.h>
-#include <asm/system.h>
-#include <asm/pgtable.h>
-#include <asm/machvec.h>
-#include <asm/hwrpb.h>
-
-/* The generic header contains only prototypes.  Including it ensures that
-   the implementation we have here matches that interface.  */
-#include <asm-generic/iomap.h>
-
-/* We don't use IO slowdowns on the Alpha, but.. */
-#define __SLOW_DOWN_IO do { } while (0)
-#define SLOW_DOWN_IO   do { } while (0)
-
-/*
- * Virtual -> physical identity mapping starts at this offset
- */
-#ifdef USE_48_BIT_KSEG
-#define IDENT_ADDR     0xffff800000000000UL
-#else
-#define IDENT_ADDR     0xfffffc0000000000UL
-#endif
-
-/*
- * We try to avoid hae updates (thus the cache), but when we
- * do need to update the hae, we need to do it atomically, so
- * that any interrupts wouldn't get confused with the hae
- * register not being up-to-date with respect to the hardware
- * value.
- */
-extern inline void __set_hae(unsigned long new_hae)
-{
-       unsigned long flags;
-       local_irq_save(flags);
-
-       alpha_mv.hae_cache = new_hae;
-       *alpha_mv.hae_register = new_hae;
-       mb();
-       /* Re-read to make sure it was written.  */
-       new_hae = *alpha_mv.hae_register;
-
-       local_irq_restore(flags);
-}
-
-extern inline void set_hae(unsigned long new_hae)
-{
-       if (new_hae != alpha_mv.hae_cache)
-               __set_hae(new_hae);
-}
-
-/*
- * Change virtual addresses to physical addresses and vv.
- */
-#ifdef USE_48_BIT_KSEG
-static inline unsigned long virt_to_phys(void *address)
-{
-       return (unsigned long)address - IDENT_ADDR;
-}
-
-static inline void * phys_to_virt(unsigned long address)
-{
-       return (void *) (address + IDENT_ADDR);
-}
-#else
-static inline unsigned long virt_to_phys(void *address)
-{
-        unsigned long phys = (unsigned long)address;
-
-       /* Sign-extend from bit 41.  */
-       phys <<= (64 - 41);
-       phys = (long)phys >> (64 - 41);
-
-       /* Crop to the physical address width of the processor.  */
-        phys &= (1ul << hwrpb->pa_bits) - 1;
-
-        return phys;
-}
-
-static inline void * phys_to_virt(unsigned long address)
-{
-        return (void *)(IDENT_ADDR + (address & ((1ul << 41) - 1)));
-}
-#endif
-
-#define page_to_phys(page)     page_to_pa(page)
-
-static inline dma_addr_t __deprecated isa_page_to_bus(struct page *page)
-{
-       return page_to_phys(page);
-}
-
-/* This depends on working iommu.  */
-#define BIO_VMERGE_BOUNDARY    (alpha_mv.mv_pci_tbi ? PAGE_SIZE : 0)
-
-/* Maximum PIO space address supported?  */
-#define IO_SPACE_LIMIT 0xffff
-
-/*
- * Change addresses as seen by the kernel (virtual) to addresses as
- * seen by a device (bus), and vice versa.
- *
- * Note that this only works for a limited range of kernel addresses,
- * and very well may not span all memory.  Consider this interface 
- * deprecated in favour of the DMA-mapping API.
- */
-extern unsigned long __direct_map_base;
-extern unsigned long __direct_map_size;
-
-static inline unsigned long __deprecated virt_to_bus(void *address)
-{
-       unsigned long phys = virt_to_phys(address);
-       unsigned long bus = phys + __direct_map_base;
-       return phys <= __direct_map_size ? bus : 0;
-}
-#define isa_virt_to_bus virt_to_bus
-
-static inline void * __deprecated bus_to_virt(unsigned long address)
-{
-       void *virt;
-
-       /* This check is a sanity check but also ensures that bus address 0
-          maps to virtual address 0 which is useful to detect null pointers
-          (the NCR driver is much simpler if NULL pointers are preserved).  */
-       address -= __direct_map_base;
-       virt = phys_to_virt(address);
-       return (long)address <= 0 ? NULL : virt;
-}
-#define isa_bus_to_virt bus_to_virt
-
-/*
- * There are different chipsets to interface the Alpha CPUs to the world.
- */
-
-#define IO_CONCAT(a,b) _IO_CONCAT(a,b)
-#define _IO_CONCAT(a,b)        a ## _ ## b
-
-#ifdef CONFIG_ALPHA_GENERIC
-
-/* In a generic kernel, we always go through the machine vector.  */
-
-#define REMAP1(TYPE, NAME, QUAL)                                       \
-static inline TYPE generic_##NAME(QUAL void __iomem *addr)             \
-{                                                                      \
-       return alpha_mv.mv_##NAME(addr);                                \
-}
-
-#define REMAP2(TYPE, NAME, QUAL)                                       \
-static inline void generic_##NAME(TYPE b, QUAL void __iomem *addr)     \
-{                                                                      \
-       alpha_mv.mv_##NAME(b, addr);                                    \
-}
-
-REMAP1(unsigned int, ioread8, /**/)
-REMAP1(unsigned int, ioread16, /**/)
-REMAP1(unsigned int, ioread32, /**/)
-REMAP1(u8, readb, const volatile)
-REMAP1(u16, readw, const volatile)
-REMAP1(u32, readl, const volatile)
-REMAP1(u64, readq, const volatile)
-
-REMAP2(u8, iowrite8, /**/)
-REMAP2(u16, iowrite16, /**/)
-REMAP2(u32, iowrite32, /**/)
-REMAP2(u8, writeb, volatile)
-REMAP2(u16, writew, volatile)
-REMAP2(u32, writel, volatile)
-REMAP2(u64, writeq, volatile)
-
-#undef REMAP1
-#undef REMAP2
-
-extern inline void __iomem *generic_ioportmap(unsigned long a)
-{
-       return alpha_mv.mv_ioportmap(a);
-}
-
-static inline void __iomem *generic_ioremap(unsigned long a, unsigned long s)
-{
-       return alpha_mv.mv_ioremap(a, s);
-}
-
-static inline void generic_iounmap(volatile void __iomem *a)
-{
-       return alpha_mv.mv_iounmap(a);
-}
-
-static inline int generic_is_ioaddr(unsigned long a)
-{
-       return alpha_mv.mv_is_ioaddr(a);
-}
-
-static inline int generic_is_mmio(const volatile void __iomem *a)
-{
-       return alpha_mv.mv_is_mmio(a);
-}
-
-#define __IO_PREFIX            generic
-#define generic_trivial_rw_bw  0
-#define generic_trivial_rw_lq  0
-#define generic_trivial_io_bw  0
-#define generic_trivial_io_lq  0
-#define generic_trivial_iounmap        0
-
-#else
-
-#if defined(CONFIG_ALPHA_APECS)
-# include <asm/core_apecs.h>
-#elif defined(CONFIG_ALPHA_CIA)
-# include <asm/core_cia.h>
-#elif defined(CONFIG_ALPHA_IRONGATE)
-# include <asm/core_irongate.h>
-#elif defined(CONFIG_ALPHA_JENSEN)
-# include <asm/jensen.h>
-#elif defined(CONFIG_ALPHA_LCA)
-# include <asm/core_lca.h>
-#elif defined(CONFIG_ALPHA_MARVEL)
-# include <asm/core_marvel.h>
-#elif defined(CONFIG_ALPHA_MCPCIA)
-# include <asm/core_mcpcia.h>
-#elif defined(CONFIG_ALPHA_POLARIS)
-# include <asm/core_polaris.h>
-#elif defined(CONFIG_ALPHA_T2)
-# include <asm/core_t2.h>
-#elif defined(CONFIG_ALPHA_TSUNAMI)
-# include <asm/core_tsunami.h>
-#elif defined(CONFIG_ALPHA_TITAN)
-# include <asm/core_titan.h>
-#elif defined(CONFIG_ALPHA_WILDFIRE)
-# include <asm/core_wildfire.h>
-#else
-#error "What system is this?"
-#endif
-
-#endif /* GENERIC */
-
-/*
- * We always have external versions of these routines.
- */
-extern u8              inb(unsigned long port);
-extern u16             inw(unsigned long port);
-extern u32             inl(unsigned long port);
-extern void            outb(u8 b, unsigned long port);
-extern void            outw(u16 b, unsigned long port);
-extern void            outl(u32 b, unsigned long port);
-
-extern u8              readb(const volatile void __iomem *addr);
-extern u16             readw(const volatile void __iomem *addr);
-extern u32             readl(const volatile void __iomem *addr);
-extern u64             readq(const volatile void __iomem *addr);
-extern void            writeb(u8 b, volatile void __iomem *addr);
-extern void            writew(u16 b, volatile void __iomem *addr);
-extern void            writel(u32 b, volatile void __iomem *addr);
-extern void            writeq(u64 b, volatile void __iomem *addr);
-
-extern u8              __raw_readb(const volatile void __iomem *addr);
-extern u16             __raw_readw(const volatile void __iomem *addr);
-extern u32             __raw_readl(const volatile void __iomem *addr);
-extern u64             __raw_readq(const volatile void __iomem *addr);
-extern void            __raw_writeb(u8 b, volatile void __iomem *addr);
-extern void            __raw_writew(u16 b, volatile void __iomem *addr);
-extern void            __raw_writel(u32 b, volatile void __iomem *addr);
-extern void            __raw_writeq(u64 b, volatile void __iomem *addr);
-
-/*
- * Mapping from port numbers to __iomem space is pretty easy.
- */
-
-/* These two have to be extern inline because of the extern prototype from
-   <asm-generic/iomap.h>.  It is not legal to mix "extern" and "static" for
-   the same declaration.  */
-extern inline void __iomem *ioport_map(unsigned long port, unsigned int size)
-{
-       return IO_CONCAT(__IO_PREFIX,ioportmap) (port);
-}
-
-extern inline void ioport_unmap(void __iomem *addr)
-{
-}
-
-static inline void __iomem *ioremap(unsigned long port, unsigned long size)
-{
-       return IO_CONCAT(__IO_PREFIX,ioremap) (port, size);
-}
-
-static inline void __iomem *__ioremap(unsigned long port, unsigned long size,
-                                     unsigned long flags)
-{
-       return ioremap(port, size);
-}
-
-static inline void __iomem * ioremap_nocache(unsigned long offset,
-                                            unsigned long size)
-{
-       return ioremap(offset, size);
-} 
-
-static inline void iounmap(volatile void __iomem *addr)
-{
-       IO_CONCAT(__IO_PREFIX,iounmap)(addr);
-}
-
-static inline int __is_ioaddr(unsigned long addr)
-{
-       return IO_CONCAT(__IO_PREFIX,is_ioaddr)(addr);
-}
-#define __is_ioaddr(a)         __is_ioaddr((unsigned long)(a))
-
-static inline int __is_mmio(const volatile void __iomem *addr)
-{
-       return IO_CONCAT(__IO_PREFIX,is_mmio)(addr);
-}
-
-
-/*
- * If the actual I/O bits are sufficiently trivial, then expand inline.
- */
-
-#if IO_CONCAT(__IO_PREFIX,trivial_io_bw)
-extern inline unsigned int ioread8(void __iomem *addr)
-{
-       unsigned int ret = IO_CONCAT(__IO_PREFIX,ioread8)(addr);
-       mb();
-       return ret;
-}
-
-extern inline unsigned int ioread16(void __iomem *addr)
-{
-       unsigned int ret = IO_CONCAT(__IO_PREFIX,ioread16)(addr);
-       mb();
-       return ret;
-}
-
-extern inline void iowrite8(u8 b, void __iomem *addr)
-{
-       IO_CONCAT(__IO_PREFIX,iowrite8)(b, addr);
-       mb();
-}
-
-extern inline void iowrite16(u16 b, void __iomem *addr)
-{
-       IO_CONCAT(__IO_PREFIX,iowrite16)(b, addr);
-       mb();
-}
-
-extern inline u8 inb(unsigned long port)
-{
-       return ioread8(ioport_map(port, 1));
-}
-
-extern inline u16 inw(unsigned long port)
-{
-       return ioread16(ioport_map(port, 2));
-}
-
-extern inline void outb(u8 b, unsigned long port)
-{
-       iowrite8(b, ioport_map(port, 1));
-}
-
-extern inline void outw(u16 b, unsigned long port)
-{
-       iowrite16(b, ioport_map(port, 2));
-}
-#endif
-
-#if IO_CONCAT(__IO_PREFIX,trivial_io_lq)
-extern inline unsigned int ioread32(void __iomem *addr)
-{
-       unsigned int ret = IO_CONCAT(__IO_PREFIX,ioread32)(addr);
-       mb();
-       return ret;
-}
-
-extern inline void iowrite32(u32 b, void __iomem *addr)
-{
-       IO_CONCAT(__IO_PREFIX,iowrite32)(b, addr);
-       mb();
-}
-
-extern inline u32 inl(unsigned long port)
-{
-       return ioread32(ioport_map(port, 4));
-}
-
-extern inline void outl(u32 b, unsigned long port)
-{
-       iowrite32(b, ioport_map(port, 4));
-}
-#endif
-
-#if IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 1
-extern inline u8 __raw_readb(const volatile void __iomem *addr)
-{
-       return IO_CONCAT(__IO_PREFIX,readb)(addr);
-}
-
-extern inline u16 __raw_readw(const volatile void __iomem *addr)
-{
-       return IO_CONCAT(__IO_PREFIX,readw)(addr);
-}
-
-extern inline void __raw_writeb(u8 b, volatile void __iomem *addr)
-{
-       IO_CONCAT(__IO_PREFIX,writeb)(b, addr);
-}
-
-extern inline void __raw_writew(u16 b, volatile void __iomem *addr)
-{
-       IO_CONCAT(__IO_PREFIX,writew)(b, addr);
-}
-
-extern inline u8 readb(const volatile void __iomem *addr)
-{
-       u8 ret = __raw_readb(addr);
-       mb();
-       return ret;
-}
-
-extern inline u16 readw(const volatile void __iomem *addr)
-{
-       u16 ret = __raw_readw(addr);
-       mb();
-       return ret;
-}
-
-extern inline void writeb(u8 b, volatile void __iomem *addr)
-{
-       __raw_writeb(b, addr);
-       mb();
-}
-
-extern inline void writew(u16 b, volatile void __iomem *addr)
-{
-       __raw_writew(b, addr);
-       mb();
-}
-#endif
-
-#if IO_CONCAT(__IO_PREFIX,trivial_rw_lq) == 1
-extern inline u32 __raw_readl(const volatile void __iomem *addr)
-{
-       return IO_CONCAT(__IO_PREFIX,readl)(addr);
-}
-
-extern inline u64 __raw_readq(const volatile void __iomem *addr)
-{
-       return IO_CONCAT(__IO_PREFIX,readq)(addr);
-}
-
-extern inline void __raw_writel(u32 b, volatile void __iomem *addr)
-{
-       IO_CONCAT(__IO_PREFIX,writel)(b, addr);
-}
-
-extern inline void __raw_writeq(u64 b, volatile void __iomem *addr)
-{
-       IO_CONCAT(__IO_PREFIX,writeq)(b, addr);
-}
-
-extern inline u32 readl(const volatile void __iomem *addr)
-{
-       u32 ret = __raw_readl(addr);
-       mb();
-       return ret;
-}
-
-extern inline u64 readq(const volatile void __iomem *addr)
-{
-       u64 ret = __raw_readq(addr);
-       mb();
-       return ret;
-}
-
-extern inline void writel(u32 b, volatile void __iomem *addr)
-{
-       __raw_writel(b, addr);
-       mb();
-}
-
-extern inline void writeq(u64 b, volatile void __iomem *addr)
-{
-       __raw_writeq(b, addr);
-       mb();
-}
-#endif
-
-#define inb_p          inb
-#define inw_p          inw
-#define inl_p          inl
-#define outb_p         outb
-#define outw_p         outw
-#define outl_p         outl
-#define readb_relaxed(addr) __raw_readb(addr)
-#define readw_relaxed(addr) __raw_readw(addr)
-#define readl_relaxed(addr) __raw_readl(addr)
-#define readq_relaxed(addr) __raw_readq(addr)
-
-#define mmiowb()
-
-/*
- * String version of IO memory access ops:
- */
-extern void memcpy_fromio(void *, const volatile void __iomem *, long);
-extern void memcpy_toio(volatile void __iomem *, const void *, long);
-extern void _memset_c_io(volatile void __iomem *, unsigned long, long);
-
-static inline void memset_io(volatile void __iomem *addr, u8 c, long len)
-{
-       _memset_c_io(addr, 0x0101010101010101UL * c, len);
-}
-
-#define __HAVE_ARCH_MEMSETW_IO
-static inline void memsetw_io(volatile void __iomem *addr, u16 c, long len)
-{
-       _memset_c_io(addr, 0x0001000100010001UL * c, len);
-}
-
-/*
- * String versions of in/out ops:
- */
-extern void insb (unsigned long port, void *dst, unsigned long count);
-extern void insw (unsigned long port, void *dst, unsigned long count);
-extern void insl (unsigned long port, void *dst, unsigned long count);
-extern void outsb (unsigned long port, const void *src, unsigned long count);
-extern void outsw (unsigned long port, const void *src, unsigned long count);
-extern void outsl (unsigned long port, const void *src, unsigned long count);
-
-/*
- * The Alpha Jensen hardware for some rather strange reason puts
- * the RTC clock at 0x170 instead of 0x70. Probably due to some
- * misguided idea about using 0x70 for NMI stuff.
- *
- * These defines will override the defaults when doing RTC queries
- */
-
-#ifdef CONFIG_ALPHA_GENERIC
-# define RTC_PORT(x)   ((x) + alpha_mv.rtc_port)
-#else
-# ifdef CONFIG_ALPHA_JENSEN
-#  define RTC_PORT(x)  (0x170+(x))
-# else
-#  define RTC_PORT(x)  (0x70 + (x))
-# endif
-#endif
-#define RTC_ALWAYS_BCD 0
-
-/*
- * Some mucking forons use if[n]def writeq to check if platform has it.
- * It's a bloody bad idea and we probably want ARCH_HAS_WRITEQ for them
- * to play with; for now just use cpp anti-recursion logics and make sure
- * that damn thing is defined and expands to itself.
- */
-
-#define writeq writeq
-#define readq readq
-
-/*
- * Convert a physical pointer to a virtual kernel pointer for /dev/mem
- * access
- */
-#define xlate_dev_mem_ptr(p)   __va(p)
-
-/*
- * Convert a virtual cached pointer to an uncached pointer
- */
-#define xlate_dev_kmem_ptr(p)  p
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_IO_H */
diff --git a/include/asm-alpha/io_trivial.h b/include/asm-alpha/io_trivial.h
deleted file mode 100644 (file)
index 1c77f10..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Trivial implementations of basic i/o routines.  Assumes that all
-   of the hard work has been done by ioremap and ioportmap, and that
-   access to i/o space is linear.  */
-
-/* This file may be included multiple times.  */
-
-#if IO_CONCAT(__IO_PREFIX,trivial_io_bw)
-__EXTERN_INLINE unsigned int
-IO_CONCAT(__IO_PREFIX,ioread8)(void __iomem *a)
-{
-       return __kernel_ldbu(*(volatile u8 __force *)a);
-}
-
-__EXTERN_INLINE unsigned int
-IO_CONCAT(__IO_PREFIX,ioread16)(void __iomem *a)
-{
-       return __kernel_ldwu(*(volatile u16 __force *)a);
-}
-
-__EXTERN_INLINE void
-IO_CONCAT(__IO_PREFIX,iowrite8)(u8 b, void __iomem *a)
-{
-       __kernel_stb(b, *(volatile u8 __force *)a);
-}
-
-__EXTERN_INLINE void
-IO_CONCAT(__IO_PREFIX,iowrite16)(u16 b, void __iomem *a)
-{
-       __kernel_stw(b, *(volatile u16 __force *)a);
-}
-#endif
-
-#if IO_CONCAT(__IO_PREFIX,trivial_io_lq)
-__EXTERN_INLINE unsigned int
-IO_CONCAT(__IO_PREFIX,ioread32)(void __iomem *a)
-{
-       return *(volatile u32 __force *)a;
-}
-
-__EXTERN_INLINE void
-IO_CONCAT(__IO_PREFIX,iowrite32)(u32 b, void __iomem *a)
-{
-       *(volatile u32 __force *)a = b;
-}
-#endif
-
-#if IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 1
-__EXTERN_INLINE u8
-IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a)
-{
-       return __kernel_ldbu(*(const volatile u8 __force *)a);
-}
-
-__EXTERN_INLINE u16
-IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a)
-{
-       return __kernel_ldwu(*(const volatile u16 __force *)a);
-}
-
-__EXTERN_INLINE void
-IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a)
-{
-       __kernel_stb(b, *(volatile u8 __force *)a);
-}
-
-__EXTERN_INLINE void
-IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a)
-{
-       __kernel_stw(b, *(volatile u16 __force *)a);
-}
-#elif IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 2
-__EXTERN_INLINE u8
-IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a)
-{
-       void __iomem *addr = (void __iomem *)a;
-       return IO_CONCAT(__IO_PREFIX,ioread8)(addr);
-}
-
-__EXTERN_INLINE u16
-IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a)
-{
-       void __iomem *addr = (void __iomem *)a;
-       return IO_CONCAT(__IO_PREFIX,ioread16)(addr);
-}
-
-__EXTERN_INLINE void
-IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a)
-{
-       void __iomem *addr = (void __iomem *)a;
-       IO_CONCAT(__IO_PREFIX,iowrite8)(b, addr);
-}
-
-__EXTERN_INLINE void
-IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a)
-{
-       void __iomem *addr = (void __iomem *)a;
-       IO_CONCAT(__IO_PREFIX,iowrite16)(b, addr);
-}
-#endif
-
-#if IO_CONCAT(__IO_PREFIX,trivial_rw_lq) == 1
-__EXTERN_INLINE u32
-IO_CONCAT(__IO_PREFIX,readl)(const volatile void __iomem *a)
-{
-       return *(const volatile u32 __force *)a;
-}
-
-__EXTERN_INLINE u64
-IO_CONCAT(__IO_PREFIX,readq)(const volatile void __iomem *a)
-{
-       return *(const volatile u64 __force *)a;
-}
-
-__EXTERN_INLINE void
-IO_CONCAT(__IO_PREFIX,writel)(u32 b, volatile void __iomem *a)
-{
-       *(volatile u32 __force *)a = b;
-}
-
-__EXTERN_INLINE void
-IO_CONCAT(__IO_PREFIX,writeq)(u64 b, volatile void __iomem *a)
-{
-       *(volatile u64 __force *)a = b;
-}
-#endif
-
-#if IO_CONCAT(__IO_PREFIX,trivial_iounmap)
-__EXTERN_INLINE void IO_CONCAT(__IO_PREFIX,iounmap)(volatile void __iomem *a)
-{
-}
-#endif
diff --git a/include/asm-alpha/ioctl.h b/include/asm-alpha/ioctl.h
deleted file mode 100644 (file)
index fc63727..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef _ALPHA_IOCTL_H
-#define _ALPHA_IOCTL_H
-
-/*
- * The original linux ioctl numbering scheme was just a general
- * "anything goes" setup, where more or less random numbers were
- * assigned.  Sorry, I was clueless when I started out on this.
- *
- * On the alpha, we'll try to clean it up a bit, using a more sane
- * ioctl numbering, and also trying to be compatible with OSF/1 in
- * the process. I'd like to clean it up for the i386 as well, but
- * it's so painful recognizing both the new and the old numbers..
- */
-
-#define _IOC_NRBITS    8
-#define _IOC_TYPEBITS  8
-#define _IOC_SIZEBITS  13
-#define _IOC_DIRBITS   3
-
-#define _IOC_NRMASK    ((1 << _IOC_NRBITS)-1)
-#define _IOC_TYPEMASK  ((1 << _IOC_TYPEBITS)-1)
-#define _IOC_SIZEMASK  ((1 << _IOC_SIZEBITS)-1)
-#define _IOC_DIRMASK   ((1 << _IOC_DIRBITS)-1)
-
-#define _IOC_NRSHIFT   0
-#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
-#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
-#define _IOC_DIRSHIFT  (_IOC_SIZESHIFT+_IOC_SIZEBITS)
-
-/*
- * Direction bits _IOC_NONE could be 0, but OSF/1 gives it a bit.
- * And this turns out useful to catch old ioctl numbers in header
- * files for us.
- */
-#define _IOC_NONE      1U
-#define _IOC_READ      2U
-#define _IOC_WRITE     4U
-
-#define _IOC(dir,type,nr,size)                 \
-       ((unsigned int)                         \
-        (((dir)  << _IOC_DIRSHIFT) |           \
-         ((type) << _IOC_TYPESHIFT) |          \
-         ((nr)   << _IOC_NRSHIFT) |            \
-         ((size) << _IOC_SIZESHIFT)))
-
-/* used to create numbers */
-#define _IO(type,nr)           _IOC(_IOC_NONE,(type),(nr),0)
-#define _IOR(type,nr,size)     _IOC(_IOC_READ,(type),(nr),sizeof(size))
-#define _IOW(type,nr,size)     _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
-#define _IOWR(type,nr,size)    _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
-
-/* used to decode them.. */
-#define _IOC_DIR(nr)           (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
-#define _IOC_TYPE(nr)          (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
-#define _IOC_NR(nr)            (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
-#define _IOC_SIZE(nr)          (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
-
-/* ...and for the drivers/sound files... */
-
-#define IOC_IN         (_IOC_WRITE << _IOC_DIRSHIFT)
-#define IOC_OUT                (_IOC_READ << _IOC_DIRSHIFT)
-#define IOC_INOUT      ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
-#define IOCSIZE_MASK   (_IOC_SIZEMASK << _IOC_SIZESHIFT)
-#define IOCSIZE_SHIFT  (_IOC_SIZESHIFT)
-
-#endif /* _ALPHA_IOCTL_H */
diff --git a/include/asm-alpha/ioctls.h b/include/asm-alpha/ioctls.h
deleted file mode 100644 (file)
index 67bb9f6..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-#ifndef _ASM_ALPHA_IOCTLS_H
-#define _ASM_ALPHA_IOCTLS_H
-
-#include <asm/ioctl.h>
-
-#define FIOCLEX                _IO('f', 1)
-#define FIONCLEX       _IO('f', 2)
-#define FIOASYNC       _IOW('f', 125, int)
-#define FIONBIO                _IOW('f', 126, int)
-#define FIONREAD       _IOR('f', 127, int)
-#define TIOCINQ                FIONREAD
-#define FIOQSIZE       _IOR('f', 128, loff_t)
-
-#define TIOCGETP       _IOR('t', 8, struct sgttyb)
-#define TIOCSETP       _IOW('t', 9, struct sgttyb)
-#define TIOCSETN       _IOW('t', 10, struct sgttyb)    /* TIOCSETP wo flush */
-
-#define TIOCSETC       _IOW('t', 17, struct tchars)
-#define TIOCGETC       _IOR('t', 18, struct tchars)
-#define TCGETS         _IOR('t', 19, struct termios)
-#define TCSETS         _IOW('t', 20, struct termios)
-#define TCSETSW                _IOW('t', 21, struct termios)
-#define TCSETSF                _IOW('t', 22, struct termios)
-
-#define TCGETA         _IOR('t', 23, struct termio)
-#define TCSETA         _IOW('t', 24, struct termio)
-#define TCSETAW                _IOW('t', 25, struct termio)
-#define TCSETAF                _IOW('t', 28, struct termio)
-
-#define TCSBRK         _IO('t', 29)
-#define TCXONC         _IO('t', 30)
-#define TCFLSH         _IO('t', 31)
-
-#define TIOCSWINSZ     _IOW('t', 103, struct winsize)
-#define TIOCGWINSZ     _IOR('t', 104, struct winsize)
-#define        TIOCSTART       _IO('t', 110)           /* start output, like ^Q */
-#define        TIOCSTOP        _IO('t', 111)           /* stop output, like ^S */
-#define TIOCOUTQ        _IOR('t', 115, int)     /* output queue size */
-
-#define TIOCGLTC       _IOR('t', 116, struct ltchars)
-#define TIOCSLTC       _IOW('t', 117, struct ltchars)
-#define TIOCSPGRP      _IOW('t', 118, int)
-#define TIOCGPGRP      _IOR('t', 119, int)
-
-#define TIOCEXCL       0x540C
-#define TIOCNXCL       0x540D
-#define TIOCSCTTY      0x540E
-
-#define TIOCSTI                0x5412
-#define TIOCMGET       0x5415
-#define TIOCMBIS       0x5416
-#define TIOCMBIC       0x5417
-#define TIOCMSET       0x5418
-# define TIOCM_LE      0x001
-# define TIOCM_DTR     0x002
-# define TIOCM_RTS     0x004
-# define TIOCM_ST      0x008
-# define TIOCM_SR      0x010
-# define TIOCM_CTS     0x020
-# define TIOCM_CAR     0x040
-# define TIOCM_RNG     0x080
-# define TIOCM_DSR     0x100
-# define TIOCM_CD      TIOCM_CAR
-# define TIOCM_RI      TIOCM_RNG
-# define TIOCM_OUT1    0x2000
-# define TIOCM_OUT2    0x4000
-# define TIOCM_LOOP    0x8000
-
-#define TIOCGSOFTCAR   0x5419
-#define TIOCSSOFTCAR   0x541A
-#define TIOCLINUX      0x541C
-#define TIOCCONS       0x541D
-#define TIOCGSERIAL    0x541E
-#define TIOCSSERIAL    0x541F
-#define TIOCPKT                0x5420
-# define TIOCPKT_DATA           0
-# define TIOCPKT_FLUSHREAD      1
-# define TIOCPKT_FLUSHWRITE     2
-# define TIOCPKT_STOP           4
-# define TIOCPKT_START          8
-# define TIOCPKT_NOSTOP                16
-# define TIOCPKT_DOSTOP                32
-
-
-#define TIOCNOTTY      0x5422
-#define TIOCSETD       0x5423
-#define TIOCGETD       0x5424
-#define TCSBRKP                0x5425  /* Needed for POSIX tcsendbreak() */
-#define TIOCSBRK       0x5427  /* BSD compatibility */
-#define TIOCCBRK       0x5428  /* BSD compatibility */
-#define TIOCGSID       0x5429  /* Return the session ID of FD */
-#define TIOCGPTN       _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
-#define TIOCSPTLCK     _IOW('T',0x31, int)  /* Lock/unlock Pty */
-
-#define TIOCSERCONFIG  0x5453
-#define TIOCSERGWILD   0x5454
-#define TIOCSERSWILD   0x5455
-#define TIOCGLCKTRMIOS 0x5456
-#define TIOCSLCKTRMIOS 0x5457
-#define TIOCSERGSTRUCT 0x5458 /* For debugging only */
-#define TIOCSERGETLSR   0x5459 /* Get line status register */
-  /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
-# define TIOCSER_TEMT    0x01  /* Transmitter physically empty */
-#define TIOCSERGETMULTI 0x545A /* Get multiport config  */
-#define TIOCSERSETMULTI 0x545B /* Set multiport config */
-
-#define TIOCMIWAIT     0x545C  /* wait for a change on serial input line(s) */
-#define TIOCGICOUNT    0x545D  /* read serial port inline interrupt counts */
-#define TIOCGHAYESESP  0x545E  /* Get Hayes ESP configuration */
-#define TIOCSHAYESESP  0x545F  /* Set Hayes ESP configuration */
-
-#endif /* _ASM_ALPHA_IOCTLS_H */
diff --git a/include/asm-alpha/ipcbuf.h b/include/asm-alpha/ipcbuf.h
deleted file mode 100644 (file)
index d9c0e1a..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef _ALPHA_IPCBUF_H
-#define _ALPHA_IPCBUF_H
-
-/* 
- * The ipc64_perm structure for alpha architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space is left for:
- * - 32-bit seq
- * - 2 miscellaneous 64-bit values
- */
-
-struct ipc64_perm
-{
-       __kernel_key_t  key;
-       __kernel_uid_t  uid;
-       __kernel_gid_t  gid;
-       __kernel_uid_t  cuid;
-       __kernel_gid_t  cgid;
-       __kernel_mode_t mode; 
-       unsigned short  seq;
-       unsigned short  __pad1;
-       unsigned long   __unused1;
-       unsigned long   __unused2;
-};
-
-#endif /* _ALPHA_IPCBUF_H */
diff --git a/include/asm-alpha/irq.h b/include/asm-alpha/irq.h
deleted file mode 100644 (file)
index 0637740..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef _ALPHA_IRQ_H
-#define _ALPHA_IRQ_H
-
-/*
- *     linux/include/alpha/irq.h
- *
- *     (C) 1994 Linus Torvalds
- */
-
-#include <linux/linkage.h>
-
-#if   defined(CONFIG_ALPHA_GENERIC)
-
-/* Here NR_IRQS is not exact, but rather an upper bound.  This is used
-   many places throughout the kernel to size static arrays.  That's ok,
-   we'll use alpha_mv.nr_irqs when we want the real thing.  */
-
-/* When LEGACY_START_ADDRESS is selected, we leave out:
-     TITAN
-     WILDFIRE
-     MARVEL
-
-   This helps keep the kernel object size reasonable for the majority
-   of machines.
-*/
-
-# if defined(CONFIG_ALPHA_LEGACY_START_ADDRESS)
-#  define NR_IRQS      (128)           /* max is RAWHIDE/TAKARA */
-# else
-#  define NR_IRQS      (32768 + 16)    /* marvel - 32 pids */
-# endif
-
-#elif defined(CONFIG_ALPHA_CABRIOLET) || \
-      defined(CONFIG_ALPHA_EB66P)     || \
-      defined(CONFIG_ALPHA_EB164)     || \
-      defined(CONFIG_ALPHA_PC164)     || \
-      defined(CONFIG_ALPHA_LX164)
-# define NR_IRQS       35
-
-#elif defined(CONFIG_ALPHA_EB66)      || \
-      defined(CONFIG_ALPHA_EB64P)     || \
-      defined(CONFIG_ALPHA_MIKASA)
-# define NR_IRQS       32
-
-#elif defined(CONFIG_ALPHA_ALCOR)     || \
-      defined(CONFIG_ALPHA_MIATA)     || \
-      defined(CONFIG_ALPHA_RUFFIAN)   || \
-      defined(CONFIG_ALPHA_RX164)     || \
-      defined(CONFIG_ALPHA_NORITAKE)
-# define NR_IRQS       48
-
-#elif defined(CONFIG_ALPHA_SABLE)     || \
-      defined(CONFIG_ALPHA_SX164)
-# define NR_IRQS       40
-
-#elif defined(CONFIG_ALPHA_DP264) || \
-      defined(CONFIG_ALPHA_LYNX)  || \
-      defined(CONFIG_ALPHA_SHARK) || \
-      defined(CONFIG_ALPHA_EIGER)
-# define NR_IRQS       64
-
-#elif defined(CONFIG_ALPHA_TITAN)
-#define NR_IRQS                80
-
-#elif defined(CONFIG_ALPHA_RAWHIDE) || \
-       defined(CONFIG_ALPHA_TAKARA)
-# define NR_IRQS       128
-
-#elif defined(CONFIG_ALPHA_WILDFIRE)
-# define NR_IRQS       2048 /* enuff for 8 QBBs */
-
-#elif defined(CONFIG_ALPHA_MARVEL)
-# define NR_IRQS       (32768 + 16)    /* marvel - 32 pids*/
-
-#else /* everyone else */
-# define NR_IRQS       16
-#endif
-
-static __inline__ int irq_canonicalize(int irq)
-{
-       /*
-        * XXX is this true for all Alpha's?  The old serial driver
-        * did it this way for years without any complaints, so....
-        */
-       return ((irq == 2) ? 9 : irq);
-}
-
-struct pt_regs;
-extern void (*perf_irq)(unsigned long, struct pt_regs *);
-
-#endif /* _ALPHA_IRQ_H */
diff --git a/include/asm-alpha/irq_regs.h b/include/asm-alpha/irq_regs.h
deleted file mode 100644 (file)
index 3dd9c0b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <asm-generic/irq_regs.h>
diff --git a/include/asm-alpha/jensen.h b/include/asm-alpha/jensen.h
deleted file mode 100644 (file)
index 964b06e..0000000
+++ /dev/null
@@ -1,346 +0,0 @@
-#ifndef __ALPHA_JENSEN_H
-#define __ALPHA_JENSEN_H
-
-#include <asm/compiler.h>
-
-/*
- * Defines for the AlphaPC EISA IO and memory address space.
- */
-
-/*
- * NOTE! The memory operations do not set any memory barriers, as it's
- * not needed for cases like a frame buffer that is essentially memory-like.
- * You need to do them by hand if the operations depend on ordering.
- *
- * Similarly, the port IO operations do a "mb" only after a write operation:
- * if an mb is needed before (as in the case of doing memory mapped IO
- * first, and then a port IO operation to the same device), it needs to be
- * done by hand.
- *
- * After the above has bitten me 100 times, I'll give up and just do the
- * mb all the time, but right now I'm hoping this will work out.  Avoiding
- * mb's may potentially be a noticeable speed improvement, but I can't
- * honestly say I've tested it.
- *
- * Handling interrupts that need to do mb's to synchronize to non-interrupts
- * is another fun race area.  Don't do it (because if you do, I'll have to
- * do *everything* with interrupts disabled, ugh).
- */
-
-/*
- * EISA Interrupt Acknowledge address
- */
-#define EISA_INTA              (IDENT_ADDR + 0x100000000UL)
-
-/*
- * FEPROM addresses
- */
-#define EISA_FEPROM0           (IDENT_ADDR + 0x180000000UL)
-#define EISA_FEPROM1           (IDENT_ADDR + 0x1A0000000UL)
-
-/*
- * VL82C106 base address
- */
-#define EISA_VL82C106          (IDENT_ADDR + 0x1C0000000UL)
-
-/*
- * EISA "Host Address Extension" address (bits 25-31 of the EISA address)
- */
-#define EISA_HAE               (IDENT_ADDR + 0x1D0000000UL)
-
-/*
- * "SYSCTL" register address
- */
-#define EISA_SYSCTL            (IDENT_ADDR + 0x1E0000000UL)
-
-/*
- * "spare" register address
- */
-#define EISA_SPARE             (IDENT_ADDR + 0x1F0000000UL)
-
-/*
- * EISA memory address offset
- */
-#define EISA_MEM               (IDENT_ADDR + 0x200000000UL)
-
-/*
- * EISA IO address offset
- */
-#define EISA_IO                        (IDENT_ADDR + 0x300000000UL)
-
-
-#ifdef __KERNEL__
-
-#ifndef __EXTERN_INLINE
-#define __EXTERN_INLINE extern inline
-#define __IO_EXTERN_INLINE
-#endif
-
-/*
- * Handle the "host address register". This needs to be set
- * to the high 7 bits of the EISA address.  This is also needed
- * for EISA IO addresses, which are only 16 bits wide (the
- * hae needs to be set to 0).
- *
- * HAE isn't needed for the local IO operations, though.
- */
-
-#define JENSEN_HAE_ADDRESS     EISA_HAE
-#define JENSEN_HAE_MASK                0x1ffffff
-
-__EXTERN_INLINE void jensen_set_hae(unsigned long addr)
-{
-       /* hae on the Jensen is bits 31:25 shifted right */
-       addr >>= 25;
-       if (addr != alpha_mv.hae_cache)
-               set_hae(addr);
-}
-
-#define vuip   volatile unsigned int *
-
-/*
- * IO functions
- *
- * The "local" functions are those that don't go out to the EISA bus,
- * but instead act on the VL82C106 chip directly.. This is mainly the
- * keyboard, RTC,  printer and first two serial lines..
- *
- * The local stuff makes for some complications, but it seems to be
- * gone in the PCI version. I hope I can get DEC suckered^H^H^H^H^H^H^H^H
- * convinced that I need one of the newer machines.
- */
-
-static inline unsigned int jensen_local_inb(unsigned long addr)
-{
-       return 0xff & *(vuip)((addr << 9) + EISA_VL82C106);
-}
-
-static inline void jensen_local_outb(u8 b, unsigned long addr)
-{
-       *(vuip)((addr << 9) + EISA_VL82C106) = b;
-       mb();
-}
-
-static inline unsigned int jensen_bus_inb(unsigned long addr)
-{
-       long result;
-
-       jensen_set_hae(0);
-       result = *(volatile int *)((addr << 7) + EISA_IO + 0x00);
-       return __kernel_extbl(result, addr & 3);
-}
-
-static inline void jensen_bus_outb(u8 b, unsigned long addr)
-{
-       jensen_set_hae(0);
-       *(vuip)((addr << 7) + EISA_IO + 0x00) = b * 0x01010101;
-       mb();
-}
-
-/*
- * It seems gcc is not very good at optimizing away logical
- * operations that result in operations across inline functions.
- * Which is why this is a macro.
- */
-
-#define jensen_is_local(addr) ( \
-/* keyboard */ (addr == 0x60 || addr == 0x64) || \
-/* RTC */      (addr == 0x170 || addr == 0x171) || \
-/* mb COM2 */  (addr >= 0x2f8 && addr <= 0x2ff) || \
-/* mb LPT1 */  (addr >= 0x3bc && addr <= 0x3be) || \
-/* mb COM2 */  (addr >= 0x3f8 && addr <= 0x3ff))
-
-__EXTERN_INLINE u8 jensen_inb(unsigned long addr)
-{
-       if (jensen_is_local(addr))
-               return jensen_local_inb(addr);
-       else
-               return jensen_bus_inb(addr);
-}
-
-__EXTERN_INLINE void jensen_outb(u8 b, unsigned long addr)
-{
-       if (jensen_is_local(addr))
-               jensen_local_outb(b, addr);
-       else
-               jensen_bus_outb(b, addr);
-}
-
-__EXTERN_INLINE u16 jensen_inw(unsigned long addr)
-{
-       long result;
-
-       jensen_set_hae(0);
-       result = *(volatile int *) ((addr << 7) + EISA_IO + 0x20);
-       result >>= (addr & 3) * 8;
-       return 0xffffUL & result;
-}
-
-__EXTERN_INLINE u32 jensen_inl(unsigned long addr)
-{
-       jensen_set_hae(0);
-       return *(vuip) ((addr << 7) + EISA_IO + 0x60);
-}
-
-__EXTERN_INLINE void jensen_outw(u16 b, unsigned long addr)
-{
-       jensen_set_hae(0);
-       *(vuip) ((addr << 7) + EISA_IO + 0x20) = b * 0x00010001;
-       mb();
-}
-
-__EXTERN_INLINE void jensen_outl(u32 b, unsigned long addr)
-{
-       jensen_set_hae(0);
-       *(vuip) ((addr << 7) + EISA_IO + 0x60) = b;
-       mb();
-}
-
-/*
- * Memory functions.
- */
-
-__EXTERN_INLINE u8 jensen_readb(const volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       long result;
-
-       jensen_set_hae(addr);
-       addr &= JENSEN_HAE_MASK;
-       result = *(volatile int *) ((addr << 7) + EISA_MEM + 0x00);
-       result >>= (addr & 3) * 8;
-       return 0xffUL & result;
-}
-
-__EXTERN_INLINE u16 jensen_readw(const volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       long result;
-
-       jensen_set_hae(addr);
-       addr &= JENSEN_HAE_MASK;
-       result = *(volatile int *) ((addr << 7) + EISA_MEM + 0x20);
-       result >>= (addr & 3) * 8;
-       return 0xffffUL & result;
-}
-
-__EXTERN_INLINE u32 jensen_readl(const volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       jensen_set_hae(addr);
-       addr &= JENSEN_HAE_MASK;
-       return *(vuip) ((addr << 7) + EISA_MEM + 0x60);
-}
-
-__EXTERN_INLINE u64 jensen_readq(const volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       unsigned long r0, r1;
-
-       jensen_set_hae(addr);
-       addr &= JENSEN_HAE_MASK;
-       addr = (addr << 7) + EISA_MEM + 0x60;
-       r0 = *(vuip) (addr);
-       r1 = *(vuip) (addr + (4 << 7));
-       return r1 << 32 | r0;
-}
-
-__EXTERN_INLINE void jensen_writeb(u8 b, volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       jensen_set_hae(addr);
-       addr &= JENSEN_HAE_MASK;
-       *(vuip) ((addr << 7) + EISA_MEM + 0x00) = b * 0x01010101;
-}
-
-__EXTERN_INLINE void jensen_writew(u16 b, volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       jensen_set_hae(addr);
-       addr &= JENSEN_HAE_MASK;
-       *(vuip) ((addr << 7) + EISA_MEM + 0x20) = b * 0x00010001;
-}
-
-__EXTERN_INLINE void jensen_writel(u32 b, volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       jensen_set_hae(addr);
-       addr &= JENSEN_HAE_MASK;
-       *(vuip) ((addr << 7) + EISA_MEM + 0x60) = b;
-}
-
-__EXTERN_INLINE void jensen_writeq(u64 b, volatile void __iomem *xaddr)
-{
-       unsigned long addr = (unsigned long) xaddr;
-       jensen_set_hae(addr);
-       addr &= JENSEN_HAE_MASK;
-       addr = (addr << 7) + EISA_MEM + 0x60;
-       *(vuip) (addr) = b;
-       *(vuip) (addr + (4 << 7)) = b >> 32;
-}
-
-__EXTERN_INLINE void __iomem *jensen_ioportmap(unsigned long addr)
-{
-       return (void __iomem *)addr;
-}
-
-__EXTERN_INLINE void __iomem *jensen_ioremap(unsigned long addr,
-                                            unsigned long size)
-{
-       return (void __iomem *)(addr + 0x100000000ul);
-}
-
-__EXTERN_INLINE int jensen_is_ioaddr(unsigned long addr)
-{
-       return (long)addr >= 0;
-}
-
-__EXTERN_INLINE int jensen_is_mmio(const volatile void __iomem *addr)
-{
-       return (unsigned long)addr >= 0x100000000ul;
-}
-
-/* New-style ioread interface.  All the routines are so ugly for Jensen
-   that it doesn't make sense to merge them.  */
-
-#define IOPORT(OS, NS)                                                 \
-__EXTERN_INLINE unsigned int jensen_ioread##NS(void __iomem *xaddr)    \
-{                                                                      \
-       if (jensen_is_mmio(xaddr))                                      \
-               return jensen_read##OS(xaddr - 0x100000000ul);          \
-       else                                                            \
-               return jensen_in##OS((unsigned long)xaddr);             \
-}                                                                      \
-__EXTERN_INLINE void jensen_iowrite##NS(u##NS b, void __iomem *xaddr)  \
-{                                                                      \
-       if (jensen_is_mmio(xaddr))                                      \
-               jensen_write##OS(b, xaddr - 0x100000000ul);             \
-       else                                                            \
-               jensen_out##OS(b, (unsigned long)xaddr);                \
-}
-
-IOPORT(b, 8)
-IOPORT(w, 16)
-IOPORT(l, 32)
-
-#undef IOPORT
-
-#undef vuip
-
-#undef __IO_PREFIX
-#define __IO_PREFIX            jensen
-#define jensen_trivial_rw_bw   0
-#define jensen_trivial_rw_lq   0
-#define jensen_trivial_io_bw   0
-#define jensen_trivial_io_lq   0
-#define jensen_trivial_iounmap 1
-#include <asm/io_trivial.h>
-
-#ifdef __IO_EXTERN_INLINE
-#undef __EXTERN_INLINE
-#undef __IO_EXTERN_INLINE
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_JENSEN_H */
diff --git a/include/asm-alpha/kdebug.h b/include/asm-alpha/kdebug.h
deleted file mode 100644 (file)
index 6ece1b0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <asm-generic/kdebug.h>
diff --git a/include/asm-alpha/kmap_types.h b/include/asm-alpha/kmap_types.h
deleted file mode 100644 (file)
index 3e6735a..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef _ASM_KMAP_TYPES_H
-#define _ASM_KMAP_TYPES_H
-
-/* Dummy header just to define km_type. */
-
-
-#ifdef CONFIG_DEBUG_HIGHMEM
-# define D(n) __KM_FENCE_##n ,
-#else
-# define D(n)
-#endif
-
-enum km_type {
-D(0)   KM_BOUNCE_READ,
-D(1)   KM_SKB_SUNRPC_DATA,
-D(2)   KM_SKB_DATA_SOFTIRQ,
-D(3)   KM_USER0,
-D(4)   KM_USER1,
-D(5)   KM_BIO_SRC_IRQ,
-D(6)   KM_BIO_DST_IRQ,
-D(7)   KM_PTE0,
-D(8)   KM_PTE1,
-D(9)   KM_IRQ0,
-D(10)  KM_IRQ1,
-D(11)  KM_SOFTIRQ0,
-D(12)  KM_SOFTIRQ1,
-D(13)  KM_TYPE_NR
-};
-
-#undef D
-
-#endif
diff --git a/include/asm-alpha/linkage.h b/include/asm-alpha/linkage.h
deleted file mode 100644 (file)
index 291c2d0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef __ASM_LINKAGE_H
-#define __ASM_LINKAGE_H
-
-/* Nothing to see here... */
-
-#endif
diff --git a/include/asm-alpha/local.h b/include/asm-alpha/local.h
deleted file mode 100644 (file)
index 6ad3ea6..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-#ifndef _ALPHA_LOCAL_H
-#define _ALPHA_LOCAL_H
-
-#include <linux/percpu.h>
-#include <asm/atomic.h>
-
-typedef struct
-{
-       atomic_long_t a;
-} local_t;
-
-#define LOCAL_INIT(i)  { ATOMIC_LONG_INIT(i) }
-#define local_read(l)  atomic_long_read(&(l)->a)
-#define local_set(l,i) atomic_long_set(&(l)->a, (i))
-#define local_inc(l)   atomic_long_inc(&(l)->a)
-#define local_dec(l)   atomic_long_dec(&(l)->a)
-#define local_add(i,l) atomic_long_add((i),(&(l)->a))
-#define local_sub(i,l) atomic_long_sub((i),(&(l)->a))
-
-static __inline__ long local_add_return(long i, local_t * l)
-{
-       long temp, result;
-       __asm__ __volatile__(
-       "1:     ldq_l %0,%1\n"
-       "       addq %0,%3,%2\n"
-       "       addq %0,%3,%0\n"
-       "       stq_c %0,%1\n"
-       "       beq %0,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (l->a.counter), "=&r" (result)
-       :"Ir" (i), "m" (l->a.counter) : "memory");
-       return result;
-}
-
-static __inline__ long local_sub_return(long i, local_t * l)
-{
-       long temp, result;
-       __asm__ __volatile__(
-       "1:     ldq_l %0,%1\n"
-       "       subq %0,%3,%2\n"
-       "       subq %0,%3,%0\n"
-       "       stq_c %0,%1\n"
-       "       beq %0,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (l->a.counter), "=&r" (result)
-       :"Ir" (i), "m" (l->a.counter) : "memory");
-       return result;
-}
-
-#define local_cmpxchg(l, o, n) \
-       (cmpxchg_local(&((l)->a.counter), (o), (n)))
-#define local_xchg(l, n) (xchg_local(&((l)->a.counter), (n)))
-
-/**
- * local_add_unless - add unless the number is a given value
- * @l: pointer of type local_t
- * @a: the amount to add to l...
- * @u: ...unless l is equal to u.
- *
- * Atomically adds @a to @l, so long as it was not @u.
- * Returns non-zero if @l was not @u, and zero otherwise.
- */
-#define local_add_unless(l, a, u)                              \
-({                                                             \
-       long c, old;                                            \
-       c = local_read(l);                                      \
-       for (;;) {                                              \
-               if (unlikely(c == (u)))                         \
-                       break;                                  \
-               old = local_cmpxchg((l), c, c + (a));   \
-               if (likely(old == c))                           \
-                       break;                                  \
-               c = old;                                        \
-       }                                                       \
-       c != (u);                                               \
-})
-#define local_inc_not_zero(l) local_add_unless((l), 1, 0)
-
-#define local_add_negative(a, l) (local_add_return((a), (l)) < 0)
-
-#define local_dec_return(l) local_sub_return(1,(l))
-
-#define local_inc_return(l) local_add_return(1,(l))
-
-#define local_sub_and_test(i,l) (local_sub_return((i), (l)) == 0)
-
-#define local_inc_and_test(l) (local_add_return(1, (l)) == 0)
-
-#define local_dec_and_test(l) (local_sub_return(1, (l)) == 0)
-
-/* Verify if faster than atomic ops */
-#define __local_inc(l)         ((l)->a.counter++)
-#define __local_dec(l)         ((l)->a.counter++)
-#define __local_add(i,l)       ((l)->a.counter+=(i))
-#define __local_sub(i,l)       ((l)->a.counter-=(i))
-
-/* Use these for per-cpu local_t variables: on some archs they are
- * much more efficient than these naive implementations.  Note they take
- * a variable, not an address.
- */
-#define cpu_local_read(l)      local_read(&__get_cpu_var(l))
-#define cpu_local_set(l, i)    local_set(&__get_cpu_var(l), (i))
-
-#define cpu_local_inc(l)       local_inc(&__get_cpu_var(l))
-#define cpu_local_dec(l)       local_dec(&__get_cpu_var(l))
-#define cpu_local_add(i, l)    local_add((i), &__get_cpu_var(l))
-#define cpu_local_sub(i, l)    local_sub((i), &__get_cpu_var(l))
-
-#define __cpu_local_inc(l)     __local_inc(&__get_cpu_var(l))
-#define __cpu_local_dec(l)     __local_dec(&__get_cpu_var(l))
-#define __cpu_local_add(i, l)  __local_add((i), &__get_cpu_var(l))
-#define __cpu_local_sub(i, l)  __local_sub((i), &__get_cpu_var(l))
-
-#endif /* _ALPHA_LOCAL_H */
diff --git a/include/asm-alpha/machvec.h b/include/asm-alpha/machvec.h
deleted file mode 100644 (file)
index a86c083..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-#ifndef __ALPHA_MACHVEC_H
-#define __ALPHA_MACHVEC_H 1
-
-#include <linux/types.h>
-
-/*
- *     This file gets pulled in by asm/io.h from user space. We don't
- *     want most of this escaping.
- */
-#ifdef __KERNEL__
-
-/* The following structure vectors all of the I/O and IRQ manipulation
-   from the generic kernel to the hardware specific backend.  */
-
-struct task_struct;
-struct mm_struct;
-struct vm_area_struct;
-struct linux_hose_info;
-struct pci_dev;
-struct pci_ops;
-struct pci_controller;
-struct _alpha_agp_info;
-
-struct alpha_machine_vector
-{
-       /* This "belongs" down below with the rest of the runtime
-          variables, but it is convenient for entry.S if these 
-          two slots are at the beginning of the struct.  */
-       unsigned long hae_cache;
-       unsigned long *hae_register;
-
-       int nr_irqs;
-       int rtc_port;
-       unsigned int max_asn;
-       unsigned long max_isa_dma_address;
-       unsigned long irq_probe_mask;
-       unsigned long iack_sc;
-       unsigned long min_io_address;
-       unsigned long min_mem_address;
-       unsigned long pci_dac_offset;
-
-       void (*mv_pci_tbi)(struct pci_controller *hose,
-                          dma_addr_t start, dma_addr_t end);
-
-       unsigned int (*mv_ioread8)(void __iomem *);
-       unsigned int (*mv_ioread16)(void __iomem *);
-       unsigned int (*mv_ioread32)(void __iomem *);
-
-       void (*mv_iowrite8)(u8, void __iomem *);
-       void (*mv_iowrite16)(u16, void __iomem *);
-       void (*mv_iowrite32)(u32, void __iomem *);
-
-       u8 (*mv_readb)(const volatile void __iomem *);
-       u16 (*mv_readw)(const volatile void __iomem *);
-       u32 (*mv_readl)(const volatile void __iomem *);
-       u64 (*mv_readq)(const volatile void __iomem *);
-
-       void (*mv_writeb)(u8, volatile void __iomem *);
-       void (*mv_writew)(u16, volatile void __iomem *);
-       void (*mv_writel)(u32, volatile void __iomem *);
-       void (*mv_writeq)(u64, volatile void __iomem *);
-
-       void __iomem *(*mv_ioportmap)(unsigned long);
-       void __iomem *(*mv_ioremap)(unsigned long, unsigned long);
-       void (*mv_iounmap)(volatile void __iomem *);
-       int (*mv_is_ioaddr)(unsigned long);
-       int (*mv_is_mmio)(const volatile void __iomem *);
-
-       void (*mv_switch_mm)(struct mm_struct *, struct mm_struct *,
-                            struct task_struct *);
-       void (*mv_activate_mm)(struct mm_struct *, struct mm_struct *);
-
-       void (*mv_flush_tlb_current)(struct mm_struct *);
-       void (*mv_flush_tlb_current_page)(struct mm_struct * mm,
-                                         struct vm_area_struct *vma,
-                                         unsigned long addr);
-
-       void (*update_irq_hw)(unsigned long, unsigned long, int);
-       void (*ack_irq)(unsigned long);
-       void (*device_interrupt)(unsigned long vector);
-       void (*machine_check)(u64 vector, u64 la);
-
-       void (*smp_callin)(void);
-       void (*init_arch)(void);
-       void (*init_irq)(void);
-       void (*init_rtc)(void);
-       void (*init_pci)(void);
-       void (*kill_arch)(int);
-
-       u8 (*pci_swizzle)(struct pci_dev *, u8 *);
-       int (*pci_map_irq)(struct pci_dev *, u8, u8);
-       struct pci_ops *pci_ops;
-
-       struct _alpha_agp_info *(*agp_info)(void);
-
-       const char *vector_name;
-
-       /* NUMA information */
-       int (*pa_to_nid)(unsigned long);
-       int (*cpuid_to_nid)(int);
-       unsigned long (*node_mem_start)(int);
-       unsigned long (*node_mem_size)(int);
-
-       /* System specific parameters.  */
-       union {
-           struct {
-               unsigned long gru_int_req_bits;
-           } cia;
-
-           struct {
-               unsigned long gamma_bias;
-           } t2;
-
-           struct {
-               unsigned int route_tab;
-           } sio;
-       } sys;
-};
-
-extern struct alpha_machine_vector alpha_mv;
-
-#ifdef CONFIG_ALPHA_GENERIC
-extern int alpha_using_srm;
-#else
-#ifdef CONFIG_ALPHA_SRM
-#define alpha_using_srm 1
-#else
-#define alpha_using_srm 0
-#endif
-#endif /* GENERIC */
-
-#endif
-#endif /* __ALPHA_MACHVEC_H */
diff --git a/include/asm-alpha/mc146818rtc.h b/include/asm-alpha/mc146818rtc.h
deleted file mode 100644 (file)
index 097703f..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Machine dependent access functions for RTC registers.
- */
-#ifndef __ASM_ALPHA_MC146818RTC_H
-#define __ASM_ALPHA_MC146818RTC_H
-
-#include <asm/io.h>
-
-#ifndef RTC_PORT
-#define RTC_PORT(x)    (0x70 + (x))
-#define RTC_ALWAYS_BCD 1       /* RTC operates in binary mode */
-#endif
-
-/*
- * The yet supported machines all access the RTC index register via
- * an ISA port access but the way to access the date register differs ...
- */
-#define CMOS_READ(addr) ({ \
-outb_p((addr),RTC_PORT(0)); \
-inb_p(RTC_PORT(1)); \
-})
-#define CMOS_WRITE(val, addr) ({ \
-outb_p((addr),RTC_PORT(0)); \
-outb_p((val),RTC_PORT(1)); \
-})
-
-#endif /* __ASM_ALPHA_MC146818RTC_H */
diff --git a/include/asm-alpha/md.h b/include/asm-alpha/md.h
deleted file mode 100644 (file)
index 6c9b822..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/* $Id: md.h,v 1.1 1997/12/15 15:11:48 jj Exp $
- * md.h: High speed xor_block operation for RAID4/5 
- *
- */
-#ifndef __ASM_MD_H
-#define __ASM_MD_H
-
-/* #define HAVE_ARCH_XORBLOCK */
-
-#define MD_XORBLOCK_ALIGNMENT  sizeof(long)
-
-#endif /* __ASM_MD_H */
diff --git a/include/asm-alpha/mman.h b/include/asm-alpha/mman.h
deleted file mode 100644 (file)
index 90d7c35..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef __ALPHA_MMAN_H__
-#define __ALPHA_MMAN_H__
-
-#define PROT_READ      0x1             /* page can be read */
-#define PROT_WRITE     0x2             /* page can be written */
-#define PROT_EXEC      0x4             /* page can be executed */
-#define PROT_SEM       0x8             /* page may be used for atomic ops */
-#define PROT_NONE      0x0             /* page can not be accessed */
-#define PROT_GROWSDOWN 0x01000000      /* mprotect flag: extend change to start of growsdown vma */
-#define PROT_GROWSUP   0x02000000      /* mprotect flag: extend change to end of growsup vma */
-
-#define MAP_SHARED     0x01            /* Share changes */
-#define MAP_PRIVATE    0x02            /* Changes are private */
-#define MAP_TYPE       0x0f            /* Mask for type of mapping (OSF/1 is _wrong_) */
-#define MAP_FIXED      0x100           /* Interpret addr exactly */
-#define MAP_ANONYMOUS  0x10            /* don't use a file */
-
-/* not used by linux, but here to make sure we don't clash with OSF/1 defines */
-#define _MAP_HASSEMAPHORE 0x0200
-#define _MAP_INHERIT   0x0400
-#define _MAP_UNALIGNED 0x0800
-
-/* These are linux-specific */
-#define MAP_GROWSDOWN  0x01000         /* stack-like segment */
-#define MAP_DENYWRITE  0x02000         /* ETXTBSY */
-#define MAP_EXECUTABLE 0x04000         /* mark it as an executable */
-#define MAP_LOCKED     0x08000         /* lock the mapping */
-#define MAP_NORESERVE  0x10000         /* don't check for reservations */
-#define MAP_POPULATE   0x20000         /* populate (prefault) pagetables */
-#define MAP_NONBLOCK   0x40000         /* do not block on IO */
-
-#define MS_ASYNC       1               /* sync memory asynchronously */
-#define MS_SYNC                2               /* synchronous memory sync */
-#define MS_INVALIDATE  4               /* invalidate the caches */
-
-#define MCL_CURRENT     8192           /* lock all currently mapped pages */
-#define MCL_FUTURE     16384           /* lock all additions to address space */
-
-#define MADV_NORMAL    0               /* no further special treatment */
-#define MADV_RANDOM    1               /* expect random page references */
-#define MADV_SEQUENTIAL        2               /* expect sequential page references */
-#define MADV_WILLNEED  3               /* will need these pages */
-#define        MADV_SPACEAVAIL 5               /* ensure resources are available */
-#define MADV_DONTNEED  6               /* don't need these pages */
-
-/* common/generic parameters */
-#define MADV_REMOVE    9               /* remove these pages & resources */
-#define MADV_DONTFORK  10              /* don't inherit across fork */
-#define MADV_DOFORK    11              /* do inherit across fork */
-
-/* compatibility flags */
-#define MAP_FILE       0
-
-#endif /* __ALPHA_MMAN_H__ */
diff --git a/include/asm-alpha/mmu.h b/include/asm-alpha/mmu.h
deleted file mode 100644 (file)
index 3dc1277..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef __ALPHA_MMU_H
-#define __ALPHA_MMU_H
-
-/* The alpha MMU context is one "unsigned long" bitmap per CPU */
-typedef unsigned long mm_context_t[NR_CPUS];
-
-#endif
diff --git a/include/asm-alpha/mmu_context.h b/include/asm-alpha/mmu_context.h
deleted file mode 100644 (file)
index 86c08a0..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-#ifndef __ALPHA_MMU_CONTEXT_H
-#define __ALPHA_MMU_CONTEXT_H
-
-/*
- * get a new mmu context..
- *
- * Copyright (C) 1996, Linus Torvalds
- */
-
-#include <asm/system.h>
-#include <asm/machvec.h>
-#include <asm/compiler.h>
-#include <asm-generic/mm_hooks.h>
-
-/*
- * Force a context reload. This is needed when we change the page
- * table pointer or when we update the ASN of the current process.
- */
-
-/* Don't get into trouble with dueling __EXTERN_INLINEs.  */
-#ifndef __EXTERN_INLINE
-#include <asm/io.h>
-#endif
-
-
-static inline unsigned long
-__reload_thread(struct pcb_struct *pcb)
-{
-       register unsigned long a0 __asm__("$16");
-       register unsigned long v0 __asm__("$0");
-
-       a0 = virt_to_phys(pcb);
-       __asm__ __volatile__(
-               "call_pal %2 #__reload_thread"
-               : "=r"(v0), "=r"(a0)
-               : "i"(PAL_swpctx), "r"(a0)
-               : "$1", "$22", "$23", "$24", "$25");
-
-       return v0;
-}
-
-
-/*
- * The maximum ASN's the processor supports.  On the EV4 this is 63
- * but the PAL-code doesn't actually use this information.  On the
- * EV5 this is 127, and EV6 has 255.
- *
- * On the EV4, the ASNs are more-or-less useless anyway, as they are
- * only used as an icache tag, not for TB entries.  On the EV5 and EV6,
- * ASN's also validate the TB entries, and thus make a lot more sense.
- *
- * The EV4 ASN's don't even match the architecture manual, ugh.  And
- * I quote: "If a processor implements address space numbers (ASNs),
- * and the old PTE has the Address Space Match (ASM) bit clear (ASNs
- * in use) and the Valid bit set, then entries can also effectively be
- * made coherent by assigning a new, unused ASN to the currently
- * running process and not reusing the previous ASN before calling the
- * appropriate PALcode routine to invalidate the translation buffer (TB)". 
- *
- * In short, the EV4 has a "kind of" ASN capability, but it doesn't actually
- * work correctly and can thus not be used (explaining the lack of PAL-code
- * support).
- */
-#define EV4_MAX_ASN 63
-#define EV5_MAX_ASN 127
-#define EV6_MAX_ASN 255
-
-#ifdef CONFIG_ALPHA_GENERIC
-# define MAX_ASN       (alpha_mv.max_asn)
-#else
-# ifdef CONFIG_ALPHA_EV4
-#  define MAX_ASN      EV4_MAX_ASN
-# elif defined(CONFIG_ALPHA_EV5)
-#  define MAX_ASN      EV5_MAX_ASN
-# else
-#  define MAX_ASN      EV6_MAX_ASN
-# endif
-#endif
-
-/*
- * cpu_last_asn(processor):
- * 63                                            0
- * +-------------+----------------+--------------+
- * | asn version | this processor | hardware asn |
- * +-------------+----------------+--------------+
- */
-
-#include <asm/smp.h>
-#ifdef CONFIG_SMP
-#define cpu_last_asn(cpuid)    (cpu_data[cpuid].last_asn)
-#else
-extern unsigned long last_asn;
-#define cpu_last_asn(cpuid)    last_asn
-#endif /* CONFIG_SMP */
-
-#define WIDTH_HARDWARE_ASN     8
-#define ASN_FIRST_VERSION (1UL << WIDTH_HARDWARE_ASN)
-#define HARDWARE_ASN_MASK ((1UL << WIDTH_HARDWARE_ASN) - 1)
-
-/*
- * NOTE! The way this is set up, the high bits of the "asn_cache" (and
- * the "mm->context") are the ASN _version_ code. A version of 0 is
- * always considered invalid, so to invalidate another process you only
- * need to do "p->mm->context = 0".
- *
- * If we need more ASN's than the processor has, we invalidate the old
- * user TLB's (tbiap()) and start a new ASN version. That will automatically
- * force a new asn for any other processes the next time they want to
- * run.
- */
-
-#ifndef __EXTERN_INLINE
-#define __EXTERN_INLINE extern inline
-#define __MMU_EXTERN_INLINE
-#endif
-
-extern inline unsigned long
-__get_new_mm_context(struct mm_struct *mm, long cpu)
-{
-       unsigned long asn = cpu_last_asn(cpu);
-       unsigned long next = asn + 1;
-
-       if ((asn & HARDWARE_ASN_MASK) >= MAX_ASN) {
-               tbiap();
-               imb();
-               next = (asn & ~HARDWARE_ASN_MASK) + ASN_FIRST_VERSION;
-       }
-       cpu_last_asn(cpu) = next;
-       return next;
-}
-
-__EXTERN_INLINE void
-ev5_switch_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm,
-             struct task_struct *next)
-{
-       /* Check if our ASN is of an older version, and thus invalid. */
-       unsigned long asn;
-       unsigned long mmc;
-       long cpu = smp_processor_id();
-
-#ifdef CONFIG_SMP
-       cpu_data[cpu].asn_lock = 1;
-       barrier();
-#endif
-       asn = cpu_last_asn(cpu);
-       mmc = next_mm->context[cpu];
-       if ((mmc ^ asn) & ~HARDWARE_ASN_MASK) {
-               mmc = __get_new_mm_context(next_mm, cpu);
-               next_mm->context[cpu] = mmc;
-       }
-#ifdef CONFIG_SMP
-       else
-               cpu_data[cpu].need_new_asn = 1;
-#endif
-
-       /* Always update the PCB ASN.  Another thread may have allocated
-          a new mm->context (via flush_tlb_mm) without the ASN serial
-          number wrapping.  We have no way to detect when this is needed.  */
-       task_thread_info(next)->pcb.asn = mmc & HARDWARE_ASN_MASK;
-}
-
-__EXTERN_INLINE void
-ev4_switch_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm,
-             struct task_struct *next)
-{
-       /* As described, ASN's are broken for TLB usage.  But we can
-          optimize for switching between threads -- if the mm is
-          unchanged from current we needn't flush.  */
-       /* ??? May not be needed because EV4 PALcode recognizes that
-          ASN's are broken and does a tbiap itself on swpctx, under
-          the "Must set ASN or flush" rule.  At least this is true
-          for a 1992 SRM, reports Joseph Martin (jmartin@hlo.dec.com).
-          I'm going to leave this here anyway, just to Be Sure.  -- r~  */
-       if (prev_mm != next_mm)
-               tbiap();
-
-       /* Do continue to allocate ASNs, because we can still use them
-          to avoid flushing the icache.  */
-       ev5_switch_mm(prev_mm, next_mm, next);
-}
-
-extern void __load_new_mm_context(struct mm_struct *);
-
-#ifdef CONFIG_SMP
-#define check_mmu_context()                                    \
-do {                                                           \
-       int cpu = smp_processor_id();                           \
-       cpu_data[cpu].asn_lock = 0;                             \
-       barrier();                                              \
-       if (cpu_data[cpu].need_new_asn) {                       \
-               struct mm_struct * mm = current->active_mm;     \
-               cpu_data[cpu].need_new_asn = 0;                 \
-               if (!mm->context[cpu])                  \
-                       __load_new_mm_context(mm);              \
-       }                                                       \
-} while(0)
-#else
-#define check_mmu_context()  do { } while(0)
-#endif
-
-__EXTERN_INLINE void
-ev5_activate_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm)
-{
-       __load_new_mm_context(next_mm);
-}
-
-__EXTERN_INLINE void
-ev4_activate_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm)
-{
-       __load_new_mm_context(next_mm);
-       tbiap();
-}
-
-#define deactivate_mm(tsk,mm)  do { } while (0)
-
-#ifdef CONFIG_ALPHA_GENERIC
-# define switch_mm(a,b,c)      alpha_mv.mv_switch_mm((a),(b),(c))
-# define activate_mm(x,y)      alpha_mv.mv_activate_mm((x),(y))
-#else
-# ifdef CONFIG_ALPHA_EV4
-#  define switch_mm(a,b,c)     ev4_switch_mm((a),(b),(c))
-#  define activate_mm(x,y)     ev4_activate_mm((x),(y))
-# else
-#  define switch_mm(a,b,c)     ev5_switch_mm((a),(b),(c))
-#  define activate_mm(x,y)     ev5_activate_mm((x),(y))
-# endif
-#endif
-
-static inline int
-init_new_context(struct task_struct *tsk, struct mm_struct *mm)
-{
-       int i;
-
-       for_each_online_cpu(i)
-               mm->context[i] = 0;
-       if (tsk != current)
-               task_thread_info(tsk)->pcb.ptbr
-                 = ((unsigned long)mm->pgd - IDENT_ADDR) >> PAGE_SHIFT;
-       return 0;
-}
-
-extern inline void
-destroy_context(struct mm_struct *mm)
-{
-       /* Nothing to do.  */
-}
-
-static inline void
-enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
-{
-       task_thread_info(tsk)->pcb.ptbr
-         = ((unsigned long)mm->pgd - IDENT_ADDR) >> PAGE_SHIFT;
-}
-
-#ifdef __MMU_EXTERN_INLINE
-#undef __EXTERN_INLINE
-#undef __MMU_EXTERN_INLINE
-#endif
-
-#endif /* __ALPHA_MMU_CONTEXT_H */
diff --git a/include/asm-alpha/mmzone.h b/include/asm-alpha/mmzone.h
deleted file mode 100644 (file)
index 8af56ce..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Written by Kanoj Sarcar (kanoj@sgi.com) Aug 99
- * Adapted for the alpha wildfire architecture Jan 2001.
- */
-#ifndef _ASM_MMZONE_H_
-#define _ASM_MMZONE_H_
-
-#include <asm/smp.h>
-
-struct bootmem_data_t; /* stupid forward decl. */
-
-/*
- * Following are macros that are specific to this numa platform.
- */
-
-extern pg_data_t node_data[];
-
-#define alpha_pa_to_nid(pa)            \
-        (alpha_mv.pa_to_nid            \
-        ? alpha_mv.pa_to_nid(pa)       \
-        : (0))
-#define node_mem_start(nid)            \
-        (alpha_mv.node_mem_start       \
-        ? alpha_mv.node_mem_start(nid) \
-        : (0UL))
-#define node_mem_size(nid)             \
-        (alpha_mv.node_mem_size        \
-        ? alpha_mv.node_mem_size(nid)  \
-        : ((nid) ? (0UL) : (~0UL)))
-
-#define pa_to_nid(pa)          alpha_pa_to_nid(pa)
-#define NODE_DATA(nid)         (&node_data[(nid)])
-
-#define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn)
-
-#if 1
-#define PLAT_NODE_DATA_LOCALNR(p, n)   \
-       (((p) >> PAGE_SHIFT) - PLAT_NODE_DATA(n)->gendata.node_start_pfn)
-#else
-static inline unsigned long
-PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
-{
-       unsigned long temp;
-       temp = p >> PAGE_SHIFT;
-       return temp - PLAT_NODE_DATA(n)->gendata.node_start_pfn;
-}
-#endif
-
-#ifdef CONFIG_DISCONTIGMEM
-
-/*
- * Following are macros that each numa implementation must define.
- */
-
-/*
- * Given a kernel address, find the home node of the underlying memory.
- */
-#define kvaddr_to_nid(kaddr)   pa_to_nid(__pa(kaddr))
-#define node_start_pfn(nid)    (NODE_DATA(nid)->node_start_pfn)
-
-/*
- * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory
- * and returns the kaddr corresponding to first physical page in the
- * node's mem_map.
- */
-#define LOCAL_BASE_ADDR(kaddr)                                           \
-    ((unsigned long)__va(NODE_DATA(kvaddr_to_nid(kaddr))->node_start_pfn  \
-                        << PAGE_SHIFT))
-
-/* XXX: FIXME -- wli */
-#define kern_addr_valid(kaddr) (0)
-
-#define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
-
-#define VALID_PAGE(page)       (((page) - mem_map) < max_mapnr)
-
-#define pmd_page(pmd)          (pfn_to_page(pmd_val(pmd) >> 32))
-#define pgd_page(pgd)          (pfn_to_page(pgd_val(pgd) >> 32))
-#define pte_pfn(pte)           (pte_val(pte) >> 32)
-
-#define mk_pte(page, pgprot)                                                \
-({                                                                          \
-       pte_t pte;                                                           \
-       unsigned long pfn;                                                   \
-                                                                            \
-       pfn = page_to_pfn(page) << 32; \
-       pte_val(pte) = pfn | pgprot_val(pgprot);                             \
-                                                                            \
-       pte;                                                                 \
-})
-
-#define pte_page(x)                                                    \
-({                                                                     \
-               unsigned long kvirt;                                            \
-       struct page * __xx;                                             \
-                                                                       \
-       kvirt = (unsigned long)__va(pte_val(x) >> (32-PAGE_SHIFT));     \
-       __xx = virt_to_page(kvirt);                                     \
-                                                                       \
-       __xx;                                                           \
-})
-
-#define page_to_pa(page)                                               \
-       (page_to_pfn(page) << PAGE_SHIFT)
-
-#define pfn_to_nid(pfn)                pa_to_nid(((u64)(pfn) << PAGE_SHIFT))
-#define pfn_valid(pfn)                                                 \
-       (((pfn) - node_start_pfn(pfn_to_nid(pfn))) <                    \
-        node_spanned_pages(pfn_to_nid(pfn)))                                   \
-
-#define virt_addr_valid(kaddr) pfn_valid((__pa(kaddr) >> PAGE_SHIFT))
-
-#endif /* CONFIG_DISCONTIGMEM */
-
-#endif /* _ASM_MMZONE_H_ */
diff --git a/include/asm-alpha/module.h b/include/asm-alpha/module.h
deleted file mode 100644 (file)
index 7b63743..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef _ALPHA_MODULE_H
-#define _ALPHA_MODULE_H
-
-struct mod_arch_specific
-{
-       unsigned int gotsecindex;
-};
-
-#define Elf_Sym Elf64_Sym
-#define Elf_Shdr Elf64_Shdr
-#define Elf_Ehdr Elf64_Ehdr
-#define Elf_Phdr Elf64_Phdr
-#define Elf_Dyn Elf64_Dyn
-#define Elf_Rel Elf64_Rel
-#define Elf_Rela Elf64_Rela
-
-#define ARCH_SHF_SMALL SHF_ALPHA_GPREL
-
-#ifdef MODULE
-asm(".section .got,\"aws\",@progbits; .align 3; .previous");
-#endif
-
-#endif /*_ALPHA_MODULE_H*/
diff --git a/include/asm-alpha/msgbuf.h b/include/asm-alpha/msgbuf.h
deleted file mode 100644 (file)
index 9849650..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef _ALPHA_MSGBUF_H
-#define _ALPHA_MSGBUF_H
-
-/* 
- * The msqid64_ds structure for alpha architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space is left for:
- * - 2 miscellaneous 64-bit values
- */
-
-struct msqid64_ds {
-       struct ipc64_perm msg_perm;
-       __kernel_time_t msg_stime;      /* last msgsnd time */
-       __kernel_time_t msg_rtime;      /* last msgrcv time */
-       __kernel_time_t msg_ctime;      /* last change time */
-       unsigned long  msg_cbytes;      /* current number of bytes on queue */
-       unsigned long  msg_qnum;        /* number of messages in queue */
-       unsigned long  msg_qbytes;      /* max number of bytes on queue */
-       __kernel_pid_t msg_lspid;       /* pid of last msgsnd */
-       __kernel_pid_t msg_lrpid;       /* last receive pid */
-       unsigned long  __unused1;
-       unsigned long  __unused2;
-};
-
-#endif /* _ALPHA_MSGBUF_H */
diff --git a/include/asm-alpha/mutex.h b/include/asm-alpha/mutex.h
deleted file mode 100644 (file)
index 458c1f7..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Pull in the generic implementation for the mutex fastpath.
- *
- * TODO: implement optimized primitives instead, or leave the generic
- * implementation in place, or pick the atomic_xchg() based generic
- * implementation. (see asm-generic/mutex-xchg.h for details)
- */
-
-#include <asm-generic/mutex-dec.h>
diff --git a/include/asm-alpha/page.h b/include/asm-alpha/page.h
deleted file mode 100644 (file)
index 0995f9d..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-#ifndef _ALPHA_PAGE_H
-#define _ALPHA_PAGE_H
-
-#include <linux/const.h>
-#include <asm/pal.h>
-
-/* PAGE_SHIFT determines the page size */
-#define PAGE_SHIFT     13
-#define PAGE_SIZE      (_AC(1,UL) << PAGE_SHIFT)
-#define PAGE_MASK      (~(PAGE_SIZE-1))
-
-#ifndef __ASSEMBLY__
-
-#define STRICT_MM_TYPECHECKS
-
-extern void clear_page(void *page);
-#define clear_user_page(page, vaddr, pg)       clear_page(page)
-
-#define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \
-       alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vmaddr)
-#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
-
-extern void copy_page(void * _to, void * _from);
-#define copy_user_page(to, from, vaddr, pg)    copy_page(to, from)
-
-#ifdef STRICT_MM_TYPECHECKS
-/*
- * These are used to make use of C type-checking..
- */
-typedef struct { unsigned long pte; } pte_t;
-typedef struct { unsigned long pmd; } pmd_t;
-typedef struct { unsigned long pgd; } pgd_t;
-typedef struct { unsigned long pgprot; } pgprot_t;
-
-#define pte_val(x)     ((x).pte)
-#define pmd_val(x)     ((x).pmd)
-#define pgd_val(x)     ((x).pgd)
-#define pgprot_val(x)  ((x).pgprot)
-
-#define __pte(x)       ((pte_t) { (x) } )
-#define __pmd(x)       ((pmd_t) { (x) } )
-#define __pgd(x)       ((pgd_t) { (x) } )
-#define __pgprot(x)    ((pgprot_t) { (x) } )
-
-#else
-/*
- * .. while these make it easier on the compiler
- */
-typedef unsigned long pte_t;
-typedef unsigned long pmd_t;
-typedef unsigned long pgd_t;
-typedef unsigned long pgprot_t;
-
-#define pte_val(x)     (x)
-#define pmd_val(x)     (x)
-#define pgd_val(x)     (x)
-#define pgprot_val(x)  (x)
-
-#define __pte(x)       (x)
-#define __pgd(x)       (x)
-#define __pgprot(x)    (x)
-
-#endif /* STRICT_MM_TYPECHECKS */
-
-typedef struct page *pgtable_t;
-
-#ifdef USE_48_BIT_KSEG
-#define PAGE_OFFSET            0xffff800000000000UL
-#else
-#define PAGE_OFFSET            0xfffffc0000000000UL
-#endif
-
-#else
-
-#ifdef USE_48_BIT_KSEG
-#define PAGE_OFFSET            0xffff800000000000
-#else
-#define PAGE_OFFSET            0xfffffc0000000000
-#endif
-
-#endif /* !__ASSEMBLY__ */
-
-#define __pa(x)                        ((unsigned long) (x) - PAGE_OFFSET)
-#define __va(x)                        ((void *)((unsigned long) (x) + PAGE_OFFSET))
-#ifndef CONFIG_DISCONTIGMEM
-#define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
-
-#define pfn_valid(pfn)         ((pfn) < max_mapnr)
-#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
-#endif /* CONFIG_DISCONTIGMEM */
-
-#define VM_DATA_DEFAULT_FLAGS          (VM_READ | VM_WRITE | VM_EXEC | \
-                                        VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
-
-#include <asm-generic/memory_model.h>
-#include <asm-generic/page.h>
-
-#endif /* _ALPHA_PAGE_H */
diff --git a/include/asm-alpha/pal.h b/include/asm-alpha/pal.h
deleted file mode 100644 (file)
index 9b4ba0d..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef __ALPHA_PAL_H
-#define __ALPHA_PAL_H
-
-/*
- * Common PAL-code
- */
-#define PAL_halt         0
-#define PAL_cflush       1
-#define PAL_draina       2
-#define PAL_bpt                128
-#define PAL_bugchk     129
-#define PAL_chmk       131
-#define PAL_callsys    131
-#define PAL_imb                134
-#define PAL_rduniq     158
-#define PAL_wruniq     159
-#define PAL_gentrap    170
-#define PAL_nphalt     190
-
-/*
- * VMS specific PAL-code
- */
-#define PAL_swppal     10
-#define PAL_mfpr_vptb  41
-
-/*
- * OSF specific PAL-code
- */
-#define PAL_cserve      9
-#define PAL_wripir     13
-#define PAL_rdmces     16
-#define PAL_wrmces     17
-#define PAL_wrfen      43
-#define PAL_wrvptptr   45
-#define PAL_jtopal     46
-#define PAL_swpctx     48
-#define PAL_wrval      49
-#define PAL_rdval      50
-#define PAL_tbi                51
-#define PAL_wrent      52
-#define PAL_swpipl     53
-#define PAL_rdps       54
-#define PAL_wrkgp      55
-#define PAL_wrusp      56
-#define PAL_wrperfmon  57
-#define PAL_rdusp      58
-#define PAL_whami      60
-#define PAL_retsys     61
-#define PAL_rti                63
-
-#endif /* __ALPHA_PAL_H */
diff --git a/include/asm-alpha/param.h b/include/asm-alpha/param.h
deleted file mode 100644 (file)
index e691ecf..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef _ASM_ALPHA_PARAM_H
-#define _ASM_ALPHA_PARAM_H
-
-/* ??? Gross.  I don't want to parameterize this, and supposedly the
-   hardware ignores reprogramming.  We also need userland buy-in to the 
-   change in HZ, since this is visible in the wait4 resources etc.  */
-
-#ifdef __KERNEL__
-#define HZ             CONFIG_HZ
-#define USER_HZ                HZ
-#else
-#define HZ             1024
-#endif
-
-#define EXEC_PAGESIZE  8192
-
-#ifndef NOGROUP
-#define NOGROUP                (-1)
-#endif
-
-#define MAXHOSTNAMELEN 64      /* max length of hostname */
-
-#ifdef __KERNEL__
-# define CLOCKS_PER_SEC        HZ      /* frequency at which times() counts */
-#endif
-
-#endif /* _ASM_ALPHA_PARAM_H */
diff --git a/include/asm-alpha/parport.h b/include/asm-alpha/parport.h
deleted file mode 100644 (file)
index c5ee7cb..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * parport.h: platform-specific PC-style parport initialisation
- *
- * Copyright (C) 1999, 2000  Tim Waugh <tim@cyberelk.demon.co.uk>
- *
- * This file should only be included by drivers/parport/parport_pc.c.
- */
-
-#ifndef _ASM_AXP_PARPORT_H
-#define _ASM_AXP_PARPORT_H 1
-
-static int __devinit parport_pc_find_isa_ports (int autoirq, int autodma);
-static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma)
-{
-       return parport_pc_find_isa_ports (autoirq, autodma);
-}
-
-#endif /* !(_ASM_AXP_PARPORT_H) */
diff --git a/include/asm-alpha/pci.h b/include/asm-alpha/pci.h
deleted file mode 100644 (file)
index 2a14302..0000000
+++ /dev/null
@@ -1,276 +0,0 @@
-#ifndef __ALPHA_PCI_H
-#define __ALPHA_PCI_H
-
-#ifdef __KERNEL__
-
-#include <linux/spinlock.h>
-#include <linux/dma-mapping.h>
-#include <asm/scatterlist.h>
-#include <asm/machvec.h>
-
-/*
- * The following structure is used to manage multiple PCI busses.
- */
-
-struct pci_dev;
-struct pci_bus;
-struct resource;
-struct pci_iommu_arena;
-struct page;
-
-/* A controller.  Used to manage multiple PCI busses.  */
-
-struct pci_controller {
-       struct pci_controller *next;
-        struct pci_bus *bus;
-       struct resource *io_space;
-       struct resource *mem_space;
-
-       /* The following are for reporting to userland.  The invariant is
-          that if we report a BWX-capable dense memory, we do not report
-          a sparse memory at all, even if it exists.  */
-       unsigned long sparse_mem_base;
-       unsigned long dense_mem_base;
-       unsigned long sparse_io_base;
-       unsigned long dense_io_base;
-
-       /* This one's for the kernel only.  It's in KSEG somewhere.  */
-       unsigned long config_space_base;
-
-       unsigned int index;
-       /* For compatibility with current (as of July 2003) pciutils
-          and XFree86. Eventually will be removed. */
-       unsigned int need_domain_info;
-
-       struct pci_iommu_arena *sg_pci;
-       struct pci_iommu_arena *sg_isa;
-
-       void *sysdata;
-};
-
-/* Override the logic in pci_scan_bus for skipping already-configured
-   bus numbers.  */
-
-#define pcibios_assign_all_busses()    1
-#define pcibios_scan_all_fns(a, b)     0
-
-#define PCIBIOS_MIN_IO         alpha_mv.min_io_address
-#define PCIBIOS_MIN_MEM                alpha_mv.min_mem_address
-
-extern void pcibios_set_master(struct pci_dev *dev);
-
-extern inline void pcibios_penalize_isa_irq(int irq, int active)
-{
-       /* We don't do dynamic PCI IRQ allocation */
-}
-
-/* IOMMU controls.  */
-
-/* The PCI address space does not equal the physical memory address space.
-   The networking and block device layers use this boolean for bounce buffer
-   decisions.  */
-#define PCI_DMA_BUS_IS_PHYS  0
-
-/* Allocate and map kernel buffer using consistent mode DMA for PCI
-   device.  Returns non-NULL cpu-view pointer to the buffer if
-   successful and sets *DMA_ADDRP to the pci side dma address as well,
-   else DMA_ADDRP is undefined.  */
-
-extern void *__pci_alloc_consistent(struct pci_dev *, size_t,
-                                   dma_addr_t *, gfp_t);
-static inline void *
-pci_alloc_consistent(struct pci_dev *dev, size_t size, dma_addr_t *dma)
-{
-       return __pci_alloc_consistent(dev, size, dma, GFP_ATOMIC);
-}
-
-/* Free and unmap a consistent DMA buffer.  CPU_ADDR and DMA_ADDR must
-   be values that were returned from pci_alloc_consistent.  SIZE must
-   be the same as what as passed into pci_alloc_consistent.
-   References to the memory and mappings associated with CPU_ADDR or
-   DMA_ADDR past this call are illegal.  */
-
-extern void pci_free_consistent(struct pci_dev *, size_t, void *, dma_addr_t);
-
-/* Map a single buffer of the indicate size for PCI DMA in streaming mode.
-   The 32-bit PCI bus mastering address to use is returned.  Once the device
-   is given the dma address, the device owns this memory until either
-   pci_unmap_single or pci_dma_sync_single_for_cpu is performed.  */
-
-extern dma_addr_t pci_map_single(struct pci_dev *, void *, size_t, int);
-
-/* Likewise, but for a page instead of an address.  */
-extern dma_addr_t pci_map_page(struct pci_dev *, struct page *,
-                              unsigned long, size_t, int);
-
-/* Test for pci_map_single or pci_map_page having generated an error.  */
-
-static inline int
-pci_dma_mapping_error(struct pci_dev *pdev, dma_addr_t dma_addr)
-{
-       return dma_addr == 0;
-}
-
-/* Unmap a single streaming mode DMA translation.  The DMA_ADDR and
-   SIZE must match what was provided for in a previous pci_map_single
-   call.  All other usages are undefined.  After this call, reads by
-   the cpu to the buffer are guaranteed to see whatever the device
-   wrote there.  */
-
-extern void pci_unmap_single(struct pci_dev *, dma_addr_t, size_t, int);
-extern void pci_unmap_page(struct pci_dev *, dma_addr_t, size_t, int);
-
-/* pci_unmap_{single,page} is not a nop, thus... */
-#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)      \
-       dma_addr_t ADDR_NAME;
-#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)                \
-       __u32 LEN_NAME;
-#define pci_unmap_addr(PTR, ADDR_NAME)                 \
-       ((PTR)->ADDR_NAME)
-#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)                \
-       (((PTR)->ADDR_NAME) = (VAL))
-#define pci_unmap_len(PTR, LEN_NAME)                   \
-       ((PTR)->LEN_NAME)
-#define pci_unmap_len_set(PTR, LEN_NAME, VAL)          \
-       (((PTR)->LEN_NAME) = (VAL))
-
-/* Map a set of buffers described by scatterlist in streaming mode for
-   PCI DMA.  This is the scatter-gather version of the above
-   pci_map_single interface.  Here the scatter gather list elements
-   are each tagged with the appropriate PCI dma address and length.
-   They are obtained via sg_dma_{address,length}(SG).
-
-   NOTE: An implementation may be able to use a smaller number of DMA
-   address/length pairs than there are SG table elements.  (for
-   example via virtual mapping capabilities) The routine returns the
-   number of addr/length pairs actually used, at most nents.
-
-   Device ownership issues as mentioned above for pci_map_single are
-   the same here.  */
-
-extern int pci_map_sg(struct pci_dev *, struct scatterlist *, int, int);
-
-/* Unmap a set of streaming mode DMA translations.  Again, cpu read
-   rules concerning calls here are the same as for pci_unmap_single()
-   above.  */
-
-extern void pci_unmap_sg(struct pci_dev *, struct scatterlist *, int, int);
-
-/* Make physical memory consistent for a single streaming mode DMA
-   translation after a transfer and device currently has ownership
-   of the buffer.
-
-   If you perform a pci_map_single() but wish to interrogate the
-   buffer using the cpu, yet do not wish to teardown the PCI dma
-   mapping, you must call this function before doing so.  At the next
-   point you give the PCI dma address back to the card, you must first
-   perform a pci_dma_sync_for_device, and then the device again owns
-   the buffer.  */
-
-static inline void
-pci_dma_sync_single_for_cpu(struct pci_dev *dev, dma_addr_t dma_addr,
-                           long size, int direction)
-{
-       /* Nothing to do.  */
-}
-
-static inline void
-pci_dma_sync_single_for_device(struct pci_dev *dev, dma_addr_t dma_addr,
-                              size_t size, int direction)
-{
-       /* Nothing to do.  */
-}
-
-/* Make physical memory consistent for a set of streaming mode DMA
-   translations after a transfer.  The same as pci_dma_sync_single_*
-   but for a scatter-gather list, same rules and usage.  */
-
-static inline void
-pci_dma_sync_sg_for_cpu(struct pci_dev *dev, struct scatterlist *sg,
-                       int nents, int direction)
-{
-       /* Nothing to do.  */
-}
-
-static inline void
-pci_dma_sync_sg_for_device(struct pci_dev *dev, struct scatterlist *sg,
-                          int nents, int direction)
-{
-       /* Nothing to do.  */
-}
-
-/* Return whether the given PCI device DMA address mask can
-   be supported properly.  For example, if your device can
-   only drive the low 24-bits during PCI bus mastering, then
-   you would pass 0x00ffffff as the mask to this function.  */
-
-extern int pci_dma_supported(struct pci_dev *hwdev, u64 mask);
-
-#ifdef CONFIG_PCI
-static inline void pci_dma_burst_advice(struct pci_dev *pdev,
-                                       enum pci_dma_burst_strategy *strat,
-                                       unsigned long *strategy_parameter)
-{
-       unsigned long cacheline_size;
-       u8 byte;
-
-       pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &byte);
-       if (byte == 0)
-               cacheline_size = 1024;
-       else
-               cacheline_size = (int) byte * 4;
-
-       *strat = PCI_DMA_BURST_BOUNDARY;
-       *strategy_parameter = cacheline_size;
-}
-#endif
-
-/* TODO: integrate with include/asm-generic/pci.h ? */
-static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
-{
-       return channel ? 15 : 14;
-}
-
-extern void pcibios_resource_to_bus(struct pci_dev *, struct pci_bus_region *,
-                                   struct resource *);
-
-extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
-                                   struct pci_bus_region *region);
-
-static inline struct resource *
-pcibios_select_root(struct pci_dev *pdev, struct resource *res)
-{
-       struct resource *root = NULL;
-
-       if (res->flags & IORESOURCE_IO)
-               root = &ioport_resource;
-       if (res->flags & IORESOURCE_MEM)
-               root = &iomem_resource;
-
-       return root;
-}
-
-#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index
-
-static inline int pci_proc_domain(struct pci_bus *bus)
-{
-       struct pci_controller *hose = bus->sysdata;
-       return hose->need_domain_info;
-}
-
-struct pci_dev *alpha_gendev_to_pci(struct device *dev);
-
-#endif /* __KERNEL__ */
-
-/* Values for the `which' argument to sys_pciconfig_iobase.  */
-#define IOBASE_HOSE            0
-#define IOBASE_SPARSE_MEM      1
-#define IOBASE_DENSE_MEM       2
-#define IOBASE_SPARSE_IO       3
-#define IOBASE_DENSE_IO                4
-#define IOBASE_ROOT_BUS                5
-#define IOBASE_FROM_HOSE       0x10000
-
-extern struct pci_dev *isa_bridge;
-
-#endif /* __ALPHA_PCI_H */
diff --git a/include/asm-alpha/percpu.h b/include/asm-alpha/percpu.h
deleted file mode 100644 (file)
index 3495e8e..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef __ALPHA_PERCPU_H
-#define __ALPHA_PERCPU_H
-#include <linux/compiler.h>
-#include <linux/threads.h>
-
-/*
- * Determine the real variable name from the name visible in the
- * kernel sources.
- */
-#define per_cpu_var(var) per_cpu__##var
-
-#ifdef CONFIG_SMP
-
-/*
- * per_cpu_offset() is the offset that has to be added to a
- * percpu variable to get to the instance for a certain processor.
- */
-extern unsigned long __per_cpu_offset[NR_CPUS];
-
-#define per_cpu_offset(x) (__per_cpu_offset[x])
-
-#define __my_cpu_offset per_cpu_offset(raw_smp_processor_id())
-#ifdef CONFIG_DEBUG_PREEMPT
-#define my_cpu_offset per_cpu_offset(smp_processor_id())
-#else
-#define my_cpu_offset __my_cpu_offset
-#endif
-
-#ifndef MODULE
-#define SHIFT_PERCPU_PTR(var, offset) RELOC_HIDE(&per_cpu_var(var), (offset))
-#define PER_CPU_ATTRIBUTES
-#else
-/*
- * To calculate addresses of locally defined variables, GCC uses 32-bit
- * displacement from the GP. Which doesn't work for per cpu variables in
- * modules, as an offset to the kernel per cpu area is way above 4G.
- *
- * This forces allocation of a GOT entry for per cpu variable using
- * ldq instruction with a 'literal' relocation.
- */
-#define SHIFT_PERCPU_PTR(var, offset) ({               \
-       extern int simple_identifier_##var(void);       \
-       unsigned long __ptr, tmp_gp;                    \
-       asm (  "br      %1, 1f                        \n\
-       1:      ldgp    %1, 0(%1)                     \n\
-               ldq %0, per_cpu__" #var"(%1)\t!literal"         \
-               : "=&r"(__ptr), "=&r"(tmp_gp));         \
-       (typeof(&per_cpu_var(var)))(__ptr + (offset)); })
-
-#define PER_CPU_ATTRIBUTES     __used
-
-#endif /* MODULE */
-
-/*
- * A percpu variable may point to a discarded regions. The following are
- * established ways to produce a usable pointer from the percpu variable
- * offset.
- */
-#define per_cpu(var, cpu) \
-       (*SHIFT_PERCPU_PTR(var, per_cpu_offset(cpu)))
-#define __get_cpu_var(var) \
-       (*SHIFT_PERCPU_PTR(var, my_cpu_offset))
-#define __raw_get_cpu_var(var) \
-       (*SHIFT_PERCPU_PTR(var, __my_cpu_offset))
-
-#else /* ! SMP */
-
-#define per_cpu(var, cpu)              (*((void)(cpu), &per_cpu_var(var)))
-#define __get_cpu_var(var)             per_cpu_var(var)
-#define __raw_get_cpu_var(var)         per_cpu_var(var)
-
-#define PER_CPU_ATTRIBUTES
-
-#endif /* SMP */
-
-#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu_var(name)
-
-#endif /* __ALPHA_PERCPU_H */
diff --git a/include/asm-alpha/pgalloc.h b/include/asm-alpha/pgalloc.h
deleted file mode 100644 (file)
index fd09015..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef _ALPHA_PGALLOC_H
-#define _ALPHA_PGALLOC_H
-
-#include <linux/mm.h>
-#include <linux/mmzone.h>
-
-/*      
- * Allocate and free page tables. The xxx_kernel() versions are
- * used to allocate a kernel page table - this turns on ASN bits
- * if any.
- */
-
-static inline void
-pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t pte)
-{
-       pmd_set(pmd, (pte_t *)(page_to_pa(pte) + PAGE_OFFSET));
-}
-#define pmd_pgtable(pmd) pmd_page(pmd)
-
-static inline void
-pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
-{
-       pmd_set(pmd, pte);
-}
-
-static inline void
-pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
-{
-       pgd_set(pgd, pmd);
-}
-
-extern pgd_t *pgd_alloc(struct mm_struct *mm);
-
-static inline void
-pgd_free(struct mm_struct *mm, pgd_t *pgd)
-{
-       free_page((unsigned long)pgd);
-}
-
-static inline pmd_t *
-pmd_alloc_one(struct mm_struct *mm, unsigned long address)
-{
-       pmd_t *ret = (pmd_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO);
-       return ret;
-}
-
-static inline void
-pmd_free(struct mm_struct *mm, pmd_t *pmd)
-{
-       free_page((unsigned long)pmd);
-}
-
-extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);
-
-static inline void
-pte_free_kernel(struct mm_struct *mm, pte_t *pte)
-{
-       free_page((unsigned long)pte);
-}
-
-static inline pgtable_t
-pte_alloc_one(struct mm_struct *mm, unsigned long address)
-{
-       pte_t *pte = pte_alloc_one_kernel(mm, address);
-       struct page *page;
-
-       if (!pte)
-               return NULL;
-       page = virt_to_page(pte);
-       pgtable_page_ctor(page);
-       return page;
-}
-
-static inline void
-pte_free(struct mm_struct *mm, pgtable_t page)
-{
-       pgtable_page_dtor(page);
-       __free_page(page);
-}
-
-#define check_pgt_cache()      do { } while (0)
-
-#endif /* _ALPHA_PGALLOC_H */
diff --git a/include/asm-alpha/pgtable.h b/include/asm-alpha/pgtable.h
deleted file mode 100644 (file)
index 3f0c59f..0000000
+++ /dev/null
@@ -1,380 +0,0 @@
-#ifndef _ALPHA_PGTABLE_H
-#define _ALPHA_PGTABLE_H
-
-#include <asm-generic/4level-fixup.h>
-
-/*
- * This file contains the functions and defines necessary to modify and use
- * the Alpha page table tree.
- *
- * This hopefully works with any standard Alpha page-size, as defined
- * in <asm/page.h> (currently 8192).
- */
-#include <linux/mmzone.h>
-
-#include <asm/page.h>
-#include <asm/processor.h>     /* For TASK_SIZE */
-#include <asm/machvec.h>
-
-struct mm_struct;
-struct vm_area_struct;
-
-/* Certain architectures need to do special things when PTEs
- * within a page table are directly modified.  Thus, the following
- * hook is made available.
- */
-#define set_pte(pteptr, pteval) ((*(pteptr)) = (pteval))
-#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
-
-/* PMD_SHIFT determines the size of the area a second-level page table can map */
-#define PMD_SHIFT      (PAGE_SHIFT + (PAGE_SHIFT-3))
-#define PMD_SIZE       (1UL << PMD_SHIFT)
-#define PMD_MASK       (~(PMD_SIZE-1))
-
-/* PGDIR_SHIFT determines what a third-level page table entry can map */
-#define PGDIR_SHIFT    (PAGE_SHIFT + 2*(PAGE_SHIFT-3))
-#define PGDIR_SIZE     (1UL << PGDIR_SHIFT)
-#define PGDIR_MASK     (~(PGDIR_SIZE-1))
-
-/*
- * Entries per page directory level:  the Alpha is three-level, with
- * all levels having a one-page page table.
- */
-#define PTRS_PER_PTE   (1UL << (PAGE_SHIFT-3))
-#define PTRS_PER_PMD   (1UL << (PAGE_SHIFT-3))
-#define PTRS_PER_PGD   (1UL << (PAGE_SHIFT-3))
-#define USER_PTRS_PER_PGD      (TASK_SIZE / PGDIR_SIZE)
-#define FIRST_USER_ADDRESS     0
-
-/* Number of pointers that fit on a page:  this will go away. */
-#define PTRS_PER_PAGE  (1UL << (PAGE_SHIFT-3))
-
-#ifdef CONFIG_ALPHA_LARGE_VMALLOC
-#define VMALLOC_START          0xfffffe0000000000
-#else
-#define VMALLOC_START          (-2*PGDIR_SIZE)
-#endif
-#define VMALLOC_END            (-PGDIR_SIZE)
-
-/*
- * OSF/1 PAL-code-imposed page table bits
- */
-#define _PAGE_VALID    0x0001
-#define _PAGE_FOR      0x0002  /* used for page protection (fault on read) */
-#define _PAGE_FOW      0x0004  /* used for page protection (fault on write) */
-#define _PAGE_FOE      0x0008  /* used for page protection (fault on exec) */
-#define _PAGE_ASM      0x0010
-#define _PAGE_KRE      0x0100  /* xxx - see below on the "accessed" bit */
-#define _PAGE_URE      0x0200  /* xxx */
-#define _PAGE_KWE      0x1000  /* used to do the dirty bit in software */
-#define _PAGE_UWE      0x2000  /* used to do the dirty bit in software */
-
-/* .. and these are ours ... */
-#define _PAGE_DIRTY    0x20000
-#define _PAGE_ACCESSED 0x40000
-#define _PAGE_FILE     0x80000 /* set:pagecache, unset:swap */
-
-/*
- * NOTE! The "accessed" bit isn't necessarily exact:  it can be kept exactly
- * by software (use the KRE/URE/KWE/UWE bits appropriately), but I'll fake it.
- * Under Linux/AXP, the "accessed" bit just means "read", and I'll just use
- * the KRE/URE bits to watch for it. That way we don't need to overload the
- * KWE/UWE bits with both handling dirty and accessed.
- *
- * Note that the kernel uses the accessed bit just to check whether to page
- * out a page or not, so it doesn't have to be exact anyway.
- */
-
-#define __DIRTY_BITS   (_PAGE_DIRTY | _PAGE_KWE | _PAGE_UWE)
-#define __ACCESS_BITS  (_PAGE_ACCESSED | _PAGE_KRE | _PAGE_URE)
-
-#define _PFN_MASK      0xFFFFFFFF00000000UL
-
-#define _PAGE_TABLE    (_PAGE_VALID | __DIRTY_BITS | __ACCESS_BITS)
-#define _PAGE_CHG_MASK (_PFN_MASK | __DIRTY_BITS | __ACCESS_BITS)
-
-/*
- * All the normal masks have the "page accessed" bits on, as any time they are used,
- * the page is accessed. They are cleared only by the page-out routines
- */
-#define PAGE_NONE      __pgprot(_PAGE_VALID | __ACCESS_BITS | _PAGE_FOR | _PAGE_FOW | _PAGE_FOE)
-#define PAGE_SHARED    __pgprot(_PAGE_VALID | __ACCESS_BITS)
-#define PAGE_COPY      __pgprot(_PAGE_VALID | __ACCESS_BITS | _PAGE_FOW)
-#define PAGE_READONLY  __pgprot(_PAGE_VALID | __ACCESS_BITS | _PAGE_FOW)
-#define PAGE_KERNEL    __pgprot(_PAGE_VALID | _PAGE_ASM | _PAGE_KRE | _PAGE_KWE)
-
-#define _PAGE_NORMAL(x) __pgprot(_PAGE_VALID | __ACCESS_BITS | (x))
-
-#define _PAGE_P(x) _PAGE_NORMAL((x) | (((x) & _PAGE_FOW)?0:_PAGE_FOW))
-#define _PAGE_S(x) _PAGE_NORMAL(x)
-
-/*
- * The hardware can handle write-only mappings, but as the Alpha
- * architecture does byte-wide writes with a read-modify-write
- * sequence, it's not practical to have write-without-read privs.
- * Thus the "-w- -> rw-" and "-wx -> rwx" mapping here (and in
- * arch/alpha/mm/fault.c)
- */
-       /* xwr */
-#define __P000 _PAGE_P(_PAGE_FOE | _PAGE_FOW | _PAGE_FOR)
-#define __P001 _PAGE_P(_PAGE_FOE | _PAGE_FOW)
-#define __P010 _PAGE_P(_PAGE_FOE)
-#define __P011 _PAGE_P(_PAGE_FOE)
-#define __P100 _PAGE_P(_PAGE_FOW | _PAGE_FOR)
-#define __P101 _PAGE_P(_PAGE_FOW)
-#define __P110 _PAGE_P(0)
-#define __P111 _PAGE_P(0)
-
-#define __S000 _PAGE_S(_PAGE_FOE | _PAGE_FOW | _PAGE_FOR)
-#define __S001 _PAGE_S(_PAGE_FOE | _PAGE_FOW)
-#define __S010 _PAGE_S(_PAGE_FOE)
-#define __S011 _PAGE_S(_PAGE_FOE)
-#define __S100 _PAGE_S(_PAGE_FOW | _PAGE_FOR)
-#define __S101 _PAGE_S(_PAGE_FOW)
-#define __S110 _PAGE_S(0)
-#define __S111 _PAGE_S(0)
-
-/*
- * pgprot_noncached() is only for infiniband pci support, and a real
- * implementation for RAM would be more complicated.
- */
-#define pgprot_noncached(prot) (prot)
-
-/*
- * BAD_PAGETABLE is used when we need a bogus page-table, while
- * BAD_PAGE is used for a bogus page.
- *
- * ZERO_PAGE is a global shared page that is always zero:  used
- * for zero-mapped memory areas etc..
- */
-extern pte_t __bad_page(void);
-extern pmd_t * __bad_pagetable(void);
-
-extern unsigned long __zero_page(void);
-
-#define BAD_PAGETABLE  __bad_pagetable()
-#define BAD_PAGE       __bad_page()
-#define ZERO_PAGE(vaddr)       (virt_to_page(ZERO_PGE))
-
-/* number of bits that fit into a memory pointer */
-#define BITS_PER_PTR                   (8*sizeof(unsigned long))
-
-/* to align the pointer to a pointer address */
-#define PTR_MASK                       (~(sizeof(void*)-1))
-
-/* sizeof(void*)==1<<SIZEOF_PTR_LOG2 */
-#define SIZEOF_PTR_LOG2                        3
-
-/* to find an entry in a page-table */
-#define PAGE_PTR(address)              \
-  ((unsigned long)(address)>>(PAGE_SHIFT-SIZEOF_PTR_LOG2)&PTR_MASK&~PAGE_MASK)
-
-/*
- * On certain platforms whose physical address space can overlap KSEG,
- * namely EV6 and above, we must re-twiddle the physaddr to restore the
- * correct high-order bits.
- *
- * This is extremely confusing until you realize that this is actually
- * just working around a userspace bug.  The X server was intending to
- * provide the physical address but instead provided the KSEG address.
- * Or tried to, except it's not representable.
- * 
- * On Tsunami there's nothing meaningful at 0x40000000000, so this is
- * a safe thing to do.  Come the first core logic that does put something
- * in this area -- memory or whathaveyou -- then this hack will have
- * to go away.  So be prepared!
- */
-
-#if defined(CONFIG_ALPHA_GENERIC) && defined(USE_48_BIT_KSEG)
-#error "EV6-only feature in a generic kernel"
-#endif
-#if defined(CONFIG_ALPHA_GENERIC) || \
-    (defined(CONFIG_ALPHA_EV6) && !defined(USE_48_BIT_KSEG))
-#define KSEG_PFN       (0xc0000000000UL >> PAGE_SHIFT)
-#define PHYS_TWIDDLE(pfn) \
-  ((((pfn) & KSEG_PFN) == (0x40000000000UL >> PAGE_SHIFT)) \
-  ? ((pfn) ^= KSEG_PFN) : (pfn))
-#else
-#define PHYS_TWIDDLE(pfn) (pfn)
-#endif
-
-/*
- * Conversion functions:  convert a page and protection to a page entry,
- * and a page entry and page directory to the page they refer to.
- */
-#ifndef CONFIG_DISCONTIGMEM
-#define page_to_pa(page)       (((page) - mem_map) << PAGE_SHIFT)
-
-#define pte_pfn(pte)   (pte_val(pte) >> 32)
-#define pte_page(pte)  pfn_to_page(pte_pfn(pte))
-#define mk_pte(page, pgprot)                                           \
-({                                                                     \
-       pte_t pte;                                                      \
-                                                                       \
-       pte_val(pte) = (page_to_pfn(page) << 32) | pgprot_val(pgprot);  \
-       pte;                                                            \
-})
-#endif
-
-extern inline pte_t pfn_pte(unsigned long physpfn, pgprot_t pgprot)
-{ pte_t pte; pte_val(pte) = (PHYS_TWIDDLE(physpfn) << 32) | pgprot_val(pgprot); return pte; }
-
-extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
-{ pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot); return pte; }
-
-extern inline void pmd_set(pmd_t * pmdp, pte_t * ptep)
-{ pmd_val(*pmdp) = _PAGE_TABLE | ((((unsigned long) ptep) - PAGE_OFFSET) << (32-PAGE_SHIFT)); }
-
-extern inline void pgd_set(pgd_t * pgdp, pmd_t * pmdp)
-{ pgd_val(*pgdp) = _PAGE_TABLE | ((((unsigned long) pmdp) - PAGE_OFFSET) << (32-PAGE_SHIFT)); }
-
-
-extern inline unsigned long
-pmd_page_vaddr(pmd_t pmd)
-{
-       return ((pmd_val(pmd) & _PFN_MASK) >> (32-PAGE_SHIFT)) + PAGE_OFFSET;
-}
-
-#ifndef CONFIG_DISCONTIGMEM
-#define pmd_page(pmd)  (mem_map + ((pmd_val(pmd) & _PFN_MASK) >> 32))
-#define pgd_page(pgd)  (mem_map + ((pgd_val(pgd) & _PFN_MASK) >> 32))
-#endif
-
-extern inline unsigned long pgd_page_vaddr(pgd_t pgd)
-{ return PAGE_OFFSET + ((pgd_val(pgd) & _PFN_MASK) >> (32-PAGE_SHIFT)); }
-
-extern inline int pte_none(pte_t pte)          { return !pte_val(pte); }
-extern inline int pte_present(pte_t pte)       { return pte_val(pte) & _PAGE_VALID; }
-extern inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-{
-       pte_val(*ptep) = 0;
-}
-
-extern inline int pmd_none(pmd_t pmd)          { return !pmd_val(pmd); }
-extern inline int pmd_bad(pmd_t pmd)           { return (pmd_val(pmd) & ~_PFN_MASK) != _PAGE_TABLE; }
-extern inline int pmd_present(pmd_t pmd)       { return pmd_val(pmd) & _PAGE_VALID; }
-extern inline void pmd_clear(pmd_t * pmdp)     { pmd_val(*pmdp) = 0; }
-
-extern inline int pgd_none(pgd_t pgd)          { return !pgd_val(pgd); }
-extern inline int pgd_bad(pgd_t pgd)           { return (pgd_val(pgd) & ~_PFN_MASK) != _PAGE_TABLE; }
-extern inline int pgd_present(pgd_t pgd)       { return pgd_val(pgd) & _PAGE_VALID; }
-extern inline void pgd_clear(pgd_t * pgdp)     { pgd_val(*pgdp) = 0; }
-
-/*
- * The following only work if pte_present() is true.
- * Undefined behaviour if not..
- */
-extern inline int pte_write(pte_t pte)         { return !(pte_val(pte) & _PAGE_FOW); }
-extern inline int pte_dirty(pte_t pte)         { return pte_val(pte) & _PAGE_DIRTY; }
-extern inline int pte_young(pte_t pte)         { return pte_val(pte) & _PAGE_ACCESSED; }
-extern inline int pte_file(pte_t pte)          { return pte_val(pte) & _PAGE_FILE; }
-extern inline int pte_special(pte_t pte)       { return 0; }
-
-extern inline pte_t pte_wrprotect(pte_t pte)   { pte_val(pte) |= _PAGE_FOW; return pte; }
-extern inline pte_t pte_mkclean(pte_t pte)     { pte_val(pte) &= ~(__DIRTY_BITS); return pte; }
-extern inline pte_t pte_mkold(pte_t pte)       { pte_val(pte) &= ~(__ACCESS_BITS); return pte; }
-extern inline pte_t pte_mkwrite(pte_t pte)     { pte_val(pte) &= ~_PAGE_FOW; return pte; }
-extern inline pte_t pte_mkdirty(pte_t pte)     { pte_val(pte) |= __DIRTY_BITS; return pte; }
-extern inline pte_t pte_mkyoung(pte_t pte)     { pte_val(pte) |= __ACCESS_BITS; return pte; }
-extern inline pte_t pte_mkspecial(pte_t pte)   { return pte; }
-
-#define PAGE_DIR_OFFSET(tsk,address) pgd_offset((tsk),(address))
-
-/* to find an entry in a kernel page-table-directory */
-#define pgd_offset_k(address) pgd_offset(&init_mm, (address))
-
-/* to find an entry in a page-table-directory. */
-#define pgd_index(address)     (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
-#define pgd_offset(mm, address)        ((mm)->pgd+pgd_index(address))
-
-/*
- * The smp_read_barrier_depends() in the following functions are required to
- * order the load of *dir (the pointer in the top level page table) with any
- * subsequent load of the returned pmd_t *ret (ret is data dependent on *dir).
- *
- * If this ordering is not enforced, the CPU might load an older value of
- * *ret, which may be uninitialized data. See mm/memory.c:__pte_alloc for
- * more details.
- *
- * Note that we never change the mm->pgd pointer after the task is running, so
- * pgd_offset does not require such a barrier.
- */
-
-/* Find an entry in the second-level page table.. */
-extern inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
-{
-       pmd_t *ret = (pmd_t *) pgd_page_vaddr(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PAGE - 1));
-       smp_read_barrier_depends(); /* see above */
-       return ret;
-}
-
-/* Find an entry in the third-level page table.. */
-extern inline pte_t * pte_offset_kernel(pmd_t * dir, unsigned long address)
-{
-       pte_t *ret = (pte_t *) pmd_page_vaddr(*dir)
-               + ((address >> PAGE_SHIFT) & (PTRS_PER_PAGE - 1));
-       smp_read_barrier_depends(); /* see above */
-       return ret;
-}
-
-#define pte_offset_map(dir,addr)       pte_offset_kernel((dir),(addr))
-#define pte_offset_map_nested(dir,addr)        pte_offset_kernel((dir),(addr))
-#define pte_unmap(pte)                 do { } while (0)
-#define pte_unmap_nested(pte)          do { } while (0)
-
-extern pgd_t swapper_pg_dir[1024];
-
-/*
- * The Alpha doesn't have any external MMU info:  the kernel page
- * tables contain all the necessary information.
- */
-extern inline void update_mmu_cache(struct vm_area_struct * vma,
-       unsigned long address, pte_t pte)
-{
-}
-
-/*
- * Non-present pages:  high 24 bits are offset, next 8 bits type,
- * low 32 bits zero.
- */
-extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
-{ pte_t pte; pte_val(pte) = (type << 32) | (offset << 40); return pte; }
-
-#define __swp_type(x)          (((x).val >> 32) & 0xff)
-#define __swp_offset(x)                ((x).val >> 40)
-#define __swp_entry(type, off) ((swp_entry_t) { pte_val(mk_swap_pte((type), (off))) })
-#define __pte_to_swp_entry(pte)        ((swp_entry_t) { pte_val(pte) })
-#define __swp_entry_to_pte(x)  ((pte_t) { (x).val })
-
-#define pte_to_pgoff(pte)      (pte_val(pte) >> 32)
-#define pgoff_to_pte(off)      ((pte_t) { ((off) << 32) | _PAGE_FILE })
-
-#define PTE_FILE_MAX_BITS      32
-
-#ifndef CONFIG_DISCONTIGMEM
-#define kern_addr_valid(addr)  (1)
-#endif
-
-#define io_remap_pfn_range(vma, start, pfn, size, prot)        \
-               remap_pfn_range(vma, start, pfn, size, prot)
-
-#define pte_ERROR(e) \
-       printk("%s:%d: bad pte %016lx.\n", __FILE__, __LINE__, pte_val(e))
-#define pmd_ERROR(e) \
-       printk("%s:%d: bad pmd %016lx.\n", __FILE__, __LINE__, pmd_val(e))
-#define pgd_ERROR(e) \
-       printk("%s:%d: bad pgd %016lx.\n", __FILE__, __LINE__, pgd_val(e))
-
-extern void paging_init(void);
-
-#include <asm-generic/pgtable.h>
-
-/*
- * No page table caches to initialise
- */
-#define pgtable_cache_init()   do { } while (0)
-
-/* We have our own get_unmapped_area to cope with ADDR_LIMIT_32BIT.  */
-#define HAVE_ARCH_UNMAPPED_AREA
-
-#endif /* _ALPHA_PGTABLE_H */
diff --git a/include/asm-alpha/poll.h b/include/asm-alpha/poll.h
deleted file mode 100644 (file)
index c98509d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <asm-generic/poll.h>
diff --git a/include/asm-alpha/posix_types.h b/include/asm-alpha/posix_types.h
deleted file mode 100644 (file)
index db16741..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-#ifndef _ALPHA_POSIX_TYPES_H
-#define _ALPHA_POSIX_TYPES_H
-
-/*
- * This file is generally used by user-level software, so you need to
- * be a little careful about namespace pollution etc.  Also, we cannot
- * assume GCC is being used.
- */
-
-typedef unsigned int   __kernel_ino_t;
-typedef unsigned int   __kernel_mode_t;
-typedef unsigned int   __kernel_nlink_t;
-typedef long           __kernel_off_t;
-typedef long long      __kernel_loff_t;
-typedef int            __kernel_pid_t;
-typedef int            __kernel_ipc_pid_t;
-typedef unsigned int   __kernel_uid_t;
-typedef unsigned int   __kernel_gid_t;
-typedef unsigned long  __kernel_size_t;
-typedef long           __kernel_ssize_t;
-typedef long           __kernel_ptrdiff_t;
-typedef long           __kernel_time_t;
-typedef long           __kernel_suseconds_t;
-typedef long           __kernel_clock_t;
-typedef int            __kernel_daddr_t;
-typedef char *         __kernel_caddr_t;
-typedef unsigned long  __kernel_sigset_t;      /* at least 32 bits */
-typedef unsigned short __kernel_uid16_t;
-typedef unsigned short __kernel_gid16_t;
-typedef int            __kernel_clockid_t;
-typedef int            __kernel_timer_t;
-
-typedef struct {
-       int     val[2];
-} __kernel_fsid_t;
-
-typedef __kernel_uid_t __kernel_old_uid_t;
-typedef __kernel_gid_t __kernel_old_gid_t;
-typedef __kernel_uid_t __kernel_uid32_t;
-typedef __kernel_gid_t __kernel_gid32_t;
-
-typedef unsigned int   __kernel_old_dev_t;
-
-#ifdef __KERNEL__
-
-#ifndef __GNUC__
-
-#define        __FD_SET(d, set)        ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d))
-#define        __FD_CLR(d, set)        ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d))
-#define        __FD_ISSET(d, set)      (((set)->fds_bits[__FDELT(d)] & __FDMASK(d)) != 0)
-#define        __FD_ZERO(set)  \
-  ((void) memset ((void *) (set), 0, sizeof (__kernel_fd_set)))
-
-#else /* __GNUC__ */
-
-/* With GNU C, use inline functions instead so args are evaluated only once: */
-
-#undef __FD_SET
-static __inline__ void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp)
-{
-       unsigned long _tmp = fd / __NFDBITS;
-       unsigned long _rem = fd % __NFDBITS;
-       fdsetp->fds_bits[_tmp] |= (1UL<<_rem);
-}
-
-#undef __FD_CLR
-static __inline__ void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp)
-{
-       unsigned long _tmp = fd / __NFDBITS;
-       unsigned long _rem = fd % __NFDBITS;
-       fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem);
-}
-
-#undef __FD_ISSET
-static __inline__ int __FD_ISSET(unsigned long fd, const __kernel_fd_set *p)
-{ 
-       unsigned long _tmp = fd / __NFDBITS;
-       unsigned long _rem = fd % __NFDBITS;
-       return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0;
-}
-
-/*
- * This will unroll the loop for the normal constant case (8 ints,
- * for a 256-bit fd_set)
- */
-#undef __FD_ZERO
-static __inline__ void __FD_ZERO(__kernel_fd_set *p)
-{
-       unsigned long *tmp = p->fds_bits;
-       int i;
-
-       if (__builtin_constant_p(__FDSET_LONGS)) {
-               switch (__FDSET_LONGS) {
-                     case 16:
-                       tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
-                       tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0;
-                       tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0;
-                       tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0;
-                       return;
-
-                     case 8:
-                       tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
-                       tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0;
-                       return;
-
-                     case 4:
-                       tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0;
-                       return;
-               }
-       }
-       i = __FDSET_LONGS;
-       while (i) {
-               i--;
-               *tmp = 0;
-               tmp++;
-       }
-}
-
-#endif /* __GNUC__ */
-
-#endif /* __KERNEL__ */
-
-#endif /* _ALPHA_POSIX_TYPES_H */
diff --git a/include/asm-alpha/processor.h b/include/asm-alpha/processor.h
deleted file mode 100644 (file)
index 94afe58..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * include/asm-alpha/processor.h
- *
- * Copyright (C) 1994 Linus Torvalds
- */
-
-#ifndef __ASM_ALPHA_PROCESSOR_H
-#define __ASM_ALPHA_PROCESSOR_H
-
-#include <linux/personality.h> /* for ADDR_LIMIT_32BIT */
-
-/*
- * Returns current instruction pointer ("program counter").
- */
-#define current_text_addr() \
-  ({ void *__pc; __asm__ ("br %0,.+4" : "=r"(__pc)); __pc; })
-
-/*
- * We have a 42-bit user address space: 4TB user VM...
- */
-#define TASK_SIZE (0x40000000000UL)
-
-#define STACK_TOP \
-  (current->personality & ADDR_LIMIT_32BIT ? 0x80000000 : 0x00120000000UL)
-
-#define STACK_TOP_MAX  0x00120000000UL
-
-/* This decides where the kernel will search for a free chunk of vm
- * space during mmap's.
- */
-#define TASK_UNMAPPED_BASE \
-  ((current->personality & ADDR_LIMIT_32BIT) ? 0x40000000 : TASK_SIZE / 2)
-
-typedef struct {
-       unsigned long seg;
-} mm_segment_t;
-
-/* This is dead.  Everything has been moved to thread_info.  */
-struct thread_struct { };
-#define INIT_THREAD  { }
-
-/* Return saved PC of a blocked thread.  */
-struct task_struct;
-extern unsigned long thread_saved_pc(struct task_struct *);
-
-/* Do necessary setup to start up a newly executed thread.  */
-extern void start_thread(struct pt_regs *, unsigned long, unsigned long);
-
-/* Free all resources held by a thread. */
-extern void release_thread(struct task_struct *);
-
-/* Prepare to copy thread state - unlazy all lazy status */
-#define prepare_to_copy(tsk)   do { } while (0)
-
-/* Create a kernel thread without removing it from tasklists.  */
-extern long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
-
-unsigned long get_wchan(struct task_struct *p);
-
-#define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc)
-
-#define KSTK_ESP(tsk) \
-  ((tsk) == current ? rdusp() : task_thread_info(tsk)->pcb.usp)
-
-#define cpu_relax()    barrier()
-
-#define ARCH_HAS_PREFETCH
-#define ARCH_HAS_PREFETCHW
-#define ARCH_HAS_SPINLOCK_PREFETCH
-
-#ifndef CONFIG_SMP
-/* Nothing to prefetch. */
-#define spin_lock_prefetch(lock)       do { } while (0)
-#endif
-
-extern inline void prefetch(const void *ptr)  
-{ 
-       __builtin_prefetch(ptr, 0, 3);
-}
-
-extern inline void prefetchw(const void *ptr)  
-{
-       __builtin_prefetch(ptr, 1, 3);
-}
-
-#ifdef CONFIG_SMP
-extern inline void spin_lock_prefetch(const void *ptr)  
-{
-       __builtin_prefetch(ptr, 1, 3);
-}
-#endif
-
-#endif /* __ASM_ALPHA_PROCESSOR_H */
diff --git a/include/asm-alpha/ptrace.h b/include/asm-alpha/ptrace.h
deleted file mode 100644 (file)
index 32c7a5c..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef _ASMAXP_PTRACE_H
-#define _ASMAXP_PTRACE_H
-
-
-/*
- * This struct defines the way the registers are stored on the
- * kernel stack during a system call or other kernel entry
- *
- * NOTE! I want to minimize the overhead of system calls, so this
- * struct has as little information as possible.  I does not have
- *
- *  - floating point regs: the kernel doesn't change those
- *  - r9-15: saved by the C compiler
- *
- * This makes "fork()" and "exec()" a bit more complex, but should
- * give us low system call latency.
- */
-
-struct pt_regs {
-       unsigned long r0;
-       unsigned long r1;
-       unsigned long r2;
-       unsigned long r3;
-       unsigned long r4;
-       unsigned long r5;
-       unsigned long r6;
-       unsigned long r7;
-       unsigned long r8;
-       unsigned long r19;
-       unsigned long r20;
-       unsigned long r21;
-       unsigned long r22;
-       unsigned long r23;
-       unsigned long r24;
-       unsigned long r25;
-       unsigned long r26;
-       unsigned long r27;
-       unsigned long r28;
-       unsigned long hae;
-/* JRP - These are the values provided to a0-a2 by PALcode */
-       unsigned long trap_a0;
-       unsigned long trap_a1;
-       unsigned long trap_a2;
-/* These are saved by PAL-code: */
-       unsigned long ps;
-       unsigned long pc;
-       unsigned long gp;
-       unsigned long r16;
-       unsigned long r17;
-       unsigned long r18;
-};
-
-/*
- * This is the extended stack used by signal handlers and the context
- * switcher: it's pushed after the normal "struct pt_regs".
- */
-struct switch_stack {
-       unsigned long r9;
-       unsigned long r10;
-       unsigned long r11;
-       unsigned long r12;
-       unsigned long r13;
-       unsigned long r14;
-       unsigned long r15;
-       unsigned long r26;
-       unsigned long fp[32];   /* fp[31] is fpcr */
-};
-
-#ifdef __KERNEL__
-
-#define user_mode(regs) (((regs)->ps & 8) != 0)
-#define instruction_pointer(regs) ((regs)->pc)
-#define profile_pc(regs) instruction_pointer(regs)
-extern void show_regs(struct pt_regs *);
-
-#define task_pt_regs(task) \
-  ((struct pt_regs *) (task_stack_page(task) + 2*PAGE_SIZE) - 1)
-
-#define force_successful_syscall_return() (task_pt_regs(current)->r0 = 0)
-
-#endif
-
-#endif
diff --git a/include/asm-alpha/reg.h b/include/asm-alpha/reg.h
deleted file mode 100644 (file)
index 86ff916..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef __reg_h__
-#define __reg_h__
-
-/*
- * Exception frame offsets.
- */
-#define EF_V0          0
-#define EF_T0          1
-#define EF_T1          2
-#define EF_T2          3
-#define EF_T3          4
-#define EF_T4          5
-#define EF_T5          6
-#define EF_T6          7
-#define EF_T7          8
-#define EF_S0          9
-#define EF_S1          10
-#define EF_S2          11
-#define EF_S3          12
-#define EF_S4          13
-#define EF_S5          14
-#define EF_S6          15
-#define EF_A3          16
-#define EF_A4          17
-#define EF_A5          18
-#define EF_T8          19
-#define EF_T9          20
-#define EF_T10         21
-#define EF_T11         22
-#define EF_RA          23
-#define EF_T12         24
-#define EF_AT          25
-#define EF_SP          26
-#define EF_PS          27
-#define EF_PC          28
-#define EF_GP          29
-#define EF_A0          30
-#define EF_A1          31
-#define EF_A2          32
-
-#define EF_SIZE                (33*8)
-#define HWEF_SIZE      (6*8)           /* size of PAL frame (PS-A2) */
-
-#define EF_SSIZE       (EF_SIZE - HWEF_SIZE)
-
-/*
- * Map register number into core file offset.
- */
-#define CORE_REG(reg, ubase) \
-       (((unsigned long *)((unsigned long)(ubase)))[reg])
-
-#endif /* __reg_h__ */
diff --git a/include/asm-alpha/regdef.h b/include/asm-alpha/regdef.h
deleted file mode 100644 (file)
index 142df9c..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef __alpha_regdef_h__
-#define __alpha_regdef_h__
-
-#define v0     $0      /* function return value */
-
-#define t0     $1      /* temporary registers (caller-saved) */
-#define t1     $2
-#define t2     $3
-#define t3     $4
-#define t4     $5
-#define t5     $6
-#define t6     $7
-#define t7     $8
-
-#define        s0      $9      /* saved-registers (callee-saved registers) */
-#define        s1      $10
-#define        s2      $11
-#define        s3      $12
-#define        s4      $13
-#define        s5      $14
-#define        s6      $15
-#define        fp      s6      /* frame-pointer (s6 in frame-less procedures) */
-
-#define a0     $16     /* argument registers (caller-saved) */
-#define a1     $17
-#define a2     $18
-#define a3     $19
-#define a4     $20
-#define a5     $21
-
-#define t8     $22     /* more temps (caller-saved) */
-#define t9     $23
-#define t10    $24
-#define t11    $25
-#define ra     $26     /* return address register */
-#define t12    $27
-
-#define pv     t12     /* procedure-variable register */
-#define AT     $at     /* assembler temporary */
-#define gp     $29     /* global pointer */
-#define sp     $30     /* stack pointer */
-#define zero   $31     /* reads as zero, writes are noops */
-
-#endif /* __alpha_regdef_h__ */
diff --git a/include/asm-alpha/resource.h b/include/asm-alpha/resource.h
deleted file mode 100644 (file)
index c10874f..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef _ALPHA_RESOURCE_H
-#define _ALPHA_RESOURCE_H
-
-/*
- * Alpha/Linux-specific ordering of these four resource limit IDs,
- * the rest comes from the generic header:
- */
-#define RLIMIT_NOFILE          6       /* max number of open files */
-#define RLIMIT_AS              7       /* address space limit */
-#define RLIMIT_NPROC           8       /* max number of processes */
-#define RLIMIT_MEMLOCK         9       /* max locked-in-memory address space */
-
-/*
- * SuS says limits have to be unsigned.  Fine, it's unsigned, but
- * we retain the old value for compatibility, especially with DU. 
- * When you run into the 2^63 barrier, you call me.
- */
-#define RLIM_INFINITY          0x7ffffffffffffffful
-
-#include <asm-generic/resource.h>
-
-#endif /* _ALPHA_RESOURCE_H */
diff --git a/include/asm-alpha/rtc.h b/include/asm-alpha/rtc.h
deleted file mode 100644 (file)
index 4e854b1..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef _ALPHA_RTC_H
-#define _ALPHA_RTC_H
-
-/*
- * Alpha uses the default access methods for the RTC.
- */
-
-#include <asm-generic/rtc.h>
-
-#endif
diff --git a/include/asm-alpha/rwsem.h b/include/asm-alpha/rwsem.h
deleted file mode 100644 (file)
index 1570c0b..0000000
+++ /dev/null
@@ -1,259 +0,0 @@
-#ifndef _ALPHA_RWSEM_H
-#define _ALPHA_RWSEM_H
-
-/*
- * Written by Ivan Kokshaysky <ink@jurassic.park.msu.ru>, 2001.
- * Based on asm-alpha/semaphore.h and asm-i386/rwsem.h
- */
-
-#ifndef _LINUX_RWSEM_H
-#error "please don't include asm/rwsem.h directly, use linux/rwsem.h instead"
-#endif
-
-#ifdef __KERNEL__
-
-#include <linux/compiler.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-
-struct rwsem_waiter;
-
-extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem);
-extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem);
-extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *);
-extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem);
-
-/*
- * the semaphore definition
- */
-struct rw_semaphore {
-       long                    count;
-#define RWSEM_UNLOCKED_VALUE           0x0000000000000000L
-#define RWSEM_ACTIVE_BIAS              0x0000000000000001L
-#define RWSEM_ACTIVE_MASK              0x00000000ffffffffL
-#define RWSEM_WAITING_BIAS             (-0x0000000100000000L)
-#define RWSEM_ACTIVE_READ_BIAS         RWSEM_ACTIVE_BIAS
-#define RWSEM_ACTIVE_WRITE_BIAS                (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
-       spinlock_t              wait_lock;
-       struct list_head        wait_list;
-};
-
-#define __RWSEM_INITIALIZER(name) \
-       { RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, \
-       LIST_HEAD_INIT((name).wait_list) }
-
-#define DECLARE_RWSEM(name) \
-       struct rw_semaphore name = __RWSEM_INITIALIZER(name)
-
-static inline void init_rwsem(struct rw_semaphore *sem)
-{
-       sem->count = RWSEM_UNLOCKED_VALUE;
-       spin_lock_init(&sem->wait_lock);
-       INIT_LIST_HEAD(&sem->wait_list);
-}
-
-static inline void __down_read(struct rw_semaphore *sem)
-{
-       long oldcount;
-#ifndef        CONFIG_SMP
-       oldcount = sem->count;
-       sem->count += RWSEM_ACTIVE_READ_BIAS;
-#else
-       long temp;
-       __asm__ __volatile__(
-       "1:     ldq_l   %0,%1\n"
-       "       addq    %0,%3,%2\n"
-       "       stq_c   %2,%1\n"
-       "       beq     %2,2f\n"
-       "       mb\n"
-       ".subsection 2\n"
-       "2:     br      1b\n"
-       ".previous"
-       :"=&r" (oldcount), "=m" (sem->count), "=&r" (temp)
-       :"Ir" (RWSEM_ACTIVE_READ_BIAS), "m" (sem->count) : "memory");
-#endif
-       if (unlikely(oldcount < 0))
-               rwsem_down_read_failed(sem);
-}
-
-/*
- * trylock for reading -- returns 1 if successful, 0 if contention
- */
-static inline int __down_read_trylock(struct rw_semaphore *sem)
-{
-       long old, new, res;
-
-       res = sem->count;
-       do {
-               new = res + RWSEM_ACTIVE_READ_BIAS;
-               if (new <= 0)
-                       break;
-               old = res;
-               res = cmpxchg(&sem->count, old, new);
-       } while (res != old);
-       return res >= 0 ? 1 : 0;
-}
-
-static inline void __down_write(struct rw_semaphore *sem)
-{
-       long oldcount;
-#ifndef        CONFIG_SMP
-       oldcount = sem->count;
-       sem->count += RWSEM_ACTIVE_WRITE_BIAS;
-#else
-       long temp;
-       __asm__ __volatile__(
-       "1:     ldq_l   %0,%1\n"
-       "       addq    %0,%3,%2\n"
-       "       stq_c   %2,%1\n"
-       "       beq     %2,2f\n"
-       "       mb\n"
-       ".subsection 2\n"
-       "2:     br      1b\n"
-       ".previous"
-       :"=&r" (oldcount), "=m" (sem->count), "=&r" (temp)
-       :"Ir" (RWSEM_ACTIVE_WRITE_BIAS), "m" (sem->count) : "memory");
-#endif
-       if (unlikely(oldcount))
-               rwsem_down_write_failed(sem);
-}
-
-/*
- * trylock for writing -- returns 1 if successful, 0 if contention
- */
-static inline int __down_write_trylock(struct rw_semaphore *sem)
-{
-       long ret = cmpxchg(&sem->count, RWSEM_UNLOCKED_VALUE,
-                          RWSEM_ACTIVE_WRITE_BIAS);
-       if (ret == RWSEM_UNLOCKED_VALUE)
-               return 1;
-       return 0;
-}
-
-static inline void __up_read(struct rw_semaphore *sem)
-{
-       long oldcount;
-#ifndef        CONFIG_SMP
-       oldcount = sem->count;
-       sem->count -= RWSEM_ACTIVE_READ_BIAS;
-#else
-       long temp;
-       __asm__ __volatile__(
-       "       mb\n"
-       "1:     ldq_l   %0,%1\n"
-       "       subq    %0,%3,%2\n"
-       "       stq_c   %2,%1\n"
-       "       beq     %2,2f\n"
-       ".subsection 2\n"
-       "2:     br      1b\n"
-       ".previous"
-       :"=&r" (oldcount), "=m" (sem->count), "=&r" (temp)
-       :"Ir" (RWSEM_ACTIVE_READ_BIAS), "m" (sem->count) : "memory");
-#endif
-       if (unlikely(oldcount < 0))
-               if ((int)oldcount - RWSEM_ACTIVE_READ_BIAS == 0)
-                       rwsem_wake(sem);
-}
-
-static inline void __up_write(struct rw_semaphore *sem)
-{
-       long count;
-#ifndef        CONFIG_SMP
-       sem->count -= RWSEM_ACTIVE_WRITE_BIAS;
-       count = sem->count;
-#else
-       long temp;
-       __asm__ __volatile__(
-       "       mb\n"
-       "1:     ldq_l   %0,%1\n"
-       "       subq    %0,%3,%2\n"
-       "       stq_c   %2,%1\n"
-       "       beq     %2,2f\n"
-       "       subq    %0,%3,%0\n"
-       ".subsection 2\n"
-       "2:     br      1b\n"
-       ".previous"
-       :"=&r" (count), "=m" (sem->count), "=&r" (temp)
-       :"Ir" (RWSEM_ACTIVE_WRITE_BIAS), "m" (sem->count) : "memory");
-#endif
-       if (unlikely(count))
-               if ((int)count == 0)
-                       rwsem_wake(sem);
-}
-
-/*
- * downgrade write lock to read lock
- */
-static inline void __downgrade_write(struct rw_semaphore *sem)
-{
-       long oldcount;
-#ifndef        CONFIG_SMP
-       oldcount = sem->count;
-       sem->count -= RWSEM_WAITING_BIAS;
-#else
-       long temp;
-       __asm__ __volatile__(
-       "1:     ldq_l   %0,%1\n"
-       "       addq    %0,%3,%2\n"
-       "       stq_c   %2,%1\n"
-       "       beq     %2,2f\n"
-       "       mb\n"
-       ".subsection 2\n"
-       "2:     br      1b\n"
-       ".previous"
-       :"=&r" (oldcount), "=m" (sem->count), "=&r" (temp)
-       :"Ir" (-RWSEM_WAITING_BIAS), "m" (sem->count) : "memory");
-#endif
-       if (unlikely(oldcount < 0))
-               rwsem_downgrade_wake(sem);
-}
-
-static inline void rwsem_atomic_add(long val, struct rw_semaphore *sem)
-{
-#ifndef        CONFIG_SMP
-       sem->count += val;
-#else
-       long temp;
-       __asm__ __volatile__(
-       "1:     ldq_l   %0,%1\n"
-       "       addq    %0,%2,%0\n"
-       "       stq_c   %0,%1\n"
-       "       beq     %0,2f\n"
-       ".subsection 2\n"
-       "2:     br      1b\n"
-       ".previous"
-       :"=&r" (temp), "=m" (sem->count)
-       :"Ir" (val), "m" (sem->count));
-#endif
-}
-
-static inline long rwsem_atomic_update(long val, struct rw_semaphore *sem)
-{
-#ifndef        CONFIG_SMP
-       sem->count += val;
-       return sem->count;
-#else
-       long ret, temp;
-       __asm__ __volatile__(
-       "1:     ldq_l   %0,%1\n"
-       "       addq    %0,%3,%2\n"
-       "       addq    %0,%3,%0\n"
-       "       stq_c   %2,%1\n"
-       "       beq     %2,2f\n"
-       ".subsection 2\n"
-       "2:     br      1b\n"
-       ".previous"
-       :"=&r" (ret), "=m" (sem->count), "=&r" (temp)
-       :"Ir" (val), "m" (sem->count));
-
-       return ret;
-#endif
-}
-
-static inline int rwsem_is_locked(struct rw_semaphore *sem)
-{
-       return (sem->count != 0);
-}
-
-#endif /* __KERNEL__ */
-#endif /* _ALPHA_RWSEM_H */
diff --git a/include/asm-alpha/scatterlist.h b/include/asm-alpha/scatterlist.h
deleted file mode 100644 (file)
index 440747c..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef _ALPHA_SCATTERLIST_H
-#define _ALPHA_SCATTERLIST_H
-
-#include <asm/page.h>
-#include <asm/types.h>
-  
-struct scatterlist {
-#ifdef CONFIG_DEBUG_SG
-       unsigned long sg_magic;
-#endif
-       unsigned long page_link;
-       unsigned int offset;
-
-       unsigned int length;
-
-       dma_addr_t dma_address;
-       __u32 dma_length;
-};
-
-#define sg_dma_address(sg)     ((sg)->dma_address)
-#define sg_dma_len(sg)         ((sg)->dma_length)
-
-#define ISA_DMA_THRESHOLD (~0UL)
-
-#endif /* !(_ALPHA_SCATTERLIST_H) */
diff --git a/include/asm-alpha/sections.h b/include/asm-alpha/sections.h
deleted file mode 100644 (file)
index 43b40ed..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _ALPHA_SECTIONS_H
-#define _ALPHA_SECTIONS_H
-
-/* nothing to see, move along */
-#include <asm-generic/sections.h>
-
-#endif
diff --git a/include/asm-alpha/segment.h b/include/asm-alpha/segment.h
deleted file mode 100644 (file)
index 0453d97..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef __ALPHA_SEGMENT_H
-#define __ALPHA_SEGMENT_H
-
-/* Only here because we have some old header files that expect it.. */
-
-#endif
diff --git a/include/asm-alpha/sembuf.h b/include/asm-alpha/sembuf.h
deleted file mode 100644 (file)
index 7b38b15..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef _ALPHA_SEMBUF_H
-#define _ALPHA_SEMBUF_H
-
-/* 
- * The semid64_ds structure for alpha architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space is left for:
- * - 2 miscellaneous 64-bit values
- */
-
-struct semid64_ds {
-       struct ipc64_perm sem_perm;             /* permissions .. see ipc.h */
-       __kernel_time_t sem_otime;              /* last semop time */
-       __kernel_time_t sem_ctime;              /* last change time */
-       unsigned long   sem_nsems;              /* no. of semaphores in array */
-       unsigned long   __unused1;
-       unsigned long   __unused2;
-};
-
-#endif /* _ALPHA_SEMBUF_H */
diff --git a/include/asm-alpha/serial.h b/include/asm-alpha/serial.h
deleted file mode 100644 (file)
index 9d263e8..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * include/asm-alpha/serial.h
- */
-
-
-/*
- * This assumes you have a 1.8432 MHz clock for your UART.
- *
- * It'd be nice if someone built a serial card with a 24.576 MHz
- * clock, since the 16550A is capable of handling a top speed of 1.5
- * megabits/second; but this requires the faster clock.
- */
-#define BASE_BAUD ( 1843200 / 16 )
-
-/* Standard COM flags (except for COM4, because of the 8514 problem) */
-#ifdef CONFIG_SERIAL_DETECT_IRQ
-#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ)
-#define STD_COM4_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_AUTO_IRQ)
-#else
-#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
-#define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF
-#endif
-
-#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 */     \
-       { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS },      /* ttyS2 */     \
-       { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS },     /* ttyS3 */
diff --git a/include/asm-alpha/setup.h b/include/asm-alpha/setup.h
deleted file mode 100644 (file)
index 2e023a4..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef __ALPHA_SETUP_H
-#define __ALPHA_SETUP_H
-
-#define COMMAND_LINE_SIZE      256
-
-#endif
diff --git a/include/asm-alpha/sfp-machine.h b/include/asm-alpha/sfp-machine.h
deleted file mode 100644 (file)
index 5fe63af..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/* Machine-dependent software floating-point definitions.
-   Alpha kernel version.
-   Copyright (C) 1997,1998,1999 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson (rth@cygnus.com),
-                 Jakub Jelinek (jakub@redhat.com) and
-                 David S. Miller (davem@redhat.com).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If
-   not, write to the Free Software Foundation, Inc.,
-   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-#ifndef _SFP_MACHINE_H
-#define _SFP_MACHINE_H
-   
-#define _FP_W_TYPE_SIZE                64
-#define _FP_W_TYPE             unsigned long
-#define _FP_WS_TYPE            signed long
-#define _FP_I_TYPE             long
-
-#define _FP_MUL_MEAT_S(R,X,Y)                                  \
-  _FP_MUL_MEAT_1_imm(_FP_WFRACBITS_S,R,X,Y)
-#define _FP_MUL_MEAT_D(R,X,Y)                                  \
-  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
-#define _FP_MUL_MEAT_Q(R,X,Y)                                  \
-  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
-
-#define _FP_DIV_MEAT_S(R,X,Y)  _FP_DIV_MEAT_1_imm(S,R,X,Y,_FP_DIV_HELP_imm)
-#define _FP_DIV_MEAT_D(R,X,Y)  _FP_DIV_MEAT_1_udiv(D,R,X,Y)
-#define _FP_DIV_MEAT_Q(R,X,Y)  _FP_DIV_MEAT_2_udiv(Q,R,X,Y)
-
-#define _FP_NANFRAC_S          _FP_QNANBIT_S
-#define _FP_NANFRAC_D          _FP_QNANBIT_D
-#define _FP_NANFRAC_Q          _FP_QNANBIT_Q
-#define _FP_NANSIGN_S          1
-#define _FP_NANSIGN_D          1
-#define _FP_NANSIGN_Q          1
-
-#define _FP_KEEPNANFRACP 1
-
-/* Alpha Architecture Handbook, 4.7.10.4 sais that
- * we should prefer any type of NaN in Fb, then Fa.
- */
-#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)                     \
-  do {                                                         \
-    R##_s = Y##_s;                                             \
-    _FP_FRAC_COPY_##wc(R,X);                                   \
-    R##_c = FP_CLS_NAN;                                                \
-  } while (0)
-
-/* Obtain the current rounding mode. */
-#define FP_ROUNDMODE   mode
-#define FP_RND_NEAREST (FPCR_DYN_NORMAL >> FPCR_DYN_SHIFT)
-#define FP_RND_ZERO    (FPCR_DYN_CHOPPED >> FPCR_DYN_SHIFT)
-#define FP_RND_PINF    (FPCR_DYN_PLUS >> FPCR_DYN_SHIFT)
-#define FP_RND_MINF    (FPCR_DYN_MINUS >> FPCR_DYN_SHIFT)
-
-/* Exception flags. */
-#define FP_EX_INVALID          IEEE_TRAP_ENABLE_INV
-#define FP_EX_OVERFLOW         IEEE_TRAP_ENABLE_OVF
-#define FP_EX_UNDERFLOW                IEEE_TRAP_ENABLE_UNF
-#define FP_EX_DIVZERO          IEEE_TRAP_ENABLE_DZE
-#define FP_EX_INEXACT          IEEE_TRAP_ENABLE_INE
-#define FP_EX_DENORM           IEEE_TRAP_ENABLE_DNO
-
-#define FP_DENORM_ZERO         (swcr & IEEE_MAP_DMZ)
-
-/* We write the results always */
-#define FP_INHIBIT_RESULTS 0
-
-#endif
diff --git a/include/asm-alpha/shmbuf.h b/include/asm-alpha/shmbuf.h
deleted file mode 100644 (file)
index 37ee84f..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef _ALPHA_SHMBUF_H
-#define _ALPHA_SHMBUF_H
-
-/* 
- * The shmid64_ds structure for alpha architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space is left for:
- * - 2 miscellaneous 64-bit values
- */
-
-struct shmid64_ds {
-       struct ipc64_perm       shm_perm;       /* operation perms */
-       size_t                  shm_segsz;      /* size of segment (bytes) */
-       __kernel_time_t         shm_atime;      /* last attach time */
-       __kernel_time_t         shm_dtime;      /* last detach time */
-       __kernel_time_t         shm_ctime;      /* last change time */
-       __kernel_pid_t          shm_cpid;       /* pid of creator */
-       __kernel_pid_t          shm_lpid;       /* pid of last operator */
-       unsigned long           shm_nattch;     /* no. of current attaches */
-       unsigned long           __unused1;
-       unsigned long           __unused2;
-};
-
-struct shminfo64 {
-       unsigned long   shmmax;
-       unsigned long   shmmin;
-       unsigned long   shmmni;
-       unsigned long   shmseg;
-       unsigned long   shmall;
-       unsigned long   __unused1;
-       unsigned long   __unused2;
-       unsigned long   __unused3;
-       unsigned long   __unused4;
-};
-
-#endif /* _ALPHA_SHMBUF_H */
diff --git a/include/asm-alpha/shmparam.h b/include/asm-alpha/shmparam.h
deleted file mode 100644 (file)
index cc901d5..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _ASMAXP_SHMPARAM_H
-#define _ASMAXP_SHMPARAM_H
-
-#define        SHMLBA PAGE_SIZE                 /* attach addr a multiple of this */
-
-#endif /* _ASMAXP_SHMPARAM_H */
diff --git a/include/asm-alpha/sigcontext.h b/include/asm-alpha/sigcontext.h
deleted file mode 100644 (file)
index 323cdb0..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef _ASMAXP_SIGCONTEXT_H
-#define _ASMAXP_SIGCONTEXT_H
-
-struct sigcontext {
-       /*
-        * What should we have here? I'd probably better use the same
-        * stack layout as OSF/1, just in case we ever want to try
-        * running their binaries.. 
-        *
-        * This is the basic layout, but I don't know if we'll ever
-        * actually fill in all the values..
-        */
-        long           sc_onstack;
-        long           sc_mask;
-        long           sc_pc;
-        long           sc_ps;
-        long           sc_regs[32];
-        long           sc_ownedfp;
-        long           sc_fpregs[32];
-        unsigned long  sc_fpcr;
-        unsigned long  sc_fp_control;
-        unsigned long  sc_reserved1, sc_reserved2;
-        unsigned long  sc_ssize;
-        char *         sc_sbase;
-        unsigned long  sc_traparg_a0;
-        unsigned long  sc_traparg_a1;
-        unsigned long  sc_traparg_a2;
-        unsigned long  sc_fp_trap_pc;
-        unsigned long  sc_fp_trigger_sum;
-        unsigned long  sc_fp_trigger_inst;
-};
-
-
-#endif
diff --git a/include/asm-alpha/siginfo.h b/include/asm-alpha/siginfo.h
deleted file mode 100644 (file)
index 9822362..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef _ALPHA_SIGINFO_H
-#define _ALPHA_SIGINFO_H
-
-#define __ARCH_SI_PREAMBLE_SIZE                (4 * sizeof(int))
-#define __ARCH_SI_TRAPNO
-
-#include <asm-generic/siginfo.h>
-
-#endif
diff --git a/include/asm-alpha/signal.h b/include/asm-alpha/signal.h
deleted file mode 100644 (file)
index 13c2305..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-#ifndef _ASMAXP_SIGNAL_H
-#define _ASMAXP_SIGNAL_H
-
-#include <linux/types.h>
-
-/* Avoid too many header ordering problems.  */
-struct siginfo;
-
-#ifdef __KERNEL__
-/* Digital Unix defines 64 signals.  Most things should be clean enough
-   to redefine this at will, if care is taken to make libc match.  */
-
-#define _NSIG          64
-#define _NSIG_BPW      64
-#define _NSIG_WORDS    (_NSIG / _NSIG_BPW)
-
-typedef unsigned long old_sigset_t;            /* at least 32 bits */
-
-typedef struct {
-       unsigned long sig[_NSIG_WORDS];
-} sigset_t;
-
-#else
-/* Here we must cater to libcs that poke about in kernel headers.  */
-
-#define NSIG           32
-typedef unsigned long sigset_t;
-
-#endif /* __KERNEL__ */
-
-
-/*
- * Linux/AXP has different signal numbers that Linux/i386: I'm trying
- * to make it OSF/1 binary compatible, at least for normal binaries.
- */
-#define SIGHUP          1
-#define SIGINT          2
-#define SIGQUIT                 3
-#define SIGILL          4
-#define SIGTRAP                 5
-#define SIGABRT                 6
-#define SIGEMT          7
-#define SIGFPE          8
-#define SIGKILL                 9
-#define SIGBUS         10
-#define SIGSEGV                11
-#define SIGSYS         12
-#define SIGPIPE                13
-#define SIGALRM                14
-#define SIGTERM                15
-#define SIGURG         16
-#define SIGSTOP                17
-#define SIGTSTP                18
-#define SIGCONT                19
-#define SIGCHLD                20
-#define SIGTTIN                21
-#define SIGTTOU                22
-#define SIGIO          23
-#define SIGXCPU                24
-#define SIGXFSZ                25
-#define SIGVTALRM      26
-#define SIGPROF                27
-#define SIGWINCH       28
-#define SIGINFO                29
-#define SIGUSR1                30
-#define SIGUSR2                31
-
-#define SIGPOLL        SIGIO
-#define SIGPWR SIGINFO
-#define SIGIOT SIGABRT
-
-/* These should not be considered constants from userland.  */
-#define SIGRTMIN       32
-#define SIGRTMAX       _NSIG
-
-/*
- * SA_FLAGS values:
- *
- * SA_ONSTACK indicates that a registered stack_t will be used.
- * SA_RESTART flag to get restarting signals (which were the default long ago)
- * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
- * SA_RESETHAND clears the handler when the signal is delivered.
- * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
- * SA_NODEFER prevents the current signal from being masked in the handler.
- *
- * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
- * Unix names RESETHAND and NODEFER respectively.
- */
-
-#define SA_ONSTACK     0x00000001
-#define SA_RESTART     0x00000002
-#define SA_NOCLDSTOP   0x00000004
-#define SA_NODEFER     0x00000008
-#define SA_RESETHAND   0x00000010
-#define SA_NOCLDWAIT   0x00000020
-#define SA_SIGINFO     0x00000040
-
-#define SA_ONESHOT     SA_RESETHAND
-#define SA_NOMASK      SA_NODEFER
-
-/* 
- * sigaltstack controls
- */
-#define SS_ONSTACK     1
-#define SS_DISABLE     2
-
-#define MINSIGSTKSZ    4096
-#define SIGSTKSZ       16384
-
-#define SIG_BLOCK          1   /* for blocking signals */
-#define SIG_UNBLOCK        2   /* for unblocking signals */
-#define SIG_SETMASK        3   /* for setting the signal mask */
-
-#include <asm-generic/signal.h>
-
-#ifdef __KERNEL__
-struct osf_sigaction {
-       __sighandler_t  sa_handler;
-       old_sigset_t    sa_mask;
-       int             sa_flags;
-};
-
-struct sigaction {
-       __sighandler_t  sa_handler;
-       unsigned long   sa_flags;
-       sigset_t        sa_mask;        /* mask last for extensibility */
-};
-
-struct k_sigaction {
-       struct sigaction sa;
-       __sigrestore_t ka_restorer;
-};
-#else
-/* Here we must cater to libcs that poke about in kernel headers.  */
-
-struct sigaction {
-       union {
-         __sighandler_t        _sa_handler;
-         void (*_sa_sigaction)(int, struct siginfo *, void *);
-       } _u;
-       sigset_t        sa_mask;
-       int             sa_flags;
-};
-
-#define sa_handler     _u._sa_handler
-#define sa_sigaction   _u._sa_sigaction
-
-#endif /* __KERNEL__ */
-
-typedef struct sigaltstack {
-       void __user *ss_sp;
-       int ss_flags;
-       size_t ss_size;
-} stack_t;
-
-/* sigstack(2) is deprecated, and will be withdrawn in a future version
-   of the X/Open CAE Specification.  Use sigaltstack instead.  It is only
-   implemented here for OSF/1 compatibility.  */
-
-struct sigstack {
-       void __user *ss_sp;
-       int ss_onstack;
-};
-
-#ifdef __KERNEL__
-#include <asm/sigcontext.h>
-
-#define ptrace_signal_deliver(regs, cookie) do { } while (0)
-
-#endif
-
-#endif
diff --git a/include/asm-alpha/smp.h b/include/asm-alpha/smp.h
deleted file mode 100644 (file)
index 544c69a..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef __ASM_SMP_H
-#define __ASM_SMP_H
-
-#include <linux/threads.h>
-#include <linux/cpumask.h>
-#include <linux/bitops.h>
-#include <asm/pal.h>
-
-/* HACK: Cabrio WHAMI return value is bogus if more than 8 bits used.. :-( */
-
-static __inline__ unsigned char
-__hard_smp_processor_id(void)
-{
-       register unsigned char __r0 __asm__("$0");
-       __asm__ __volatile__(
-               "call_pal %1 #whami"
-               : "=r"(__r0)
-               :"i" (PAL_whami)
-               : "$1", "$22", "$23", "$24", "$25");
-       return __r0;
-}
-
-#ifdef CONFIG_SMP
-
-#include <asm/irq.h>
-
-struct cpuinfo_alpha {
-       unsigned long loops_per_jiffy;
-       unsigned long last_asn;
-       int need_new_asn;
-       int asn_lock;
-       unsigned long ipi_count;
-       unsigned long prof_multiplier;
-       unsigned long prof_counter;
-       unsigned char mcheck_expected;
-       unsigned char mcheck_taken;
-       unsigned char mcheck_extra;
-} __attribute__((aligned(64)));
-
-extern struct cpuinfo_alpha cpu_data[NR_CPUS];
-
-#define PROC_CHANGE_PENALTY     20
-
-#define hard_smp_processor_id()        __hard_smp_processor_id()
-#define raw_smp_processor_id() (current_thread_info()->cpu)
-
-extern int smp_num_cpus;
-#define cpu_possible_map       cpu_present_map
-
-extern void arch_send_call_function_single_ipi(int cpu);
-extern void arch_send_call_function_ipi(cpumask_t mask);
-
-#else /* CONFIG_SMP */
-
-#define hard_smp_processor_id()                0
-#define smp_call_function_on_cpu(func,info,wait,cpu)    ({ 0; })
-
-#endif /* CONFIG_SMP */
-
-#define NO_PROC_ID     (-1)
-
-#endif
diff --git a/include/asm-alpha/socket.h b/include/asm-alpha/socket.h
deleted file mode 100644 (file)
index a1057c2..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef _ASM_SOCKET_H
-#define _ASM_SOCKET_H
-
-#include <asm/sockios.h>
-
-/* For setsockopt(2) */
-/*
- * Note: we only bother about making the SOL_SOCKET options
- * same as OSF/1, as that's all that "normal" programs are
- * likely to set.  We don't necessarily want to be binary
- * compatible with _everything_. 
- */
-#define SOL_SOCKET     0xffff
-
-#define SO_DEBUG       0x0001
-#define SO_REUSEADDR   0x0004
-#define SO_KEEPALIVE   0x0008
-#define SO_DONTROUTE   0x0010
-#define SO_BROADCAST   0x0020
-#define SO_LINGER      0x0080
-#define SO_OOBINLINE   0x0100
-/* To add :#define SO_REUSEPORT 0x0200 */
-
-#define SO_TYPE                0x1008
-#define SO_ERROR       0x1007
-#define SO_SNDBUF      0x1001
-#define SO_RCVBUF      0x1002
-#define SO_SNDBUFFORCE 0x100a
-#define SO_RCVBUFFORCE 0x100b
-#define        SO_RCVLOWAT     0x1010
-#define        SO_SNDLOWAT     0x1011
-#define        SO_RCVTIMEO     0x1012
-#define        SO_SNDTIMEO     0x1013
-#define SO_ACCEPTCONN  0x1014
-
-/* linux-specific, might as well be the same as on i386 */
-#define SO_NO_CHECK    11
-#define SO_PRIORITY    12
-#define SO_BSDCOMPAT   14
-
-#define SO_PASSCRED    17
-#define SO_PEERCRED    18
-#define SO_BINDTODEVICE 25
-
-/* Socket filtering */
-#define SO_ATTACH_FILTER        26
-#define SO_DETACH_FILTER        27
-
-#define SO_PEERNAME            28
-#define SO_TIMESTAMP           29
-#define SCM_TIMESTAMP          SO_TIMESTAMP
-
-#define SO_PEERSEC             30
-#define SO_PASSSEC             34
-#define SO_TIMESTAMPNS         35
-#define SCM_TIMESTAMPNS                SO_TIMESTAMPNS
-
-/* Security levels - as per NRL IPv6 - don't actually do anything */
-#define SO_SECURITY_AUTHENTICATION             19
-#define SO_SECURITY_ENCRYPTION_TRANSPORT       20
-#define SO_SECURITY_ENCRYPTION_NETWORK         21
-
-#define SO_MARK                        36
-
-/* O_NONBLOCK clashes with the bits used for socket types.  Therefore we
- * have to define SOCK_NONBLOCK to a different value here.
- */
-#define SOCK_NONBLOCK  0x40000000
-
-#endif /* _ASM_SOCKET_H */
diff --git a/include/asm-alpha/sockios.h b/include/asm-alpha/sockios.h
deleted file mode 100644 (file)
index 7932c7a..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef _ASM_ALPHA_SOCKIOS_H
-#define _ASM_ALPHA_SOCKIOS_H
-
-/* Socket-level I/O control calls. */
-
-#define FIOGETOWN      _IOR('f', 123, int)
-#define FIOSETOWN      _IOW('f', 124, int)
-
-#define SIOCATMARK     _IOR('s', 7, int)
-#define SIOCSPGRP      _IOW('s', 8, pid_t)
-#define SIOCGPGRP      _IOR('s', 9, pid_t)
-
-#define SIOCGSTAMP     0x8906          /* Get stamp (timeval) */
-#define SIOCGSTAMPNS   0x8907          /* Get stamp (timespec) */
-
-#endif /* _ASM_ALPHA_SOCKIOS_H */
diff --git a/include/asm-alpha/spinlock.h b/include/asm-alpha/spinlock.h
deleted file mode 100644 (file)
index aeeb125..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-#ifndef _ALPHA_SPINLOCK_H
-#define _ALPHA_SPINLOCK_H
-
-#include <asm/system.h>
-#include <linux/kernel.h>
-#include <asm/current.h>
-
-/*
- * Simple spin lock operations.  There are two variants, one clears IRQ's
- * on the local processor, one does not.
- *
- * We make no fairness assumptions. They have a cost.
- */
-
-#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
-#define __raw_spin_is_locked(x)        ((x)->lock != 0)
-#define __raw_spin_unlock_wait(x) \
-               do { cpu_relax(); } while ((x)->lock)
-
-static inline void __raw_spin_unlock(raw_spinlock_t * lock)
-{
-       mb();
-       lock->lock = 0;
-}
-
-static inline void __raw_spin_lock(raw_spinlock_t * lock)
-{
-       long tmp;
-
-       __asm__ __volatile__(
-       "1:     ldl_l   %0,%1\n"
-       "       bne     %0,2f\n"
-       "       lda     %0,1\n"
-       "       stl_c   %0,%1\n"
-       "       beq     %0,2f\n"
-       "       mb\n"
-       ".subsection 2\n"
-       "2:     ldl     %0,%1\n"
-       "       bne     %0,2b\n"
-       "       br      1b\n"
-       ".previous"
-       : "=&r" (tmp), "=m" (lock->lock)
-       : "m"(lock->lock) : "memory");
-}
-
-static inline int __raw_spin_trylock(raw_spinlock_t *lock)
-{
-       return !test_and_set_bit(0, &lock->lock);
-}
-
-/***********************************************************/
-
-static inline int __raw_read_can_lock(raw_rwlock_t *lock)
-{
-       return (lock->lock & 1) == 0;
-}
-
-static inline int __raw_write_can_lock(raw_rwlock_t *lock)
-{
-       return lock->lock == 0;
-}
-
-static inline void __raw_read_lock(raw_rwlock_t *lock)
-{
-       long regx;
-
-       __asm__ __volatile__(
-       "1:     ldl_l   %1,%0\n"
-       "       blbs    %1,6f\n"
-       "       subl    %1,2,%1\n"
-       "       stl_c   %1,%0\n"
-       "       beq     %1,6f\n"
-       "       mb\n"
-       ".subsection 2\n"
-       "6:     ldl     %1,%0\n"
-       "       blbs    %1,6b\n"
-       "       br      1b\n"
-       ".previous"
-       : "=m" (*lock), "=&r" (regx)
-       : "m" (*lock) : "memory");
-}
-
-static inline void __raw_write_lock(raw_rwlock_t *lock)
-{
-       long regx;
-
-       __asm__ __volatile__(
-       "1:     ldl_l   %1,%0\n"
-       "       bne     %1,6f\n"
-       "       lda     %1,1\n"
-       "       stl_c   %1,%0\n"
-       "       beq     %1,6f\n"
-       "       mb\n"
-       ".subsection 2\n"
-       "6:     ldl     %1,%0\n"
-       "       bne     %1,6b\n"
-       "       br      1b\n"
-       ".previous"
-       : "=m" (*lock), "=&r" (regx)
-       : "m" (*lock) : "memory");
-}
-
-static inline int __raw_read_trylock(raw_rwlock_t * lock)
-{
-       long regx;
-       int success;
-
-       __asm__ __volatile__(
-       "1:     ldl_l   %1,%0\n"
-       "       lda     %2,0\n"
-       "       blbs    %1,2f\n"
-       "       subl    %1,2,%2\n"
-       "       stl_c   %2,%0\n"
-       "       beq     %2,6f\n"
-       "2:     mb\n"
-       ".subsection 2\n"
-       "6:     br      1b\n"
-       ".previous"
-       : "=m" (*lock), "=&r" (regx), "=&r" (success)
-       : "m" (*lock) : "memory");
-
-       return success;
-}
-
-static inline int __raw_write_trylock(raw_rwlock_t * lock)
-{
-       long regx;
-       int success;
-
-       __asm__ __volatile__(
-       "1:     ldl_l   %1,%0\n"
-       "       lda     %2,0\n"
-       "       bne     %1,2f\n"
-       "       lda     %2,1\n"
-       "       stl_c   %2,%0\n"
-       "       beq     %2,6f\n"
-       "2:     mb\n"
-       ".subsection 2\n"
-       "6:     br      1b\n"
-       ".previous"
-       : "=m" (*lock), "=&r" (regx), "=&r" (success)
-       : "m" (*lock) : "memory");
-
-       return success;
-}
-
-static inline void __raw_read_unlock(raw_rwlock_t * lock)
-{
-       long regx;
-       __asm__ __volatile__(
-       "       mb\n"
-       "1:     ldl_l   %1,%0\n"
-       "       addl    %1,2,%1\n"
-       "       stl_c   %1,%0\n"
-       "       beq     %1,6f\n"
-       ".subsection 2\n"
-       "6:     br      1b\n"
-       ".previous"
-       : "=m" (*lock), "=&r" (regx)
-       : "m" (*lock) : "memory");
-}
-
-static inline void __raw_write_unlock(raw_rwlock_t * lock)
-{
-       mb();
-       lock->lock = 0;
-}
-
-#define _raw_spin_relax(lock)  cpu_relax()
-#define _raw_read_relax(lock)  cpu_relax()
-#define _raw_write_relax(lock) cpu_relax()
-
-#endif /* _ALPHA_SPINLOCK_H */
diff --git a/include/asm-alpha/spinlock_types.h b/include/asm-alpha/spinlock_types.h
deleted file mode 100644 (file)
index 8141eb5..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef _ALPHA_SPINLOCK_TYPES_H
-#define _ALPHA_SPINLOCK_TYPES_H
-
-#ifndef __LINUX_SPINLOCK_TYPES_H
-# error "please don't include this file directly"
-#endif
-
-typedef struct {
-       volatile unsigned int lock;
-} raw_spinlock_t;
-
-#define __RAW_SPIN_LOCK_UNLOCKED       { 0 }
-
-typedef struct {
-       volatile unsigned int lock;
-} raw_rwlock_t;
-
-#define __RAW_RW_LOCK_UNLOCKED         { 0 }
-
-#endif
diff --git a/include/asm-alpha/stat.h b/include/asm-alpha/stat.h
deleted file mode 100644 (file)
index 07ad3e6..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef _ALPHA_STAT_H
-#define _ALPHA_STAT_H
-
-struct stat {
-       unsigned int    st_dev;
-       unsigned int    st_ino;
-       unsigned int    st_mode;
-       unsigned int    st_nlink;
-       unsigned int    st_uid;
-       unsigned int    st_gid;
-       unsigned int    st_rdev;
-       long            st_size;
-       unsigned long   st_atime;
-       unsigned long   st_mtime;
-       unsigned long   st_ctime;
-       unsigned int    st_blksize;
-       unsigned int    st_blocks;
-       unsigned int    st_flags;
-       unsigned int    st_gen;
-};
-
-/* The stat64 structure increases the size of dev_t, blkcnt_t, adds
-   nanosecond resolution times, and padding for expansion.  */
-
-struct stat64 {
-       unsigned long   st_dev;
-       unsigned long   st_ino;
-       unsigned long   st_rdev;
-       long            st_size;
-       unsigned long   st_blocks;
-
-       unsigned int    st_mode;
-       unsigned int    st_uid;
-       unsigned int    st_gid;
-       unsigned int    st_blksize;
-       unsigned int    st_nlink;
-       unsigned int    __pad0;
-
-       unsigned long   st_atime;
-       unsigned long   st_atime_nsec; 
-       unsigned long   st_mtime;
-       unsigned long   st_mtime_nsec;
-       unsigned long   st_ctime;
-       unsigned long   st_ctime_nsec;
-       long            __unused[3];
-};
-
-#endif
diff --git a/include/asm-alpha/statfs.h b/include/asm-alpha/statfs.h
deleted file mode 100644 (file)
index ad15830..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _ALPHA_STATFS_H
-#define _ALPHA_STATFS_H
-
-#include <asm-generic/statfs.h>
-
-#endif
diff --git a/include/asm-alpha/string.h b/include/asm-alpha/string.h
deleted file mode 100644 (file)
index b02b8a2..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef __ALPHA_STRING_H__
-#define __ALPHA_STRING_H__
-
-#ifdef __KERNEL__
-
-/*
- * GCC of any recent vintage doesn't do stupid things with bcopy.
- * EGCS 1.1 knows all about expanding memcpy inline, others don't.
- *
- * Similarly for a memset with data = 0.
- */
-
-#define __HAVE_ARCH_MEMCPY
-extern void * memcpy(void *, const void *, size_t);
-#define __HAVE_ARCH_MEMMOVE
-extern void * memmove(void *, const void *, size_t);
-
-/* For backward compatibility with modules.  Unused otherwise.  */
-extern void * __memcpy(void *, const void *, size_t);
-
-#define memcpy __builtin_memcpy
-
-#define __HAVE_ARCH_MEMSET
-extern void * __constant_c_memset(void *, unsigned long, size_t);
-extern void * __memset(void *, int, size_t);
-extern void * memset(void *, int, size_t);
-
-#define memset(s, c, n)                                                            \
-(__builtin_constant_p(c)                                                   \
- ? (__builtin_constant_p(n) && (c) == 0                                            \
-    ? __builtin_memset((s),0,(n))                                          \
-    : __constant_c_memset((s),0x0101010101010101UL*(unsigned char)(c),(n))) \
- : __memset((s),(c),(n)))
-
-#define __HAVE_ARCH_STRCPY
-extern char * strcpy(char *,const char *);
-#define __HAVE_ARCH_STRNCPY
-extern char * strncpy(char *, const char *, size_t);
-#define __HAVE_ARCH_STRCAT
-extern char * strcat(char *, const char *);
-#define __HAVE_ARCH_STRNCAT
-extern char * strncat(char *, const char *, size_t);
-#define __HAVE_ARCH_STRCHR
-extern char * strchr(const char *,int);
-#define __HAVE_ARCH_STRRCHR
-extern char * strrchr(const char *,int);
-#define __HAVE_ARCH_STRLEN
-extern size_t strlen(const char *);
-#define __HAVE_ARCH_MEMCHR
-extern void * memchr(const void *, int, size_t);
-
-/* The following routine is like memset except that it writes 16-bit
-   aligned values.  The DEST and COUNT parameters must be even for 
-   correct operation.  */
-
-#define __HAVE_ARCH_MEMSETW
-extern void * __memsetw(void *dest, unsigned short, size_t count);
-
-#define memsetw(s, c, n)                                                \
-(__builtin_constant_p(c)                                                \
- ? __constant_c_memset((s),0x0001000100010001UL*(unsigned short)(c),(n)) \
- : __memsetw((s),(c),(n)))
-
-#endif /* __KERNEL__ */
-
-#endif /* __ALPHA_STRING_H__ */
diff --git a/include/asm-alpha/suspend.h b/include/asm-alpha/suspend.h
deleted file mode 100644 (file)
index c7042d5..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef __ALPHA_SUSPEND_H
-#define __ALPHA_SUSPEND_H
-
-/* Dummy include. */
-
-#endif  /* __ALPHA_SUSPEND_H */
diff --git a/include/asm-alpha/sysinfo.h b/include/asm-alpha/sysinfo.h
deleted file mode 100644 (file)
index 086aba2..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * include/asm-alpha/sysinfo.h
- */
-
-#ifndef __ASM_ALPHA_SYSINFO_H
-#define __ASM_ALPHA_SYSINFO_H
-
-/* This defines the subset of the OSF/1 getsysinfo/setsysinfo calls
-   that we support.  */
-
-#define GSI_UACPROC                    8
-#define GSI_IEEE_FP_CONTROL            45
-#define GSI_IEEE_STATE_AT_SIGNAL       46
-#define GSI_PROC_TYPE                  60
-#define GSI_GET_HWRPB                  101
-
-#define SSI_NVPAIRS                    1
-#define SSI_IEEE_FP_CONTROL            14
-#define SSI_IEEE_STATE_AT_SIGNAL       15
-#define SSI_IEEE_IGNORE_STATE_AT_SIGNAL        16
-#define SSI_IEEE_RAISE_EXCEPTION       1001    /* linux specific */
-
-#define SSIN_UACPROC                   6
-
-#define UAC_BITMASK                    7
-#define UAC_NOPRINT                    1
-#define UAC_NOFIX                      2
-#define UAC_SIGBUS                     4
-
-
-#ifdef __KERNEL__
-
-/* This is the shift that is applied to the UAC bits as stored in the
-   per-thread flags.  See thread_info.h.  */
-#define UAC_SHIFT                      6
-
-#endif
-
-#endif /* __ASM_ALPHA_SYSINFO_H */
diff --git a/include/asm-alpha/system.h b/include/asm-alpha/system.h
deleted file mode 100644 (file)
index afe20fa..0000000
+++ /dev/null
@@ -1,829 +0,0 @@
-#ifndef __ALPHA_SYSTEM_H
-#define __ALPHA_SYSTEM_H
-
-#include <asm/pal.h>
-#include <asm/page.h>
-#include <asm/barrier.h>
-
-/*
- * System defines.. Note that this is included both from .c and .S
- * files, so it does only defines, not any C code.
- */
-
-/*
- * We leave one page for the initial stack page, and one page for
- * the initial process structure. Also, the console eats 3 MB for
- * the initial bootloader (one of which we can reclaim later).
- */
-#define BOOT_PCB       0x20000000
-#define BOOT_ADDR      0x20000000
-/* Remove when official MILO sources have ELF support: */
-#define BOOT_SIZE      (16*1024)
-
-#ifdef CONFIG_ALPHA_LEGACY_START_ADDRESS
-#define KERNEL_START_PHYS      0x300000 /* Old bootloaders hardcoded this.  */
-#else
-#define KERNEL_START_PHYS      0x1000000 /* required: Wildfire/Titan/Marvel */
-#endif
-
-#define KERNEL_START   (PAGE_OFFSET+KERNEL_START_PHYS)
-#define SWAPPER_PGD    KERNEL_START
-#define INIT_STACK     (PAGE_OFFSET+KERNEL_START_PHYS+0x02000)
-#define EMPTY_PGT      (PAGE_OFFSET+KERNEL_START_PHYS+0x04000)
-#define EMPTY_PGE      (PAGE_OFFSET+KERNEL_START_PHYS+0x08000)
-#define ZERO_PGE       (PAGE_OFFSET+KERNEL_START_PHYS+0x0A000)
-
-#define START_ADDR     (PAGE_OFFSET+KERNEL_START_PHYS+0x10000)
-
-/*
- * This is setup by the secondary bootstrap loader.  Because
- * the zero page is zeroed out as soon as the vm system is
- * initialized, we need to copy things out into a more permanent
- * place.
- */
-#define PARAM                  ZERO_PGE
-#define COMMAND_LINE           ((char*)(PARAM + 0x0000))
-#define INITRD_START           (*(unsigned long *) (PARAM+0x100))
-#define INITRD_SIZE            (*(unsigned long *) (PARAM+0x108))
-
-#ifndef __ASSEMBLY__
-#include <linux/kernel.h>
-#define AT_VECTOR_SIZE_ARCH 4 /* entries in ARCH_DLINFO */
-
-/*
- * This is the logout header that should be common to all platforms
- * (assuming they are running OSF/1 PALcode, I guess).
- */
-struct el_common {
-       unsigned int    size;           /* size in bytes of logout area */
-       unsigned int    sbz1    : 30;   /* should be zero */
-       unsigned int    err2    :  1;   /* second error */
-       unsigned int    retry   :  1;   /* retry flag */
-       unsigned int    proc_offset;    /* processor-specific offset */
-       unsigned int    sys_offset;     /* system-specific offset */
-       unsigned int    code;           /* machine check code */
-       unsigned int    frame_rev;      /* frame revision */
-};
-
-/* Machine Check Frame for uncorrectable errors (Large format)
- *      --- This is used to log uncorrectable errors such as
- *          double bit ECC errors.
- *      --- These errors are detected by both processor and systems.
- */
-struct el_common_EV5_uncorrectable_mcheck {
-        unsigned long   shadow[8];        /* Shadow reg. 8-14, 25           */
-        unsigned long   paltemp[24];      /* PAL TEMP REGS.                 */
-        unsigned long   exc_addr;         /* Address of excepting instruction*/
-        unsigned long   exc_sum;          /* Summary of arithmetic traps.   */
-        unsigned long   exc_mask;         /* Exception mask (from exc_sum). */
-        unsigned long   pal_base;         /* Base address for PALcode.      */
-        unsigned long   isr;              /* Interrupt Status Reg.          */
-        unsigned long   icsr;             /* CURRENT SETUP OF EV5 IBOX      */
-        unsigned long   ic_perr_stat;     /* I-CACHE Reg. <11> set Data parity
-                                                         <12> set TAG parity*/
-        unsigned long   dc_perr_stat;     /* D-CACHE error Reg. Bits set to 1:
-                                                     <2> Data error in bank 0
-                                                     <3> Data error in bank 1
-                                                     <4> Tag error in bank 0
-                                                     <5> Tag error in bank 1 */
-        unsigned long   va;               /* Effective VA of fault or miss. */
-        unsigned long   mm_stat;          /* Holds the reason for D-stream 
-                                             fault or D-cache parity errors */
-        unsigned long   sc_addr;          /* Address that was being accessed
-                                             when EV5 detected Secondary cache
-                                             failure.                 */
-        unsigned long   sc_stat;          /* Helps determine if the error was
-                                             TAG/Data parity(Secondary Cache)*/
-        unsigned long   bc_tag_addr;      /* Contents of EV5 BC_TAG_ADDR    */
-        unsigned long   ei_addr;          /* Physical address of any transfer
-                                             that is logged in EV5 EI_STAT */
-        unsigned long   fill_syndrome;    /* For correcting ECC errors.     */
-        unsigned long   ei_stat;          /* Helps identify reason of any 
-                                             processor uncorrectable error
-                                             at its external interface.     */
-        unsigned long   ld_lock;          /* Contents of EV5 LD_LOCK register*/
-};
-
-struct el_common_EV6_mcheck {
-       unsigned int FrameSize;         /* Bytes, including this field */
-       unsigned int FrameFlags;        /* <31> = Retry, <30> = Second Error */
-       unsigned int CpuOffset;         /* Offset to CPU-specific info */
-       unsigned int SystemOffset;      /* Offset to system-specific info */
-       unsigned int MCHK_Code;
-       unsigned int MCHK_Frame_Rev;
-       unsigned long I_STAT;           /* EV6 Internal Processor Registers */
-       unsigned long DC_STAT;          /* (See the 21264 Spec) */
-       unsigned long C_ADDR;
-       unsigned long DC1_SYNDROME;
-       unsigned long DC0_SYNDROME;
-       unsigned long C_STAT;
-       unsigned long C_STS;
-       unsigned long MM_STAT;
-       unsigned long EXC_ADDR;
-       unsigned long IER_CM;
-       unsigned long ISUM;
-       unsigned long RESERVED0;
-       unsigned long PAL_BASE;
-       unsigned long I_CTL;
-       unsigned long PCTX;
-};
-
-extern void halt(void) __attribute__((noreturn));
-#define __halt() __asm__ __volatile__ ("call_pal %0 #halt" : : "i" (PAL_halt))
-
-#define switch_to(P,N,L)                                                \
-  do {                                                                  \
-    (L) = alpha_switch_to(virt_to_phys(&task_thread_info(N)->pcb), (P)); \
-    check_mmu_context();                                                \
-  } while (0)
-
-struct task_struct;
-extern struct task_struct *alpha_switch_to(unsigned long, struct task_struct*);
-
-#define imb() \
-__asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory")
-
-#define draina() \
-__asm__ __volatile__ ("call_pal %0 #draina" : : "i" (PAL_draina) : "memory")
-
-enum implver_enum {
-       IMPLVER_EV4,
-       IMPLVER_EV5,
-       IMPLVER_EV6
-};
-
-#ifdef CONFIG_ALPHA_GENERIC
-#define implver()                              \
-({ unsigned long __implver;                    \
-   __asm__ ("implver %0" : "=r"(__implver));   \
-   (enum implver_enum) __implver; })
-#else
-/* Try to eliminate some dead code.  */
-#ifdef CONFIG_ALPHA_EV4
-#define implver() IMPLVER_EV4
-#endif
-#ifdef CONFIG_ALPHA_EV5
-#define implver() IMPLVER_EV5
-#endif
-#if defined(CONFIG_ALPHA_EV6)
-#define implver() IMPLVER_EV6
-#endif
-#endif
-
-enum amask_enum {
-       AMASK_BWX = (1UL << 0),
-       AMASK_FIX = (1UL << 1),
-       AMASK_CIX = (1UL << 2),
-       AMASK_MAX = (1UL << 8),
-       AMASK_PRECISE_TRAP = (1UL << 9),
-};
-
-#define amask(mask)                                            \
-({ unsigned long __amask, __input = (mask);                    \
-   __asm__ ("amask %1,%0" : "=r"(__amask) : "rI"(__input));    \
-   __amask; })
-
-#define __CALL_PAL_R0(NAME, TYPE)                              \
-extern inline TYPE NAME(void)                                  \
-{                                                              \
-       register TYPE __r0 __asm__("$0");                       \
-       __asm__ __volatile__(                                   \
-               "call_pal %1 # " #NAME                          \
-               :"=r" (__r0)                                    \
-               :"i" (PAL_ ## NAME)                             \
-               :"$1", "$16", "$22", "$23", "$24", "$25");      \
-       return __r0;                                            \
-}
-
-#define __CALL_PAL_W1(NAME, TYPE0)                             \
-extern inline void NAME(TYPE0 arg0)                            \
-{                                                              \
-       register TYPE0 __r16 __asm__("$16") = arg0;             \
-       __asm__ __volatile__(                                   \
-               "call_pal %1 # "#NAME                           \
-               : "=r"(__r16)                                   \
-               : "i"(PAL_ ## NAME), "0"(__r16)                 \
-               : "$1", "$22", "$23", "$24", "$25");            \
-}
-
-#define __CALL_PAL_W2(NAME, TYPE0, TYPE1)                      \
-extern inline void NAME(TYPE0 arg0, TYPE1 arg1)                        \
-{                                                              \
-       register TYPE0 __r16 __asm__("$16") = arg0;             \
-       register TYPE1 __r17 __asm__("$17") = arg1;             \
-       __asm__ __volatile__(                                   \
-               "call_pal %2 # "#NAME                           \
-               : "=r"(__r16), "=r"(__r17)                      \
-               : "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17)     \
-               : "$1", "$22", "$23", "$24", "$25");            \
-}
-
-#define __CALL_PAL_RW1(NAME, RTYPE, TYPE0)                     \
-extern inline RTYPE NAME(TYPE0 arg0)                           \
-{                                                              \
-       register RTYPE __r0 __asm__("$0");                      \
-       register TYPE0 __r16 __asm__("$16") = arg0;             \
-       __asm__ __volatile__(                                   \
-               "call_pal %2 # "#NAME                           \
-               : "=r"(__r16), "=r"(__r0)                       \
-               : "i"(PAL_ ## NAME), "0"(__r16)                 \
-               : "$1", "$22", "$23", "$24", "$25");            \
-       return __r0;                                            \
-}
-
-#define __CALL_PAL_RW2(NAME, RTYPE, TYPE0, TYPE1)              \
-extern inline RTYPE NAME(TYPE0 arg0, TYPE1 arg1)               \
-{                                                              \
-       register RTYPE __r0 __asm__("$0");                      \
-       register TYPE0 __r16 __asm__("$16") = arg0;             \
-       register TYPE1 __r17 __asm__("$17") = arg1;             \
-       __asm__ __volatile__(                                   \
-               "call_pal %3 # "#NAME                           \
-               : "=r"(__r16), "=r"(__r17), "=r"(__r0)          \
-               : "i"(PAL_ ## NAME), "0"(__r16), "1"(__r17)     \
-               : "$1", "$22", "$23", "$24", "$25");            \
-       return __r0;                                            \
-}
-
-__CALL_PAL_W1(cflush, unsigned long);
-__CALL_PAL_R0(rdmces, unsigned long);
-__CALL_PAL_R0(rdps, unsigned long);
-__CALL_PAL_R0(rdusp, unsigned long);
-__CALL_PAL_RW1(swpipl, unsigned long, unsigned long);
-__CALL_PAL_R0(whami, unsigned long);
-__CALL_PAL_W2(wrent, void*, unsigned long);
-__CALL_PAL_W1(wripir, unsigned long);
-__CALL_PAL_W1(wrkgp, unsigned long);
-__CALL_PAL_W1(wrmces, unsigned long);
-__CALL_PAL_RW2(wrperfmon, unsigned long, unsigned long, unsigned long);
-__CALL_PAL_W1(wrusp, unsigned long);
-__CALL_PAL_W1(wrvptptr, unsigned long);
-
-#define IPL_MIN                0
-#define IPL_SW0                1
-#define IPL_SW1                2
-#define IPL_DEV0       3
-#define IPL_DEV1       4
-#define IPL_TIMER      5
-#define IPL_PERF       6
-#define IPL_POWERFAIL  6
-#define IPL_MCHECK     7
-#define IPL_MAX                7
-
-#ifdef CONFIG_ALPHA_BROKEN_IRQ_MASK
-#undef IPL_MIN
-#define IPL_MIN                __min_ipl
-extern int __min_ipl;
-#endif
-
-#define getipl()               (rdps() & 7)
-#define setipl(ipl)            ((void) swpipl(ipl))
-
-#define local_irq_disable()                    do { setipl(IPL_MAX); barrier(); } while(0)
-#define local_irq_enable()                     do { barrier(); setipl(IPL_MIN); } while(0)
-#define local_save_flags(flags)        ((flags) = rdps())
-#define local_irq_save(flags)  do { (flags) = swpipl(IPL_MAX); barrier(); } while(0)
-#define local_irq_restore(flags)       do { barrier(); setipl(flags); barrier(); } while(0)
-
-#define irqs_disabled()        (getipl() == IPL_MAX)
-
-/*
- * TB routines..
- */
-#define __tbi(nr,arg,arg1...)                                  \
-({                                                             \
-       register unsigned long __r16 __asm__("$16") = (nr);     \
-       register unsigned long __r17 __asm__("$17"); arg;       \
-       __asm__ __volatile__(                                   \
-               "call_pal %3 #__tbi"                            \
-               :"=r" (__r16),"=r" (__r17)                      \
-               :"0" (__r16),"i" (PAL_tbi) ,##arg1              \
-               :"$0", "$1", "$22", "$23", "$24", "$25");       \
-})
-
-#define tbi(x,y)       __tbi(x,__r17=(y),"1" (__r17))
-#define tbisi(x)       __tbi(1,__r17=(x),"1" (__r17))
-#define tbisd(x)       __tbi(2,__r17=(x),"1" (__r17))
-#define tbis(x)                __tbi(3,__r17=(x),"1" (__r17))
-#define tbiap()                __tbi(-1, /* no second argument */)
-#define tbia()         __tbi(-2, /* no second argument */)
-
-/*
- * Atomic exchange.
- * Since it can be used to implement critical sections
- * it must clobber "memory" (also for interrupts in UP).
- */
-
-static inline unsigned long
-__xchg_u8(volatile char *m, unsigned long val)
-{
-       unsigned long ret, tmp, addr64;
-
-       __asm__ __volatile__(
-       "       andnot  %4,7,%3\n"
-       "       insbl   %1,%4,%1\n"
-       "1:     ldq_l   %2,0(%3)\n"
-       "       extbl   %2,%4,%0\n"
-       "       mskbl   %2,%4,%2\n"
-       "       or      %1,%2,%2\n"
-       "       stq_c   %2,0(%3)\n"
-       "       beq     %2,2f\n"
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       ".subsection 2\n"
-       "2:     br      1b\n"
-       ".previous"
-       : "=&r" (ret), "=&r" (val), "=&r" (tmp), "=&r" (addr64)
-       : "r" ((long)m), "1" (val) : "memory");
-
-       return ret;
-}
-
-static inline unsigned long
-__xchg_u16(volatile short *m, unsigned long val)
-{
-       unsigned long ret, tmp, addr64;
-
-       __asm__ __volatile__(
-       "       andnot  %4,7,%3\n"
-       "       inswl   %1,%4,%1\n"
-       "1:     ldq_l   %2,0(%3)\n"
-       "       extwl   %2,%4,%0\n"
-       "       mskwl   %2,%4,%2\n"
-       "       or      %1,%2,%2\n"
-       "       stq_c   %2,0(%3)\n"
-       "       beq     %2,2f\n"
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       ".subsection 2\n"
-       "2:     br      1b\n"
-       ".previous"
-       : "=&r" (ret), "=&r" (val), "=&r" (tmp), "=&r" (addr64)
-       : "r" ((long)m), "1" (val) : "memory");
-
-       return ret;
-}
-
-static inline unsigned long
-__xchg_u32(volatile int *m, unsigned long val)
-{
-       unsigned long dummy;
-
-       __asm__ __volatile__(
-       "1:     ldl_l %0,%4\n"
-       "       bis $31,%3,%1\n"
-       "       stl_c %1,%2\n"
-       "       beq %1,2f\n"
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       : "=&r" (val), "=&r" (dummy), "=m" (*m)
-       : "rI" (val), "m" (*m) : "memory");
-
-       return val;
-}
-
-static inline unsigned long
-__xchg_u64(volatile long *m, unsigned long val)
-{
-       unsigned long dummy;
-
-       __asm__ __volatile__(
-       "1:     ldq_l %0,%4\n"
-       "       bis $31,%3,%1\n"
-       "       stq_c %1,%2\n"
-       "       beq %1,2f\n"
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       : "=&r" (val), "=&r" (dummy), "=m" (*m)
-       : "rI" (val), "m" (*m) : "memory");
-
-       return val;
-}
-
-/* This function doesn't exist, so you'll get a linker error
-   if something tries to do an invalid xchg().  */
-extern void __xchg_called_with_bad_pointer(void);
-
-#define __xchg(ptr, x, size) \
-({ \
-       unsigned long __xchg__res; \
-       volatile void *__xchg__ptr = (ptr); \
-       switch (size) { \
-               case 1: __xchg__res = __xchg_u8(__xchg__ptr, x); break; \
-               case 2: __xchg__res = __xchg_u16(__xchg__ptr, x); break; \
-               case 4: __xchg__res = __xchg_u32(__xchg__ptr, x); break; \
-               case 8: __xchg__res = __xchg_u64(__xchg__ptr, x); break; \
-               default: __xchg_called_with_bad_pointer(); __xchg__res = x; \
-       } \
-       __xchg__res; \
-})
-
-#define xchg(ptr,x)                                                         \
-  ({                                                                        \
-     __typeof__(*(ptr)) _x_ = (x);                                          \
-     (__typeof__(*(ptr))) __xchg((ptr), (unsigned long)_x_, sizeof(*(ptr))); \
-  })
-
-static inline unsigned long
-__xchg_u8_local(volatile char *m, unsigned long val)
-{
-       unsigned long ret, tmp, addr64;
-
-       __asm__ __volatile__(
-       "       andnot  %4,7,%3\n"
-       "       insbl   %1,%4,%1\n"
-       "1:     ldq_l   %2,0(%3)\n"
-       "       extbl   %2,%4,%0\n"
-       "       mskbl   %2,%4,%2\n"
-       "       or      %1,%2,%2\n"
-       "       stq_c   %2,0(%3)\n"
-       "       beq     %2,2f\n"
-       ".subsection 2\n"
-       "2:     br      1b\n"
-       ".previous"
-       : "=&r" (ret), "=&r" (val), "=&r" (tmp), "=&r" (addr64)
-       : "r" ((long)m), "1" (val) : "memory");
-
-       return ret;
-}
-
-static inline unsigned long
-__xchg_u16_local(volatile short *m, unsigned long val)
-{
-       unsigned long ret, tmp, addr64;
-
-       __asm__ __volatile__(
-       "       andnot  %4,7,%3\n"
-       "       inswl   %1,%4,%1\n"
-       "1:     ldq_l   %2,0(%3)\n"
-       "       extwl   %2,%4,%0\n"
-       "       mskwl   %2,%4,%2\n"
-       "       or      %1,%2,%2\n"
-       "       stq_c   %2,0(%3)\n"
-       "       beq     %2,2f\n"
-       ".subsection 2\n"
-       "2:     br      1b\n"
-       ".previous"
-       : "=&r" (ret), "=&r" (val), "=&r" (tmp), "=&r" (addr64)
-       : "r" ((long)m), "1" (val) : "memory");
-
-       return ret;
-}
-
-static inline unsigned long
-__xchg_u32_local(volatile int *m, unsigned long val)
-{
-       unsigned long dummy;
-
-       __asm__ __volatile__(
-       "1:     ldl_l %0,%4\n"
-       "       bis $31,%3,%1\n"
-       "       stl_c %1,%2\n"
-       "       beq %1,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       : "=&r" (val), "=&r" (dummy), "=m" (*m)
-       : "rI" (val), "m" (*m) : "memory");
-
-       return val;
-}
-
-static inline unsigned long
-__xchg_u64_local(volatile long *m, unsigned long val)
-{
-       unsigned long dummy;
-
-       __asm__ __volatile__(
-       "1:     ldq_l %0,%4\n"
-       "       bis $31,%3,%1\n"
-       "       stq_c %1,%2\n"
-       "       beq %1,2f\n"
-       ".subsection 2\n"
-       "2:     br 1b\n"
-       ".previous"
-       : "=&r" (val), "=&r" (dummy), "=m" (*m)
-       : "rI" (val), "m" (*m) : "memory");
-
-       return val;
-}
-
-#define __xchg_local(ptr, x, size) \
-({ \
-       unsigned long __xchg__res; \
-       volatile void *__xchg__ptr = (ptr); \
-       switch (size) { \
-               case 1: __xchg__res = __xchg_u8_local(__xchg__ptr, x); break; \
-               case 2: __xchg__res = __xchg_u16_local(__xchg__ptr, x); break; \
-               case 4: __xchg__res = __xchg_u32_local(__xchg__ptr, x); break; \
-               case 8: __xchg__res = __xchg_u64_local(__xchg__ptr, x); break; \
-               default: __xchg_called_with_bad_pointer(); __xchg__res = x; \
-       } \
-       __xchg__res; \
-})
-
-#define xchg_local(ptr,x)                                                   \
-  ({                                                                        \
-     __typeof__(*(ptr)) _x_ = (x);                                          \
-     (__typeof__(*(ptr))) __xchg_local((ptr), (unsigned long)_x_,           \
-               sizeof(*(ptr))); \
-  })
-
-/* 
- * Atomic compare and exchange.  Compare OLD with MEM, if identical,
- * store NEW in MEM.  Return the initial value in MEM.  Success is
- * indicated by comparing RETURN with OLD.
- *
- * The memory barrier should be placed in SMP only when we actually
- * make the change. If we don't change anything (so if the returned
- * prev is equal to old) then we aren't acquiring anything new and
- * we don't need any memory barrier as far I can tell.
- */
-
-#define __HAVE_ARCH_CMPXCHG 1
-
-static inline unsigned long
-__cmpxchg_u8(volatile char *m, long old, long new)
-{
-       unsigned long prev, tmp, cmp, addr64;
-
-       __asm__ __volatile__(
-       "       andnot  %5,7,%4\n"
-       "       insbl   %1,%5,%1\n"
-       "1:     ldq_l   %2,0(%4)\n"
-       "       extbl   %2,%5,%0\n"
-       "       cmpeq   %0,%6,%3\n"
-       "       beq     %3,2f\n"
-       "       mskbl   %2,%5,%2\n"
-       "       or      %1,%2,%2\n"
-       "       stq_c   %2,0(%4)\n"
-       "       beq     %2,3f\n"
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       "2:\n"
-       ".subsection 2\n"
-       "3:     br      1b\n"
-       ".previous"
-       : "=&r" (prev), "=&r" (new), "=&r" (tmp), "=&r" (cmp), "=&r" (addr64)
-       : "r" ((long)m), "Ir" (old), "1" (new) : "memory");
-
-       return prev;
-}
-
-static inline unsigned long
-__cmpxchg_u16(volatile short *m, long old, long new)
-{
-       unsigned long prev, tmp, cmp, addr64;
-
-       __asm__ __volatile__(
-       "       andnot  %5,7,%4\n"
-       "       inswl   %1,%5,%1\n"
-       "1:     ldq_l   %2,0(%4)\n"
-       "       extwl   %2,%5,%0\n"
-       "       cmpeq   %0,%6,%3\n"
-       "       beq     %3,2f\n"
-       "       mskwl   %2,%5,%2\n"
-       "       or      %1,%2,%2\n"
-       "       stq_c   %2,0(%4)\n"
-       "       beq     %2,3f\n"
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       "2:\n"
-       ".subsection 2\n"
-       "3:     br      1b\n"
-       ".previous"
-       : "=&r" (prev), "=&r" (new), "=&r" (tmp), "=&r" (cmp), "=&r" (addr64)
-       : "r" ((long)m), "Ir" (old), "1" (new) : "memory");
-
-       return prev;
-}
-
-static inline unsigned long
-__cmpxchg_u32(volatile int *m, int old, int new)
-{
-       unsigned long prev, cmp;
-
-       __asm__ __volatile__(
-       "1:     ldl_l %0,%5\n"
-       "       cmpeq %0,%3,%1\n"
-       "       beq %1,2f\n"
-       "       mov %4,%1\n"
-       "       stl_c %1,%2\n"
-       "       beq %1,3f\n"
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       "2:\n"
-       ".subsection 2\n"
-       "3:     br 1b\n"
-       ".previous"
-       : "=&r"(prev), "=&r"(cmp), "=m"(*m)
-       : "r"((long) old), "r"(new), "m"(*m) : "memory");
-
-       return prev;
-}
-
-static inline unsigned long
-__cmpxchg_u64(volatile long *m, unsigned long old, unsigned long new)
-{
-       unsigned long prev, cmp;
-
-       __asm__ __volatile__(
-       "1:     ldq_l %0,%5\n"
-       "       cmpeq %0,%3,%1\n"
-       "       beq %1,2f\n"
-       "       mov %4,%1\n"
-       "       stq_c %1,%2\n"
-       "       beq %1,3f\n"
-#ifdef CONFIG_SMP
-       "       mb\n"
-#endif
-       "2:\n"
-       ".subsection 2\n"
-       "3:     br 1b\n"
-       ".previous"
-       : "=&r"(prev), "=&r"(cmp), "=m"(*m)
-       : "r"((long) old), "r"(new), "m"(*m) : "memory");
-
-       return prev;
-}
-
-/* This function doesn't exist, so you'll get a linker error
-   if something tries to do an invalid cmpxchg().  */
-extern void __cmpxchg_called_with_bad_pointer(void);
-
-static __always_inline unsigned long
-__cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)
-{
-       switch (size) {
-               case 1:
-                       return __cmpxchg_u8(ptr, old, new);
-               case 2:
-                       return __cmpxchg_u16(ptr, old, new);
-               case 4:
-                       return __cmpxchg_u32(ptr, old, new);
-               case 8:
-                       return __cmpxchg_u64(ptr, old, new);
-       }
-       __cmpxchg_called_with_bad_pointer();
-       return old;
-}
-
-#define cmpxchg(ptr, o, n)                                              \
-  ({                                                                    \
-     __typeof__(*(ptr)) _o_ = (o);                                      \
-     __typeof__(*(ptr)) _n_ = (n);                                      \
-     (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,          \
-                                   (unsigned long)_n_, sizeof(*(ptr))); \
-  })
-#define cmpxchg64(ptr, o, n)                                            \
-  ({                                                                    \
-       BUILD_BUG_ON(sizeof(*(ptr)) != 8);                               \
-       cmpxchg((ptr), (o), (n));                                        \
-  })
-
-static inline unsigned long
-__cmpxchg_u8_local(volatile char *m, long old, long new)
-{
-       unsigned long prev, tmp, cmp, addr64;
-
-       __asm__ __volatile__(
-       "       andnot  %5,7,%4\n"
-       "       insbl   %1,%5,%1\n"
-       "1:     ldq_l   %2,0(%4)\n"
-       "       extbl   %2,%5,%0\n"
-       "       cmpeq   %0,%6,%3\n"
-       "       beq     %3,2f\n"
-       "       mskbl   %2,%5,%2\n"
-       "       or      %1,%2,%2\n"
-       "       stq_c   %2,0(%4)\n"
-       "       beq     %2,3f\n"
-       "2:\n"
-       ".subsection 2\n"
-       "3:     br      1b\n"
-       ".previous"
-       : "=&r" (prev), "=&r" (new), "=&r" (tmp), "=&r" (cmp), "=&r" (addr64)
-       : "r" ((long)m), "Ir" (old), "1" (new) : "memory");
-
-       return prev;
-}
-
-static inline unsigned long
-__cmpxchg_u16_local(volatile short *m, long old, long new)
-{
-       unsigned long prev, tmp, cmp, addr64;
-
-       __asm__ __volatile__(
-       "       andnot  %5,7,%4\n"
-       "       inswl   %1,%5,%1\n"
-       "1:     ldq_l   %2,0(%4)\n"
-       "       extwl   %2,%5,%0\n"
-       "       cmpeq   %0,%6,%3\n"
-       "       beq     %3,2f\n"
-       "       mskwl   %2,%5,%2\n"
-       "       or      %1,%2,%2\n"
-       "       stq_c   %2,0(%4)\n"
-       "       beq     %2,3f\n"
-       "2:\n"
-       ".subsection 2\n"
-       "3:     br      1b\n"
-       ".previous"
-       : "=&r" (prev), "=&r" (new), "=&r" (tmp), "=&r" (cmp), "=&r" (addr64)
-       : "r" ((long)m), "Ir" (old), "1" (new) : "memory");
-
-       return prev;
-}
-
-static inline unsigned long
-__cmpxchg_u32_local(volatile int *m, int old, int new)
-{
-       unsigned long prev, cmp;
-
-       __asm__ __volatile__(
-       "1:     ldl_l %0,%5\n"
-       "       cmpeq %0,%3,%1\n"
-       "       beq %1,2f\n"
-       "       mov %4,%1\n"
-       "       stl_c %1,%2\n"
-       "       beq %1,3f\n"
-       "2:\n"
-       ".subsection 2\n"
-       "3:     br 1b\n"
-       ".previous"
-       : "=&r"(prev), "=&r"(cmp), "=m"(*m)
-       : "r"((long) old), "r"(new), "m"(*m) : "memory");
-
-       return prev;
-}
-
-static inline unsigned long
-__cmpxchg_u64_local(volatile long *m, unsigned long old, unsigned long new)
-{
-       unsigned long prev, cmp;
-
-       __asm__ __volatile__(
-       "1:     ldq_l %0,%5\n"
-       "       cmpeq %0,%3,%1\n"
-       "       beq %1,2f\n"
-       "       mov %4,%1\n"
-       "       stq_c %1,%2\n"
-       "       beq %1,3f\n"
-       "2:\n"
-       ".subsection 2\n"
-       "3:     br 1b\n"
-       ".previous"
-       : "=&r"(prev), "=&r"(cmp), "=m"(*m)
-       : "r"((long) old), "r"(new), "m"(*m) : "memory");
-
-       return prev;
-}
-
-static __always_inline unsigned long
-__cmpxchg_local(volatile void *ptr, unsigned long old, unsigned long new,
-               int size)
-{
-       switch (size) {
-               case 1:
-                       return __cmpxchg_u8_local(ptr, old, new);
-               case 2:
-                       return __cmpxchg_u16_local(ptr, old, new);
-               case 4:
-                       return __cmpxchg_u32_local(ptr, old, new);
-               case 8:
-                       return __cmpxchg_u64_local(ptr, old, new);
-       }
-       __cmpxchg_called_with_bad_pointer();
-       return old;
-}
-
-#define cmpxchg_local(ptr, o, n)                                        \
-  ({                                                                    \
-     __typeof__(*(ptr)) _o_ = (o);                                      \
-     __typeof__(*(ptr)) _n_ = (n);                                      \
-     (__typeof__(*(ptr))) __cmpxchg_local((ptr), (unsigned long)_o_,    \
-                                   (unsigned long)_n_, sizeof(*(ptr))); \
-  })
-#define cmpxchg64_local(ptr, o, n)                                      \
-  ({                                                                    \
-       BUILD_BUG_ON(sizeof(*(ptr)) != 8);                               \
-       cmpxchg_local((ptr), (o), (n));                                  \
-  })
-
-
-#endif /* __ASSEMBLY__ */
-
-#define arch_align_stack(x) (x)
-
-#endif
diff --git a/include/asm-alpha/termbits.h b/include/asm-alpha/termbits.h
deleted file mode 100644 (file)
index ad854a4..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-#ifndef _ALPHA_TERMBITS_H
-#define _ALPHA_TERMBITS_H
-
-#include <linux/posix_types.h>
-
-typedef unsigned char  cc_t;
-typedef unsigned int   speed_t;
-typedef unsigned int   tcflag_t;
-
-/*
- * termios type and macro definitions.  Be careful about adding stuff
- * to this file since it's used in GNU libc and there are strict rules
- * concerning namespace pollution.
- */
-
-#define NCCS 19
-struct termios {
-       tcflag_t c_iflag;               /* input mode flags */
-       tcflag_t c_oflag;               /* output mode flags */
-       tcflag_t c_cflag;               /* control mode flags */
-       tcflag_t c_lflag;               /* local mode flags */
-       cc_t c_cc[NCCS];                /* control characters */
-       cc_t c_line;                    /* line discipline (== c_cc[19]) */
-       speed_t c_ispeed;               /* input speed */
-       speed_t c_ospeed;               /* output speed */
-};
-
-/* Alpha has matching termios and ktermios */
-
-struct ktermios {
-       tcflag_t c_iflag;               /* input mode flags */
-       tcflag_t c_oflag;               /* output mode flags */
-       tcflag_t c_cflag;               /* control mode flags */
-       tcflag_t c_lflag;               /* local mode flags */
-       cc_t c_cc[NCCS];                /* control characters */
-       cc_t c_line;                    /* line discipline (== c_cc[19]) */
-       speed_t c_ispeed;               /* input speed */
-       speed_t c_ospeed;               /* output speed */
-};
-
-/* c_cc characters */
-#define VEOF 0
-#define VEOL 1
-#define VEOL2 2
-#define VERASE 3
-#define VWERASE 4
-#define VKILL 5
-#define VREPRINT 6
-#define VSWTC 7
-#define VINTR 8
-#define VQUIT 9
-#define VSUSP 10
-#define VSTART 12
-#define VSTOP 13
-#define VLNEXT 14
-#define VDISCARD 15
-#define VMIN 16
-#define VTIME 17
-
-/* c_iflag bits */
-#define IGNBRK 0000001
-#define BRKINT 0000002
-#define IGNPAR 0000004
-#define PARMRK 0000010
-#define INPCK  0000020
-#define ISTRIP 0000040
-#define INLCR  0000100
-#define IGNCR  0000200
-#define ICRNL  0000400
-#define IXON   0001000
-#define IXOFF  0002000
-#define IXANY  0004000
-#define IUCLC  0010000
-#define IMAXBEL        0020000
-#define IUTF8  0040000
-
-/* c_oflag bits */
-#define OPOST  0000001
-#define ONLCR  0000002
-#define OLCUC  0000004
-
-#define OCRNL  0000010
-#define ONOCR  0000020
-#define ONLRET 0000040
-
-#define OFILL  00000100
-#define OFDEL  00000200
-#define NLDLY  00001400
-#define   NL0  00000000
-#define   NL1  00000400
-#define   NL2  00001000
-#define   NL3  00001400
-#define TABDLY 00006000
-#define   TAB0 00000000
-#define   TAB1 00002000
-#define   TAB2 00004000
-#define   TAB3 00006000
-#define CRDLY  00030000
-#define   CR0  00000000
-#define   CR1  00010000
-#define   CR2  00020000
-#define   CR3  00030000
-#define FFDLY  00040000
-#define   FF0  00000000
-#define   FF1  00040000
-#define BSDLY  00100000
-#define   BS0  00000000
-#define   BS1  00100000
-#define VTDLY  00200000
-#define   VT0  00000000
-#define   VT1  00200000
-#define XTABS  01000000 /* Hmm.. Linux/i386 considers this part of TABDLY.. */
-
-/* c_cflag bit meaning */
-#define CBAUD  0000037
-#define  B0    0000000         /* hang up */
-#define  B50   0000001
-#define  B75   0000002
-#define  B110  0000003
-#define  B134  0000004
-#define  B150  0000005
-#define  B200  0000006
-#define  B300  0000007
-#define  B600  0000010
-#define  B1200 0000011
-#define  B1800 0000012
-#define  B2400 0000013
-#define  B4800 0000014
-#define  B9600 0000015
-#define  B19200        0000016
-#define  B38400        0000017
-#define EXTA B19200
-#define EXTB B38400
-#define CBAUDEX 0000000
-#define  B57600   00020
-#define  B115200  00021
-#define  B230400  00022
-#define  B460800  00023
-#define  B500000  00024
-#define  B576000  00025
-#define  B921600  00026
-#define B1000000  00027
-#define B1152000  00030
-#define B1500000  00031
-#define B2000000  00032
-#define B2500000  00033
-#define B3000000  00034
-#define B3500000  00035
-#define B4000000  00036
-
-#define CSIZE  00001400
-#define   CS5  00000000
-#define   CS6  00000400
-#define   CS7  00001000
-#define   CS8  00001400
-
-#define CSTOPB 00002000
-#define CREAD  00004000
-#define PARENB 00010000
-#define PARODD 00020000
-#define HUPCL  00040000
-
-#define CLOCAL 00100000
-#define CMSPAR   010000000000          /* mark or space (stick) parity */
-#define CRTSCTS          020000000000          /* flow control */
-
-/* c_lflag bits */
-#define ISIG   0x00000080
-#define ICANON 0x00000100
-#define XCASE  0x00004000
-#define ECHO   0x00000008
-#define ECHOE  0x00000002
-#define ECHOK  0x00000004
-#define ECHONL 0x00000010
-#define NOFLSH 0x80000000
-#define TOSTOP 0x00400000
-#define ECHOCTL        0x00000040
-#define ECHOPRT        0x00000020
-#define ECHOKE 0x00000001
-#define FLUSHO 0x00800000
-#define PENDIN 0x20000000
-#define IEXTEN 0x00000400
-
-/* Values for the ACTION argument to `tcflow'.  */
-#define        TCOOFF          0
-#define        TCOON           1
-#define        TCIOFF          2
-#define        TCION           3
-
-/* Values for the QUEUE_SELECTOR argument to `tcflush'.  */
-#define        TCIFLUSH        0
-#define        TCOFLUSH        1
-#define        TCIOFLUSH       2
-
-/* Values for the OPTIONAL_ACTIONS argument to `tcsetattr'.  */
-#define        TCSANOW         0
-#define        TCSADRAIN       1
-#define        TCSAFLUSH       2
-
-#endif /* _ALPHA_TERMBITS_H */
diff --git a/include/asm-alpha/termios.h b/include/asm-alpha/termios.h
deleted file mode 100644 (file)
index fa13716..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-#ifndef _ALPHA_TERMIOS_H
-#define _ALPHA_TERMIOS_H
-
-#include <asm/ioctls.h>
-#include <asm/termbits.h>
-
-struct sgttyb {
-       char    sg_ispeed;
-       char    sg_ospeed;
-       char    sg_erase;
-       char    sg_kill;
-       short   sg_flags;
-};
-
-struct tchars {
-       char    t_intrc;
-       char    t_quitc;
-       char    t_startc;
-       char    t_stopc;
-       char    t_eofc;
-       char    t_brkc;
-};
-
-struct ltchars {
-       char    t_suspc;
-       char    t_dsuspc;
-       char    t_rprntc;
-       char    t_flushc;
-       char    t_werasc;
-       char    t_lnextc;
-};
-
-struct winsize {
-       unsigned short ws_row;
-       unsigned short ws_col;
-       unsigned short ws_xpixel;
-       unsigned short ws_ypixel;
-};
-
-#define NCC 8
-struct termio {
-       unsigned short c_iflag;         /* input mode flags */
-       unsigned short c_oflag;         /* output mode flags */
-       unsigned short c_cflag;         /* control mode flags */
-       unsigned short c_lflag;         /* local mode flags */
-       unsigned char c_line;           /* line discipline */
-       unsigned char c_cc[NCC];        /* control characters */
-};
-
-/*
- * c_cc characters in the termio structure.  Oh, how I love being
- * backwardly compatible.  Notice that character 4 and 5 are
- * interpreted differently depending on whether ICANON is set in
- * c_lflag.  If it's set, they are used as _VEOF and _VEOL, otherwise
- * as _VMIN and V_TIME.  This is for compatibility with OSF/1 (which
- * is compatible with sysV)...
- */
-#define _VINTR 0
-#define _VQUIT 1
-#define _VERASE        2
-#define _VKILL 3
-#define _VEOF  4
-#define _VMIN  4
-#define _VEOL  5
-#define _VTIME 5
-#define _VEOL2 6
-#define _VSWTC 7
-
-#ifdef __KERNEL__
-/*     eof=^D          eol=\0          eol2=\0         erase=del
-       werase=^W       kill=^U         reprint=^R      sxtc=\0
-       intr=^C         quit=^\         susp=^Z         <OSF/1 VDSUSP>
-       start=^Q        stop=^S         lnext=^V        discard=^U
-       vmin=\1         vtime=\0
-*/
-#define INIT_C_CC "\004\000\000\177\027\025\022\000\003\034\032\000\021\023\026\025\001\000"
-
-/*
- * Translate a "termio" structure into a "termios". Ugh.
- */
-
-#define user_termio_to_kernel_termios(a_termios, u_termio)                     \
-({                                                                             \
-       struct ktermios *k_termios = (a_termios);                               \
-       struct termio k_termio;                                                 \
-       int canon, ret;                                                         \
-                                                                               \
-       ret = copy_from_user(&k_termio, u_termio, sizeof(k_termio));            \
-       if (!ret) {                                                             \
-               /* Overwrite only the low bits.  */                             \
-               *(unsigned short *)&k_termios->c_iflag = k_termio.c_iflag;      \
-               *(unsigned short *)&k_termios->c_oflag = k_termio.c_oflag;      \
-               *(unsigned short *)&k_termios->c_cflag = k_termio.c_cflag;      \
-               *(unsigned short *)&k_termios->c_lflag = k_termio.c_lflag;      \
-               canon = k_termio.c_lflag & ICANON;                              \
-                                                                               \
-               k_termios->c_cc[VINTR]  = k_termio.c_cc[_VINTR];                \
-               k_termios->c_cc[VQUIT]  = k_termio.c_cc[_VQUIT];                \
-               k_termios->c_cc[VERASE] = k_termio.c_cc[_VERASE];               \
-               k_termios->c_cc[VKILL]  = k_termio.c_cc[_VKILL];                \
-               k_termios->c_cc[VEOL2]  = k_termio.c_cc[_VEOL2];                \
-               k_termios->c_cc[VSWTC]  = k_termio.c_cc[_VSWTC];                \
-               k_termios->c_cc[canon ? VEOF : VMIN]  = k_termio.c_cc[_VEOF];   \
-               k_termios->c_cc[canon ? VEOL : VTIME] = k_termio.c_cc[_VEOL];   \
-       }                                                                       \
-       ret;                                                                    \
-})
-
-/*
- * Translate a "termios" structure into a "termio". Ugh.
- *
- * Note the "fun" _VMIN overloading.
- */
-#define kernel_termios_to_user_termio(u_termio, a_termios)             \
-({                                                                     \
-       struct ktermios *k_termios = (a_termios);                       \
-       struct termio k_termio;                                         \
-       int canon;                                                      \
-                                                                       \
-       k_termio.c_iflag = k_termios->c_iflag;                          \
-       k_termio.c_oflag = k_termios->c_oflag;                          \
-       k_termio.c_cflag = k_termios->c_cflag;                          \
-       canon = (k_termio.c_lflag = k_termios->c_lflag) & ICANON;       \
-                                                                       \
-       k_termio.c_line = k_termios->c_line;                            \
-       k_termio.c_cc[_VINTR]  = k_termios->c_cc[VINTR];                \
-       k_termio.c_cc[_VQUIT]  = k_termios->c_cc[VQUIT];                \
-       k_termio.c_cc[_VERASE] = k_termios->c_cc[VERASE];               \
-       k_termio.c_cc[_VKILL]  = k_termios->c_cc[VKILL];                \
-       k_termio.c_cc[_VEOF]   = k_termios->c_cc[canon ? VEOF : VMIN];  \
-       k_termio.c_cc[_VEOL]   = k_termios->c_cc[canon ? VEOL : VTIME]; \
-       k_termio.c_cc[_VEOL2]  = k_termios->c_cc[VEOL2];                \
-       k_termio.c_cc[_VSWTC]  = k_termios->c_cc[VSWTC];                \
-                                                                       \
-       copy_to_user(u_termio, &k_termio, sizeof(k_termio));            \
-})
-
-#define user_termios_to_kernel_termios(k, u) \
-       copy_from_user(k, u, sizeof(struct termios))
-
-#define kernel_termios_to_user_termios(u, k) \
-       copy_to_user(u, k, sizeof(struct termios))
-
-#endif /* __KERNEL__ */
-
-#endif /* _ALPHA_TERMIOS_H */
diff --git a/include/asm-alpha/thread_info.h b/include/asm-alpha/thread_info.h
deleted file mode 100644 (file)
index 15fda43..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-#ifndef _ALPHA_THREAD_INFO_H
-#define _ALPHA_THREAD_INFO_H
-
-#ifdef __KERNEL__
-
-#ifndef __ASSEMBLY__
-#include <asm/processor.h>
-#include <asm/types.h>
-#include <asm/hwrpb.h>
-#endif
-
-#ifndef __ASSEMBLY__
-struct thread_info {
-       struct pcb_struct       pcb;            /* palcode state */
-
-       struct task_struct      *task;          /* main task structure */
-       unsigned int            flags;          /* low level flags */
-       unsigned int            ieee_state;     /* see fpu.h */
-
-       struct exec_domain      *exec_domain;   /* execution domain */
-       mm_segment_t            addr_limit;     /* thread address space */
-       unsigned                cpu;            /* current CPU */
-       int                     preempt_count; /* 0 => preemptable, <0 => BUG */
-
-       int bpt_nsaved;
-       unsigned long bpt_addr[2];              /* breakpoint handling  */
-       unsigned int bpt_insn[2];
-
-       struct restart_block    restart_block;
-};
-
-/*
- * Macros/functions for gaining access to the thread information structure.
- */
-#define INIT_THREAD_INFO(tsk)                  \
-{                                              \
-       .task           = &tsk,                 \
-       .exec_domain    = &default_exec_domain, \
-       .addr_limit     = KERNEL_DS,            \
-       .restart_block = {                      \
-               .fn = do_no_restart_syscall,    \
-       },                                      \
-}
-
-#define init_thread_info       (init_thread_union.thread_info)
-#define init_stack             (init_thread_union.stack)
-
-/* How to get the thread information struct from C.  */
-register struct thread_info *__current_thread_info __asm__("$8");
-#define current_thread_info()  __current_thread_info
-
-/* Thread information allocation.  */
-#define THREAD_SIZE_ORDER 1
-#define THREAD_SIZE (2*PAGE_SIZE)
-
-#endif /* __ASSEMBLY__ */
-
-#define PREEMPT_ACTIVE         0x40000000
-
-/*
- * Thread information flags:
- * - these are process state flags and used from assembly
- * - pending work-to-be-done flags come first to fit in and immediate operand.
- *
- * TIF_SYSCALL_TRACE is known to be 0 via blbs.
- */
-#define TIF_SYSCALL_TRACE      0       /* syscall trace active */
-#define TIF_SIGPENDING         1       /* signal pending */
-#define TIF_NEED_RESCHED       2       /* rescheduling necessary */
-#define TIF_POLLING_NRFLAG     3       /* poll_idle is polling NEED_RESCHED */
-#define TIF_DIE_IF_KERNEL      4       /* dik recursion lock */
-#define TIF_UAC_NOPRINT                5       /* see sysinfo.h */
-#define TIF_UAC_NOFIX          6
-#define TIF_UAC_SIGBUS         7
-#define TIF_MEMDIE             8
-#define TIF_RESTORE_SIGMASK    9       /* restore signal mask in do_signal */
-
-#define _TIF_SYSCALL_TRACE     (1<<TIF_SYSCALL_TRACE)
-#define _TIF_SIGPENDING                (1<<TIF_SIGPENDING)
-#define _TIF_NEED_RESCHED      (1<<TIF_NEED_RESCHED)
-#define _TIF_POLLING_NRFLAG    (1<<TIF_POLLING_NRFLAG)
-#define _TIF_RESTORE_SIGMASK   (1<<TIF_RESTORE_SIGMASK)
-
-/* Work to do on interrupt/exception return.  */
-#define _TIF_WORK_MASK         (_TIF_SIGPENDING | _TIF_NEED_RESCHED)
-
-/* Work to do on any return to userspace.  */
-#define _TIF_ALLWORK_MASK      (_TIF_WORK_MASK         \
-                                | _TIF_SYSCALL_TRACE)
-
-#define ALPHA_UAC_SHIFT                6
-#define ALPHA_UAC_MASK         (1 << TIF_UAC_NOPRINT | 1 << TIF_UAC_NOFIX | \
-                                1 << TIF_UAC_SIGBUS)
-
-#define SET_UNALIGN_CTL(task,value)    ({                                   \
-       task_thread_info(task)->flags = ((task_thread_info(task)->flags &    \
-               ~ALPHA_UAC_MASK)                                             \
-               | (((value) << ALPHA_UAC_SHIFT)       & (1<<TIF_UAC_NOPRINT))\
-               | (((value) << (ALPHA_UAC_SHIFT + 1)) & (1<<TIF_UAC_SIGBUS)) \
-               | (((value) << (ALPHA_UAC_SHIFT - 1)) & (1<<TIF_UAC_NOFIX)));\
-       0; })
-
-#define GET_UNALIGN_CTL(task,value)    ({                              \
-       put_user((task_thread_info(task)->flags & (1 << TIF_UAC_NOPRINT))\
-                 >> ALPHA_UAC_SHIFT                                    \
-                | (task_thread_info(task)->flags & (1 << TIF_UAC_SIGBUS))\
-                >> (ALPHA_UAC_SHIFT + 1)                               \
-                | (task_thread_info(task)->flags & (1 << TIF_UAC_NOFIX))\
-                >> (ALPHA_UAC_SHIFT - 1),                              \
-                (int __user *)(value));                                \
-       })
-
-#endif /* __KERNEL__ */
-#endif /* _ALPHA_THREAD_INFO_H */
diff --git a/include/asm-alpha/timex.h b/include/asm-alpha/timex.h
deleted file mode 100644 (file)
index afa0c45..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * linux/include/asm-alpha/timex.h
- *
- * ALPHA architecture timex specifications
- */
-#ifndef _ASMALPHA_TIMEX_H
-#define _ASMALPHA_TIMEX_H
-
-/* With only one or two oddballs, we use the RTC as the ticker, selecting
-   the 32.768kHz reference clock, which nicely divides down to our HZ.  */
-#define CLOCK_TICK_RATE        32768
-
-/*
- * Standard way to access the cycle counter.
- * Currently only used on SMP for scheduling.
- *
- * Only the low 32 bits are available as a continuously counting entity. 
- * But this only means we'll force a reschedule every 8 seconds or so,
- * which isn't an evil thing.
- */
-
-typedef unsigned int cycles_t;
-
-static inline cycles_t get_cycles (void)
-{
-       cycles_t ret;
-       __asm__ __volatile__ ("rpcc %0" : "=r"(ret));
-       return ret;
-}
-
-#endif
diff --git a/include/asm-alpha/tlb.h b/include/asm-alpha/tlb.h
deleted file mode 100644 (file)
index c136365..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef _ALPHA_TLB_H
-#define _ALPHA_TLB_H
-
-#define tlb_start_vma(tlb, vma)                        do { } while (0)
-#define tlb_end_vma(tlb, vma)                  do { } while (0)
-#define __tlb_remove_tlb_entry(tlb, pte, addr) do { } while (0)
-
-#define tlb_flush(tlb)                         flush_tlb_mm((tlb)->mm)
-
-#include <asm-generic/tlb.h>
-
-#define __pte_free_tlb(tlb, pte)                       pte_free((tlb)->mm, pte)
-#define __pmd_free_tlb(tlb, pmd)                       pmd_free((tlb)->mm, pmd)
-#endif
diff --git a/include/asm-alpha/tlbflush.h b/include/asm-alpha/tlbflush.h
deleted file mode 100644 (file)
index 9d87aaa..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-#ifndef _ALPHA_TLBFLUSH_H
-#define _ALPHA_TLBFLUSH_H
-
-#include <linux/mm.h>
-#include <asm/compiler.h>
-#include <asm/pgalloc.h>
-
-#ifndef __EXTERN_INLINE
-#define __EXTERN_INLINE extern inline
-#define __MMU_EXTERN_INLINE
-#endif
-
-extern void __load_new_mm_context(struct mm_struct *);
-
-
-/* Use a few helper functions to hide the ugly broken ASN
-   numbers on early Alphas (ev4 and ev45).  */
-
-__EXTERN_INLINE void
-ev4_flush_tlb_current(struct mm_struct *mm)
-{
-       __load_new_mm_context(mm);
-       tbiap();
-}
-
-__EXTERN_INLINE void
-ev5_flush_tlb_current(struct mm_struct *mm)
-{
-       __load_new_mm_context(mm);
-}
-
-/* Flush just one page in the current TLB set.  We need to be very
-   careful about the icache here, there is no way to invalidate a
-   specific icache page.  */
-
-__EXTERN_INLINE void
-ev4_flush_tlb_current_page(struct mm_struct * mm,
-                          struct vm_area_struct *vma,
-                          unsigned long addr)
-{
-       int tbi_flag = 2;
-       if (vma->vm_flags & VM_EXEC) {
-               __load_new_mm_context(mm);
-               tbi_flag = 3;
-       }
-       tbi(tbi_flag, addr);
-}
-
-__EXTERN_INLINE void
-ev5_flush_tlb_current_page(struct mm_struct * mm,
-                          struct vm_area_struct *vma,
-                          unsigned long addr)
-{
-       if (vma->vm_flags & VM_EXEC)
-               __load_new_mm_context(mm);
-       else
-               tbi(2, addr);
-}
-
-
-#ifdef CONFIG_ALPHA_GENERIC
-# define flush_tlb_current             alpha_mv.mv_flush_tlb_current
-# define flush_tlb_current_page                alpha_mv.mv_flush_tlb_current_page
-#else
-# ifdef CONFIG_ALPHA_EV4
-#  define flush_tlb_current            ev4_flush_tlb_current
-#  define flush_tlb_current_page       ev4_flush_tlb_current_page
-# else
-#  define flush_tlb_current            ev5_flush_tlb_current
-#  define flush_tlb_current_page       ev5_flush_tlb_current_page
-# endif
-#endif
-
-#ifdef __MMU_EXTERN_INLINE
-#undef __EXTERN_INLINE
-#undef __MMU_EXTERN_INLINE
-#endif
-
-/* Flush current user mapping.  */
-static inline void
-flush_tlb(void)
-{
-       flush_tlb_current(current->active_mm);
-}
-
-/* Flush someone else's user mapping.  */
-static inline void
-flush_tlb_other(struct mm_struct *mm)
-{
-       unsigned long *mmc = &mm->context[smp_processor_id()];
-       /* Check it's not zero first to avoid cacheline ping pong
-          when possible.  */
-       if (*mmc) *mmc = 0;
-}
-
-#ifndef CONFIG_SMP
-/* Flush everything (kernel mapping may also have changed
-   due to vmalloc/vfree).  */
-static inline void flush_tlb_all(void)
-{
-       tbia();
-}
-
-/* Flush a specified user mapping.  */
-static inline void
-flush_tlb_mm(struct mm_struct *mm)
-{
-       if (mm == current->active_mm)
-               flush_tlb_current(mm);
-       else
-               flush_tlb_other(mm);
-}
-
-/* Page-granular tlb flush.  */
-static inline void
-flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
-{
-       struct mm_struct *mm = vma->vm_mm;
-
-       if (mm == current->active_mm)
-               flush_tlb_current_page(mm, vma, addr);
-       else
-               flush_tlb_other(mm);
-}
-
-/* Flush a specified range of user mapping.  On the Alpha we flush
-   the whole user tlb.  */
-static inline void
-flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
-               unsigned long end)
-{
-       flush_tlb_mm(vma->vm_mm);
-}
-
-#else /* CONFIG_SMP */
-
-extern void flush_tlb_all(void);
-extern void flush_tlb_mm(struct mm_struct *);
-extern void flush_tlb_page(struct vm_area_struct *, unsigned long);
-extern void flush_tlb_range(struct vm_area_struct *, unsigned long,
-                           unsigned long);
-
-#endif /* CONFIG_SMP */
-
-static inline void flush_tlb_kernel_range(unsigned long start,
-                                       unsigned long end)
-{
-       flush_tlb_all();
-}
-
-#endif /* _ALPHA_TLBFLUSH_H */
diff --git a/include/asm-alpha/topology.h b/include/asm-alpha/topology.h
deleted file mode 100644 (file)
index 149532e..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef _ASM_ALPHA_TOPOLOGY_H
-#define _ASM_ALPHA_TOPOLOGY_H
-
-#include <linux/smp.h>
-#include <linux/threads.h>
-#include <asm/machvec.h>
-
-#ifdef CONFIG_NUMA
-static inline int cpu_to_node(int cpu)
-{
-       int node;
-       
-       if (!alpha_mv.cpuid_to_nid)
-               return 0;
-
-       node = alpha_mv.cpuid_to_nid(cpu);
-
-#ifdef DEBUG_NUMA
-       BUG_ON(node < 0);
-#endif
-
-       return node;
-}
-
-static inline cpumask_t node_to_cpumask(int node)
-{
-       cpumask_t node_cpu_mask = CPU_MASK_NONE;
-       int cpu;
-
-       for_each_online_cpu(cpu) {
-               if (cpu_to_node(cpu) == node)
-                       cpu_set(cpu, node_cpu_mask);
-       }
-
-#ifdef DEBUG_NUMA
-       printk("node %d: cpu_mask: %016lx\n", node, node_cpu_mask);
-#endif
-
-       return node_cpu_mask;
-}
-
-#define pcibus_to_cpumask(bus) (cpu_online_map)
-
-#endif /* !CONFIG_NUMA */
-# include <asm-generic/topology.h>
-
-#endif /* _ASM_ALPHA_TOPOLOGY_H */
diff --git a/include/asm-alpha/types.h b/include/asm-alpha/types.h
deleted file mode 100644 (file)
index c154135..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef _ALPHA_TYPES_H
-#define _ALPHA_TYPES_H
-
-/*
- * This file is never included by application software unless
- * explicitly requested (e.g., via linux/types.h) in which case the
- * application is Linux specific so (user-) name space pollution is
- * not a major issue.  However, for interoperability, libraries still
- * need to be careful to avoid a name clashes.
- */
-#include <asm-generic/int-l64.h>
-
-#ifndef __ASSEMBLY__
-
-typedef unsigned int umode_t;
-
-#endif /* __ASSEMBLY__ */
-
-/*
- * These aren't exported outside the kernel to avoid name space clashes
- */
-#ifdef __KERNEL__
-
-#define BITS_PER_LONG 64
-
-#ifndef __ASSEMBLY__
-
-typedef u64 dma_addr_t;
-typedef u64 dma64_addr_t;
-
-#endif /* __ASSEMBLY__ */
-#endif /* __KERNEL__ */
-#endif /* _ALPHA_TYPES_H */
diff --git a/include/asm-alpha/uaccess.h b/include/asm-alpha/uaccess.h
deleted file mode 100644 (file)
index 22de3b4..0000000
+++ /dev/null
@@ -1,511 +0,0 @@
-#ifndef __ALPHA_UACCESS_H
-#define __ALPHA_UACCESS_H
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-
-
-/*
- * The fs value determines whether argument validity checking should be
- * performed or not.  If get_fs() == USER_DS, checking is performed, with
- * get_fs() == KERNEL_DS, checking is bypassed.
- *
- * Or at least it did once upon a time.  Nowadays it is a mask that
- * defines which bits of the address space are off limits.  This is a
- * wee bit faster than the above.
- *
- * For historical reasons, these macros are grossly misnamed.
- */
-
-#define KERNEL_DS      ((mm_segment_t) { 0UL })
-#define USER_DS                ((mm_segment_t) { -0x40000000000UL })
-
-#define VERIFY_READ    0
-#define VERIFY_WRITE   1
-
-#define get_fs()  (current_thread_info()->addr_limit)
-#define get_ds()  (KERNEL_DS)
-#define set_fs(x) (current_thread_info()->addr_limit = (x))
-
-#define segment_eq(a,b)        ((a).seg == (b).seg)
-
-/*
- * Is a address valid? This does a straightforward calculation rather
- * than tests.
- *
- * Address valid if:
- *  - "addr" doesn't have any high-bits set
- *  - AND "size" doesn't have any high-bits set
- *  - AND "addr+size" doesn't have any high-bits set
- *  - OR we are in kernel mode.
- */
-#define __access_ok(addr,size,segment) \
-       (((segment).seg & (addr | size | (addr+size))) == 0)
-
-#define access_ok(type,addr,size)                              \
-({                                                             \
-       __chk_user_ptr(addr);                                   \
-       __access_ok(((unsigned long)(addr)),(size),get_fs());   \
-})
-
-/*
- * These are the main single-value transfer routines.  They automatically
- * use the right size if we just have the right pointer type.
- *
- * As the alpha uses the same address space for kernel and user
- * data, we can just do these as direct assignments.  (Of course, the
- * exception handling means that it's no longer "just"...)
- *
- * Careful to not
- * (a) re-use the arguments for side effects (sizeof/typeof is ok)
- * (b) require any knowledge of processes at this stage
- */
-#define put_user(x,ptr) \
-  __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)),get_fs())
-#define get_user(x,ptr) \
-  __get_user_check((x),(ptr),sizeof(*(ptr)),get_fs())
-
-/*
- * The "__xxx" versions do not do address space checking, useful when
- * doing multiple accesses to the same area (the programmer has to do the
- * checks by hand with "access_ok()")
- */
-#define __put_user(x,ptr) \
-  __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
-#define __get_user(x,ptr) \
-  __get_user_nocheck((x),(ptr),sizeof(*(ptr)))
-  
-/*
- * The "lda %1, 2b-1b(%0)" bits are magic to get the assembler to
- * encode the bits we need for resolving the exception.  See the
- * more extensive comments with fixup_inline_exception below for
- * more information.
- */
-
-extern void __get_user_unknown(void);
-
-#define __get_user_nocheck(x,ptr,size)                         \
-({                                                             \
-       long __gu_err = 0;                                      \
-       unsigned long __gu_val;                                 \
-       __chk_user_ptr(ptr);                                    \
-       switch (size) {                                         \
-         case 1: __get_user_8(ptr); break;                     \
-         case 2: __get_user_16(ptr); break;                    \
-         case 4: __get_user_32(ptr); break;                    \
-         case 8: __get_user_64(ptr); break;                    \
-         default: __get_user_unknown(); break;                 \
-       }                                                       \
-       (x) = (__typeof__(*(ptr))) __gu_val;                    \
-       __gu_err;                                               \
-})
-
-#define __get_user_check(x,ptr,size,segment)                           \
-({                                                                     \
-       long __gu_err = -EFAULT;                                        \
-       unsigned long __gu_val = 0;                                     \
-       const __typeof__(*(ptr)) __user *__gu_addr = (ptr);             \
-       if (__access_ok((unsigned long)__gu_addr,size,segment)) {       \
-               __gu_err = 0;                                           \
-               switch (size) {                                         \
-                 case 1: __get_user_8(__gu_addr); break;               \
-                 case 2: __get_user_16(__gu_addr); break;              \
-                 case 4: __get_user_32(__gu_addr); break;              \
-                 case 8: __get_user_64(__gu_addr); break;              \
-                 default: __get_user_unknown(); break;                 \
-               }                                                       \
-       }                                                               \
-       (x) = (__typeof__(*(ptr))) __gu_val;                            \
-       __gu_err;                                                       \
-})
-
-struct __large_struct { unsigned long buf[100]; };
-#define __m(x) (*(struct __large_struct __user *)(x))
-
-#define __get_user_64(addr)                            \
-       __asm__("1: ldq %0,%2\n"                        \
-       "2:\n"                                          \
-       ".section __ex_table,\"a\"\n"                   \
-       "       .long 1b - .\n"                         \
-       "       lda %0, 2b-1b(%1)\n"                    \
-       ".previous"                                     \
-               : "=r"(__gu_val), "=r"(__gu_err)        \
-               : "m"(__m(addr)), "1"(__gu_err))
-
-#define __get_user_32(addr)                            \
-       __asm__("1: ldl %0,%2\n"                        \
-       "2:\n"                                          \
-       ".section __ex_table,\"a\"\n"                   \
-       "       .long 1b - .\n"                         \
-       "       lda %0, 2b-1b(%1)\n"                    \
-       ".previous"                                     \
-               : "=r"(__gu_val), "=r"(__gu_err)        \
-               : "m"(__m(addr)), "1"(__gu_err))
-
-#ifdef __alpha_bwx__
-/* Those lucky bastards with ev56 and later CPUs can do byte/word moves.  */
-
-#define __get_user_16(addr)                            \
-       __asm__("1: ldwu %0,%2\n"                       \
-       "2:\n"                                          \
-       ".section __ex_table,\"a\"\n"                   \
-       "       .long 1b - .\n"                         \
-       "       lda %0, 2b-1b(%1)\n"                    \
-       ".previous"                                     \
-               : "=r"(__gu_val), "=r"(__gu_err)        \
-               : "m"(__m(addr)), "1"(__gu_err))
-
-#define __get_user_8(addr)                             \
-       __asm__("1: ldbu %0,%2\n"                       \
-       "2:\n"                                          \
-       ".section __ex_table,\"a\"\n"                   \
-       "       .long 1b - .\n"                         \
-       "       lda %0, 2b-1b(%1)\n"                    \
-       ".previous"                                     \
-               : "=r"(__gu_val), "=r"(__gu_err)        \
-               : "m"(__m(addr)), "1"(__gu_err))
-#else
-/* Unfortunately, we can't get an unaligned access trap for the sub-word
-   load, so we have to do a general unaligned operation.  */
-
-#define __get_user_16(addr)                                            \
-{                                                                      \
-       long __gu_tmp;                                                  \
-       __asm__("1: ldq_u %0,0(%3)\n"                                   \
-       "2:     ldq_u %1,1(%3)\n"                                       \
-       "       extwl %0,%3,%0\n"                                       \
-       "       extwh %1,%3,%1\n"                                       \
-       "       or %0,%1,%0\n"                                          \
-       "3:\n"                                                          \
-       ".section __ex_table,\"a\"\n"                                   \
-       "       .long 1b - .\n"                                         \
-       "       lda %0, 3b-1b(%2)\n"                                    \
-       "       .long 2b - .\n"                                         \
-       "       lda %0, 3b-2b(%2)\n"                                    \
-       ".previous"                                                     \
-               : "=&r"(__gu_val), "=&r"(__gu_tmp), "=r"(__gu_err)      \
-               : "r"(addr), "2"(__gu_err));                            \
-}
-
-#define __get_user_8(addr)                                             \
-       __asm__("1: ldq_u %0,0(%2)\n"                                   \
-       "       extbl %0,%2,%0\n"                                       \
-       "2:\n"                                                          \
-       ".section __ex_table,\"a\"\n"                                   \
-       "       .long 1b - .\n"                                         \
-       "       lda %0, 2b-1b(%1)\n"                                    \
-       ".previous"                                                     \
-               : "=&r"(__gu_val), "=r"(__gu_err)                       \
-               : "r"(addr), "1"(__gu_err))
-#endif
-
-extern void __put_user_unknown(void);
-
-#define __put_user_nocheck(x,ptr,size)                         \
-({                                                             \
-       long __pu_err = 0;                                      \
-       __chk_user_ptr(ptr);                                    \
-       switch (size) {                                         \
-         case 1: __put_user_8(x,ptr); break;                   \
-         case 2: __put_user_16(x,ptr); break;                  \
-         case 4: __put_user_32(x,ptr); break;                  \
-         case 8: __put_user_64(x,ptr); break;                  \
-         default: __put_user_unknown(); break;                 \
-       }                                                       \
-       __pu_err;                                               \
-})
-
-#define __put_user_check(x,ptr,size,segment)                           \
-({                                                                     \
-       long __pu_err = -EFAULT;                                        \
-       __typeof__(*(ptr)) __user *__pu_addr = (ptr);                   \
-       if (__access_ok((unsigned long)__pu_addr,size,segment)) {       \
-               __pu_err = 0;                                           \
-               switch (size) {                                         \
-                 case 1: __put_user_8(x,__pu_addr); break;             \
-                 case 2: __put_user_16(x,__pu_addr); break;            \
-                 case 4: __put_user_32(x,__pu_addr); break;            \
-                 case 8: __put_user_64(x,__pu_addr); break;            \
-                 default: __put_user_unknown(); break;                 \
-               }                                                       \
-       }                                                               \
-       __pu_err;                                                       \
-})
-
-/*
- * The "__put_user_xx()" macros tell gcc they read from memory
- * instead of writing: this is because they do not write to
- * any memory gcc knows about, so there are no aliasing issues
- */
-#define __put_user_64(x,addr)                                  \
-__asm__ __volatile__("1: stq %r2,%1\n"                         \
-       "2:\n"                                                  \
-       ".section __ex_table,\"a\"\n"                           \
-       "       .long 1b - .\n"                                 \
-       "       lda $31,2b-1b(%0)\n"                            \
-       ".previous"                                             \
-               : "=r"(__pu_err)                                \
-               : "m" (__m(addr)), "rJ" (x), "0"(__pu_err))
-
-#define __put_user_32(x,addr)                                  \
-__asm__ __volatile__("1: stl %r2,%1\n"                         \
-       "2:\n"                                                  \
-       ".section __ex_table,\"a\"\n"                           \
-       "       .long 1b - .\n"                                 \
-       "       lda $31,2b-1b(%0)\n"                            \
-       ".previous"                                             \
-               : "=r"(__pu_err)                                \
-               : "m"(__m(addr)), "rJ"(x), "0"(__pu_err))
-
-#ifdef __alpha_bwx__
-/* Those lucky bastards with ev56 and later CPUs can do byte/word moves.  */
-
-#define __put_user_16(x,addr)                                  \
-__asm__ __volatile__("1: stw %r2,%1\n"                         \
-       "2:\n"                                                  \
-       ".section __ex_table,\"a\"\n"                           \
-       "       .long 1b - .\n"                                 \
-       "       lda $31,2b-1b(%0)\n"                            \
-       ".previous"                                             \
-               : "=r"(__pu_err)                                \
-               : "m"(__m(addr)), "rJ"(x), "0"(__pu_err))
-
-#define __put_user_8(x,addr)                                   \
-__asm__ __volatile__("1: stb %r2,%1\n"                         \
-       "2:\n"                                                  \
-       ".section __ex_table,\"a\"\n"                           \
-       "       .long 1b - .\n"                                 \
-       "       lda $31,2b-1b(%0)\n"                            \
-       ".previous"                                             \
-               : "=r"(__pu_err)                                \
-               : "m"(__m(addr)), "rJ"(x), "0"(__pu_err))
-#else
-/* Unfortunately, we can't get an unaligned access trap for the sub-word
-   write, so we have to do a general unaligned operation.  */
-
-#define __put_user_16(x,addr)                                  \
-{                                                              \
-       long __pu_tmp1, __pu_tmp2, __pu_tmp3, __pu_tmp4;        \
-       __asm__ __volatile__(                                   \
-       "1:     ldq_u %2,1(%5)\n"                               \
-       "2:     ldq_u %1,0(%5)\n"                               \
-       "       inswh %6,%5,%4\n"                               \
-       "       inswl %6,%5,%3\n"                               \
-       "       mskwh %2,%5,%2\n"                               \
-       "       mskwl %1,%5,%1\n"                               \
-       "       or %2,%4,%2\n"                                  \
-       "       or %1,%3,%1\n"                                  \
-       "3:     stq_u %2,1(%5)\n"                               \
-       "4:     stq_u %1,0(%5)\n"                               \
-       "5:\n"                                                  \
-       ".section __ex_table,\"a\"\n"                           \
-       "       .long 1b - .\n"                                 \
-       "       lda $31, 5b-1b(%0)\n"                           \
-       "       .long 2b - .\n"                                 \
-       "       lda $31, 5b-2b(%0)\n"                           \
-       "       .long 3b - .\n"                                 \
-       "       lda $31, 5b-3b(%0)\n"                           \
-       "       .long 4b - .\n"                                 \
-       "       lda $31, 5b-4b(%0)\n"                           \
-       ".previous"                                             \
-               : "=r"(__pu_err), "=&r"(__pu_tmp1),             \
-                 "=&r"(__pu_tmp2), "=&r"(__pu_tmp3),           \
-                 "=&r"(__pu_tmp4)                              \
-               : "r"(addr), "r"((unsigned long)(x)), "0"(__pu_err)); \
-}
-
-#define __put_user_8(x,addr)                                   \
-{                                                              \
-       long __pu_tmp1, __pu_tmp2;                              \
-       __asm__ __volatile__(                                   \
-       "1:     ldq_u %1,0(%4)\n"                               \
-       "       insbl %3,%4,%2\n"                               \
-       "       mskbl %1,%4,%1\n"                               \
-       "       or %1,%2,%1\n"                                  \
-       "2:     stq_u %1,0(%4)\n"                               \
-       "3:\n"                                                  \
-       ".section __ex_table,\"a\"\n"                           \
-       "       .long 1b - .\n"                                 \
-       "       lda $31, 3b-1b(%0)\n"                           \
-       "       .long 2b - .\n"                                 \
-       "       lda $31, 3b-2b(%0)\n"                           \
-       ".previous"                                             \
-               : "=r"(__pu_err),                               \
-                 "=&r"(__pu_tmp1), "=&r"(__pu_tmp2)            \
-               : "r"((unsigned long)(x)), "r"(addr), "0"(__pu_err)); \
-}
-#endif
-
-
-/*
- * Complex access routines
- */
-
-/* This little bit of silliness is to get the GP loaded for a function
-   that ordinarily wouldn't.  Otherwise we could have it done by the macro
-   directly, which can be optimized the linker.  */
-#ifdef MODULE
-#define __module_address(sym)          "r"(sym),
-#define __module_call(ra, arg, sym)    "jsr $" #ra ",(%" #arg ")," #sym
-#else
-#define __module_address(sym)
-#define __module_call(ra, arg, sym)    "bsr $" #ra "," #sym " !samegp"
-#endif
-
-extern void __copy_user(void);
-
-extern inline long
-__copy_tofrom_user_nocheck(void *to, const void *from, long len)
-{
-       register void * __cu_to __asm__("$6") = to;
-       register const void * __cu_from __asm__("$7") = from;
-       register long __cu_len __asm__("$0") = len;
-
-       __asm__ __volatile__(
-               __module_call(28, 3, __copy_user)
-               : "=r" (__cu_len), "=r" (__cu_from), "=r" (__cu_to)
-               : __module_address(__copy_user)
-                 "0" (__cu_len), "1" (__cu_from), "2" (__cu_to)
-               : "$1","$2","$3","$4","$5","$28","memory");
-
-       return __cu_len;
-}
-
-extern inline long
-__copy_tofrom_user(void *to, const void *from, long len, const void __user *validate)
-{
-       if (__access_ok((unsigned long)validate, len, get_fs()))
-               len = __copy_tofrom_user_nocheck(to, from, len);
-       return len;
-}
-
-#define __copy_to_user(to,from,n)                                      \
-({                                                                     \
-       __chk_user_ptr(to);                                             \
-       __copy_tofrom_user_nocheck((__force void *)(to),(from),(n));    \
-})
-#define __copy_from_user(to,from,n)                                    \
-({                                                                     \
-       __chk_user_ptr(from);                                           \
-       __copy_tofrom_user_nocheck((to),(__force void *)(from),(n));    \
-})
-
-#define __copy_to_user_inatomic __copy_to_user
-#define __copy_from_user_inatomic __copy_from_user
-
-
-extern inline long
-copy_to_user(void __user *to, const void *from, long n)
-{
-       return __copy_tofrom_user((__force void *)to, from, n, to);
-}
-
-extern inline long
-copy_from_user(void *to, const void __user *from, long n)
-{
-       return __copy_tofrom_user(to, (__force void *)from, n, from);
-}
-
-extern void __do_clear_user(void);
-
-extern inline long
-__clear_user(void __user *to, long len)
-{
-       register void __user * __cl_to __asm__("$6") = to;
-       register long __cl_len __asm__("$0") = len;
-       __asm__ __volatile__(
-               __module_call(28, 2, __do_clear_user)
-               : "=r"(__cl_len), "=r"(__cl_to)
-               : __module_address(__do_clear_user)
-                 "0"(__cl_len), "1"(__cl_to)
-               : "$1","$2","$3","$4","$5","$28","memory");
-       return __cl_len;
-}
-
-extern inline long
-clear_user(void __user *to, long len)
-{
-       if (__access_ok((unsigned long)to, len, get_fs()))
-               len = __clear_user(to, len);
-       return len;
-}
-
-#undef __module_address
-#undef __module_call
-
-/* Returns: -EFAULT if exception before terminator, N if the entire
-   buffer filled, else strlen.  */
-
-extern long __strncpy_from_user(char *__to, const char __user *__from, long __to_len);
-
-extern inline long
-strncpy_from_user(char *to, const char __user *from, long n)
-{
-       long ret = -EFAULT;
-       if (__access_ok((unsigned long)from, 0, get_fs()))
-               ret = __strncpy_from_user(to, from, n);
-       return ret;
-}
-
-/* Returns: 0 if bad, string length+1 (memory size) of string if ok */
-extern long __strlen_user(const char __user *);
-
-extern inline long strlen_user(const char __user *str)
-{
-       return access_ok(VERIFY_READ,str,0) ? __strlen_user(str) : 0;
-}
-
-/* Returns: 0 if exception before NUL or reaching the supplied limit (N),
- * a value greater than N if the limit would be exceeded, else strlen.  */
-extern long __strnlen_user(const char __user *, long);
-
-extern inline long strnlen_user(const char __user *str, long n)
-{
-       return access_ok(VERIFY_READ,str,0) ? __strnlen_user(str, n) : 0;
-}
-
-/*
- * About the exception table:
- *
- * - insn is a 32-bit pc-relative offset from the faulting insn.
- * - nextinsn is a 16-bit offset off of the faulting instruction
- *   (not off of the *next* instruction as branches are).
- * - errreg is the register in which to place -EFAULT.
- * - valreg is the final target register for the load sequence
- *   and will be zeroed.
- *
- * Either errreg or valreg may be $31, in which case nothing happens.
- *
- * The exception fixup information "just so happens" to be arranged
- * as in a MEM format instruction.  This lets us emit our three
- * values like so:
- *
- *      lda valreg, nextinsn(errreg)
- *
- */
-
-struct exception_table_entry
-{
-       signed int insn;
-       union exception_fixup {
-               unsigned unit;
-               struct {
-                       signed int nextinsn : 16;
-                       unsigned int errreg : 5;
-                       unsigned int valreg : 5;
-               } bits;
-       } fixup;
-};
-
-/* Returns the new pc */
-#define fixup_exception(map_reg, fixup, pc)                    \
-({                                                             \
-       if ((fixup)->fixup.bits.valreg != 31)                   \
-               map_reg((fixup)->fixup.bits.valreg) = 0;        \
-       if ((fixup)->fixup.bits.errreg != 31)                   \
-               map_reg((fixup)->fixup.bits.errreg) = -EFAULT;  \
-       (pc) + (fixup)->fixup.bits.nextinsn;                    \
-})
-
-
-#endif /* __ALPHA_UACCESS_H */
diff --git a/include/asm-alpha/ucontext.h b/include/asm-alpha/ucontext.h
deleted file mode 100644 (file)
index 47578ab..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _ASMAXP_UCONTEXT_H
-#define _ASMAXP_UCONTEXT_H
-
-struct ucontext {
-       unsigned long     uc_flags;
-       struct ucontext  *uc_link;
-       old_sigset_t      uc_osf_sigmask;
-       stack_t           uc_stack;
-       struct sigcontext uc_mcontext;
-       sigset_t          uc_sigmask;   /* mask last for extensibility */
-};
-
-#endif /* !_ASMAXP_UCONTEXT_H */
diff --git a/include/asm-alpha/unaligned.h b/include/asm-alpha/unaligned.h
deleted file mode 100644 (file)
index 3787c60..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef _ASM_ALPHA_UNALIGNED_H
-#define _ASM_ALPHA_UNALIGNED_H
-
-#include <linux/unaligned/le_struct.h>
-#include <linux/unaligned/be_byteshift.h>
-#include <linux/unaligned/generic.h>
-
-#define get_unaligned __get_unaligned_le
-#define put_unaligned __put_unaligned_le
-
-#endif /* _ASM_ALPHA_UNALIGNED_H */
diff --git a/include/asm-alpha/unistd.h b/include/asm-alpha/unistd.h
deleted file mode 100644 (file)
index 5b5c174..0000000
+++ /dev/null
@@ -1,464 +0,0 @@
-#ifndef _ALPHA_UNISTD_H
-#define _ALPHA_UNISTD_H
-
-#define __NR_osf_syscall         0     /* not implemented */
-#define __NR_exit                1
-#define __NR_fork                2
-#define __NR_read                3
-#define __NR_write               4
-#define __NR_osf_old_open        5     /* not implemented */
-#define __NR_close               6
-#define __NR_osf_wait4           7
-#define __NR_osf_old_creat       8     /* not implemented */
-#define __NR_link                9
-#define __NR_unlink             10
-#define __NR_osf_execve                 11     /* not implemented */
-#define __NR_chdir              12
-#define __NR_fchdir             13
-#define __NR_mknod              14
-#define __NR_chmod              15
-#define __NR_chown              16
-#define __NR_brk                17
-#define __NR_osf_getfsstat      18     /* not implemented */
-#define __NR_lseek              19
-#define __NR_getxpid            20
-#define __NR_osf_mount          21
-#define __NR_umount             22
-#define __NR_setuid             23
-#define __NR_getxuid            24
-#define __NR_exec_with_loader   25     /* not implemented */
-#define __NR_ptrace             26
-#define __NR_osf_nrecvmsg       27     /* not implemented */
-#define __NR_osf_nsendmsg       28     /* not implemented */
-#define __NR_osf_nrecvfrom      29     /* not implemented */
-#define __NR_osf_naccept        30     /* not implemented */
-#define __NR_osf_ngetpeername   31     /* not implemented */
-#define __NR_osf_ngetsockname   32     /* not implemented */
-#define __NR_access             33
-#define __NR_osf_chflags        34     /* not implemented */
-#define __NR_osf_fchflags       35     /* not implemented */
-#define __NR_sync               36
-#define __NR_kill               37
-#define __NR_osf_old_stat       38     /* not implemented */
-#define __NR_setpgid            39
-#define __NR_osf_old_lstat      40     /* not implemented */
-#define __NR_dup                41
-#define __NR_pipe               42
-#define __NR_osf_set_program_attributes        43
-#define __NR_osf_profil                 44     /* not implemented */
-#define __NR_open               45
-#define __NR_osf_old_sigaction  46     /* not implemented */
-#define __NR_getxgid            47
-#define __NR_osf_sigprocmask    48
-#define __NR_osf_getlogin       49     /* not implemented */
-#define __NR_osf_setlogin       50     /* not implemented */
-#define __NR_acct               51
-#define __NR_sigpending                 52
-
-#define __NR_ioctl              54
-#define __NR_osf_reboot                 55     /* not implemented */
-#define __NR_osf_revoke                 56     /* not implemented */
-#define __NR_symlink            57
-#define __NR_readlink           58
-#define __NR_execve             59
-#define __NR_umask              60
-#define __NR_chroot             61
-#define __NR_osf_old_fstat      62     /* not implemented */
-#define __NR_getpgrp            63
-#define __NR_getpagesize        64
-#define __NR_osf_mremap                 65     /* not implemented */
-#define __NR_vfork              66
-#define __NR_stat               67
-#define __NR_lstat              68
-#define __NR_osf_sbrk           69     /* not implemented */
-#define __NR_osf_sstk           70     /* not implemented */
-#define __NR_mmap               71     /* OSF/1 mmap is superset of Linux */
-#define __NR_osf_old_vadvise    72     /* not implemented */
-#define __NR_munmap             73
-#define __NR_mprotect           74
-#define __NR_madvise            75
-#define __NR_vhangup            76
-#define __NR_osf_kmodcall       77     /* not implemented */
-#define __NR_osf_mincore        78     /* not implemented */
-#define __NR_getgroups          79
-#define __NR_setgroups          80
-#define __NR_osf_old_getpgrp    81     /* not implemented */
-#define __NR_setpgrp            82     /* BSD alias for setpgid */
-#define __NR_osf_setitimer      83
-#define __NR_osf_old_wait       84     /* not implemented */
-#define __NR_osf_table          85     /* not implemented */
-#define __NR_osf_getitimer      86
-#define __NR_gethostname        87
-#define __NR_sethostname        88
-#define __NR_getdtablesize      89
-#define __NR_dup2               90
-#define __NR_fstat              91
-#define __NR_fcntl              92
-#define __NR_osf_select                 93
-#define __NR_poll               94
-#define __NR_fsync              95
-#define __NR_setpriority        96
-#define __NR_socket             97
-#define __NR_connect            98
-#define __NR_accept             99
-#define __NR_getpriority       100
-#define __NR_send              101
-#define __NR_recv              102
-#define __NR_sigreturn         103
-#define __NR_bind              104
-#define __NR_setsockopt                105
-#define __NR_listen            106
-#define __NR_osf_plock         107     /* not implemented */
-#define __NR_osf_old_sigvec    108     /* not implemented */
-#define __NR_osf_old_sigblock  109     /* not implemented */
-#define __NR_osf_old_sigsetmask        110     /* not implemented */
-#define __NR_sigsuspend                111
-#define __NR_osf_sigstack      112
-#define __NR_recvmsg           113
-#define __NR_sendmsg           114
-#define __NR_osf_old_vtrace    115     /* not implemented */
-#define __NR_osf_gettimeofday  116
-#define __NR_osf_getrusage     117
-#define __NR_getsockopt                118
-
-#define __NR_readv             120
-#define __NR_writev            121
-#define __NR_osf_settimeofday  122
-#define __NR_fchown            123
-#define __NR_fchmod            124
-#define __NR_recvfrom          125
-#define __NR_setreuid          126
-#define __NR_setregid          127
-#define __NR_rename            128
-#define __NR_truncate          129
-#define __NR_ftruncate         130
-#define __NR_flock             131
-#define __NR_setgid            132
-#define __NR_sendto            133
-#define __NR_shutdown          134
-#define __NR_socketpair                135
-#define __NR_mkdir             136
-#define __NR_rmdir             137
-#define __NR_osf_utimes                138
-#define __NR_osf_old_sigreturn 139     /* not implemented */
-#define __NR_osf_adjtime       140     /* not implemented */
-#define __NR_getpeername       141
-#define __NR_osf_gethostid     142     /* not implemented */
-#define __NR_osf_sethostid     143     /* not implemented */
-#define __NR_getrlimit         144
-#define __NR_setrlimit         145
-#define __NR_osf_old_killpg    146     /* not implemented */
-#define __NR_setsid            147
-#define __NR_quotactl          148
-#define __NR_osf_oldquota      149     /* not implemented */
-#define __NR_getsockname       150
-
-#define __NR_osf_pid_block     153     /* not implemented */
-#define __NR_osf_pid_unblock   154     /* not implemented */
-
-#define __NR_sigaction         156
-#define __NR_osf_sigwaitprim   157     /* not implemented */
-#define __NR_osf_nfssvc                158     /* not implemented */
-#define __NR_osf_getdirentries 159
-#define __NR_osf_statfs                160
-#define __NR_osf_fstatfs       161
-
-#define __NR_osf_asynch_daemon 163     /* not implemented */
-#define __NR_osf_getfh         164     /* not implemented */   
-#define __NR_osf_getdomainname 165
-#define __NR_setdomainname     166
-
-#define __NR_osf_exportfs      169     /* not implemented */
-
-#define __NR_osf_alt_plock     181     /* not implemented */
-
-#define __NR_osf_getmnt                184     /* not implemented */
-
-#define __NR_osf_alt_sigpending        187     /* not implemented */
-#define __NR_osf_alt_setsid    188     /* not implemented */
-
-#define __NR_osf_swapon                199
-#define __NR_msgctl            200
-#define __NR_msgget            201
-#define __NR_msgrcv            202
-#define __NR_msgsnd            203
-#define __NR_semctl            204
-#define __NR_semget            205
-#define __NR_semop             206
-#define __NR_osf_utsname       207
-#define __NR_lchown            208
-#define __NR_osf_shmat         209
-#define __NR_shmctl            210
-#define __NR_shmdt             211
-#define __NR_shmget            212
-#define __NR_osf_mvalid                213     /* not implemented */
-#define __NR_osf_getaddressconf        214     /* not implemented */
-#define __NR_osf_msleep                215     /* not implemented */
-#define __NR_osf_mwakeup       216     /* not implemented */
-#define __NR_msync             217
-#define __NR_osf_signal                218     /* not implemented */
-#define __NR_osf_utc_gettime   219     /* not implemented */
-#define __NR_osf_utc_adjtime   220     /* not implemented */
-
-#define __NR_osf_security      222     /* not implemented */
-#define __NR_osf_kloadcall     223     /* not implemented */
-
-#define __NR_getpgid           233
-#define __NR_getsid            234
-#define __NR_sigaltstack       235
-#define __NR_osf_waitid                236     /* not implemented */
-#define __NR_osf_priocntlset   237     /* not implemented */
-#define __NR_osf_sigsendset    238     /* not implemented */
-#define __NR_osf_set_speculative       239     /* not implemented */
-#define __NR_osf_msfs_syscall  240     /* not implemented */
-#define __NR_osf_sysinfo       241
-#define __NR_osf_uadmin                242     /* not implemented */
-#define __NR_osf_fuser         243     /* not implemented */
-#define __NR_osf_proplist_syscall    244
-#define __NR_osf_ntp_adjtime   245     /* not implemented */
-#define __NR_osf_ntp_gettime   246     /* not implemented */
-#define __NR_osf_pathconf      247     /* not implemented */
-#define __NR_osf_fpathconf     248     /* not implemented */
-
-#define __NR_osf_uswitch       250     /* not implemented */
-#define __NR_osf_usleep_thread 251
-#define __NR_osf_audcntl       252     /* not implemented */
-#define __NR_osf_audgen                253     /* not implemented */
-#define __NR_sysfs             254
-#define __NR_osf_subsys_info   255     /* not implemented */
-#define __NR_osf_getsysinfo    256
-#define __NR_osf_setsysinfo    257
-#define __NR_osf_afs_syscall   258     /* not implemented */
-#define __NR_osf_swapctl       259     /* not implemented */
-#define __NR_osf_memcntl       260     /* not implemented */
-#define __NR_osf_fdatasync     261     /* not implemented */
-
-/*
- * Ignore legacy syscalls that we don't use.
- */
-#define __IGNORE_alarm
-#define __IGNORE_creat
-#define __IGNORE_getegid
-#define __IGNORE_geteuid
-#define __IGNORE_getgid
-#define __IGNORE_getpid
-#define __IGNORE_getppid
-#define __IGNORE_getuid
-#define __IGNORE_pause
-#define __IGNORE_time
-#define __IGNORE_utime
-
-/*
- * Linux-specific system calls begin at 300
- */
-#define __NR_bdflush           300
-#define __NR_sethae            301
-#define __NR_mount             302
-#define __NR_old_adjtimex      303
-#define __NR_swapoff           304
-#define __NR_getdents          305
-#define __NR_create_module     306
-#define __NR_init_module       307
-#define __NR_delete_module     308
-#define __NR_get_kernel_syms   309
-#define __NR_syslog            310
-#define __NR_reboot            311
-#define __NR_clone             312
-#define __NR_uselib            313
-#define __NR_mlock             314
-#define __NR_munlock           315
-#define __NR_mlockall          316
-#define __NR_munlockall                317
-#define __NR_sysinfo           318
-#define __NR__sysctl           319
-/* 320 was sys_idle.  */
-#define __NR_oldumount         321
-#define __NR_swapon            322
-#define __NR_times             323
-#define __NR_personality       324
-#define __NR_setfsuid          325
-#define __NR_setfsgid          326
-#define __NR_ustat             327
-#define __NR_statfs            328
-#define __NR_fstatfs           329
-#define __NR_sched_setparam            330
-#define __NR_sched_getparam            331
-#define __NR_sched_setscheduler                332
-#define __NR_sched_getscheduler                333
-#define __NR_sched_yield               334
-#define __NR_sched_get_priority_max    335
-#define __NR_sched_get_priority_min    336
-#define __NR_sched_rr_get_interval     337
-#define __NR_afs_syscall               338
-#define __NR_uname                     339
-#define __NR_nanosleep                 340
-#define __NR_mremap                    341
-#define __NR_nfsservctl                        342
-#define __NR_setresuid                 343
-#define __NR_getresuid                 344
-#define __NR_pciconfig_read            345
-#define __NR_pciconfig_write           346
-#define __NR_query_module              347
-#define __NR_prctl                     348
-#define __NR_pread64                   349
-#define __NR_pwrite64                  350
-#define __NR_rt_sigreturn              351
-#define __NR_rt_sigaction              352
-#define __NR_rt_sigprocmask            353
-#define __NR_rt_sigpending             354
-#define __NR_rt_sigtimedwait           355
-#define __NR_rt_sigqueueinfo           356
-#define __NR_rt_sigsuspend             357
-#define __NR_select                    358
-#define __NR_gettimeofday              359
-#define __NR_settimeofday              360
-#define __NR_getitimer                 361
-#define __NR_setitimer                 362
-#define __NR_utimes                    363
-#define __NR_getrusage                 364
-#define __NR_wait4                     365
-#define __NR_adjtimex                  366
-#define __NR_getcwd                    367
-#define __NR_capget                    368
-#define __NR_capset                    369
-#define __NR_sendfile                  370
-#define __NR_setresgid                 371
-#define __NR_getresgid                 372
-#define __NR_dipc                      373
-#define __NR_pivot_root                        374
-#define __NR_mincore                   375
-#define __NR_pciconfig_iobase          376
-#define __NR_getdents64                        377
-#define __NR_gettid                    378
-#define __NR_readahead                 379
-/* 380 is unused */
-#define __NR_tkill                     381
-#define __NR_setxattr                  382
-#define __NR_lsetxattr                 383
-#define __NR_fsetxattr                 384
-#define __NR_getxattr                  385
-#define __NR_lgetxattr                 386
-#define __NR_fgetxattr                 387
-#define __NR_listxattr                 388
-#define __NR_llistxattr                        389
-#define __NR_flistxattr                        390
-#define __NR_removexattr               391
-#define __NR_lremovexattr              392
-#define __NR_fremovexattr              393
-#define __NR_futex                     394
-#define __NR_sched_setaffinity         395     
-#define __NR_sched_getaffinity         396
-#define __NR_tuxcall                   397
-#define __NR_io_setup                  398
-#define __NR_io_destroy                        399
-#define __NR_io_getevents              400
-#define __NR_io_submit                 401
-#define __NR_io_cancel                 402
-#define __NR_exit_group                        405
-#define __NR_lookup_dcookie            406
-#define __NR_epoll_create              407
-#define __NR_epoll_ctl                 408
-#define __NR_epoll_wait                        409
-/* Feb 2007: These three sys_epoll defines shouldn't be here but culling
- * them would break userspace apps ... we'll kill them off in 2010 :) */
-#define __NR_sys_epoll_create          __NR_epoll_create
-#define __NR_sys_epoll_ctl             __NR_epoll_ctl
-#define __NR_sys_epoll_wait            __NR_epoll_wait
-#define __NR_remap_file_pages          410
-#define __NR_set_tid_address           411
-#define __NR_restart_syscall           412
-#define __NR_fadvise64                 413
-#define __NR_timer_create              414
-#define __NR_timer_settime             415
-#define __NR_timer_gettime             416
-#define __NR_timer_getoverrun          417
-#define __NR_timer_delete              418
-#define __NR_clock_settime             419
-#define __NR_clock_gettime             420
-#define __NR_clock_getres              421
-#define __NR_clock_nanosleep           422
-#define __NR_semtimedop                        423
-#define __NR_tgkill                    424
-#define __NR_stat64                    425
-#define __NR_lstat64                   426
-#define __NR_fstat64                   427
-#define __NR_vserver                   428
-#define __NR_mbind                     429
-#define __NR_get_mempolicy             430
-#define __NR_set_mempolicy             431
-#define __NR_mq_open                   432
-#define __NR_mq_unlink                 433
-#define __NR_mq_timedsend              434
-#define __NR_mq_timedreceive           435
-#define __NR_mq_notify                 436
-#define __NR_mq_getsetattr             437
-#define __NR_waitid                    438
-#define __NR_add_key                   439
-#define __NR_request_key               440
-#define __NR_keyctl                    441
-#define __NR_ioprio_set                        442
-#define __NR_ioprio_get                        443
-#define __NR_inotify_init              444
-#define __NR_inotify_add_watch         445
-#define __NR_inotify_rm_watch          446
-#define __NR_fdatasync                 447
-#define __NR_kexec_load                        448
-#define __NR_migrate_pages             449
-#define __NR_openat                    450
-#define __NR_mkdirat                   451
-#define __NR_mknodat                   452
-#define __NR_fchownat                  453
-#define __NR_futimesat                 454
-#define __NR_fstatat64                 455
-#define __NR_unlinkat                  456
-#define __NR_renameat                  457
-#define __NR_linkat                    458
-#define __NR_symlinkat                 459
-#define __NR_readlinkat                        460
-#define __NR_fchmodat                  461
-#define __NR_faccessat                 462
-#define __NR_pselect6                  463
-#define __NR_ppoll                     464
-#define __NR_unshare                   465
-#define __NR_set_robust_list           466
-#define __NR_get_robust_list           467
-#define __NR_splice                    468
-#define __NR_sync_file_range           469
-#define __NR_tee                       470
-#define __NR_vmsplice                  471
-#define __NR_move_pages                        472
-#define __NR_getcpu                    473
-#define __NR_epoll_pwait               474
-#define __NR_utimensat                 475
-#define __NR_signalfd                  476
-#define __NR_timerfd                   477
-#define __NR_eventfd                   478
-
-#ifdef __KERNEL__
-
-#define NR_SYSCALLS                    479
-
-#define __ARCH_WANT_IPC_PARSE_VERSION
-#define __ARCH_WANT_OLD_READDIR
-#define __ARCH_WANT_STAT64
-#define __ARCH_WANT_SYS_GETHOSTNAME
-#define __ARCH_WANT_SYS_FADVISE64
-#define __ARCH_WANT_SYS_GETPGRP
-#define __ARCH_WANT_SYS_OLD_GETRLIMIT
-#define __ARCH_WANT_SYS_OLDUMOUNT
-#define __ARCH_WANT_SYS_SIGPENDING
-
-/* "Conditional" syscalls.  What we want is
-
-       __attribute__((weak,alias("sys_ni_syscall")))
-
-   but that raises the problem of what type to give the symbol.  If we use
-   a prototype, it'll conflict with the definition given in this file and
-   others.  If we use __typeof, we discover that not all symbols actually
-   have declarations.  If we use no prototype, then we get warnings from
-   -Wstrict-prototypes.  Ho hum.  */
-
-#define cond_syscall(x)  asm(".weak\t" #x "\n" #x " = sys_ni_syscall")
-
-#endif /* __KERNEL__ */
-#endif /* _ALPHA_UNISTD_H */
diff --git a/include/asm-alpha/user.h b/include/asm-alpha/user.h
deleted file mode 100644 (file)
index a4eb6a4..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef _ALPHA_USER_H
-#define _ALPHA_USER_H
-
-#include <linux/sched.h>
-#include <linux/ptrace.h>
-
-#include <asm/page.h>
-#include <asm/reg.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, NOT the osf-core).  The file contents
- * are as follows:
- *
- *  upage: 1 page consisting of a user struct that tells gdb
- *     what is present in the file.  Directly after this is a
- *     copy of the task_struct, which is currently not used by gdb,
- *     but it may come in handy at some point.  All of the registers
- *     are stored as part of the upage.  The upage should always be
- *     only one page long.
- *  data: The data segment follows next.  We use current->end_text to
- *     current->brk to pick up all of the user variables, plus any memory
- *     that may have been sbrk'ed.  No attempt is made to determine if a
- *     page is demand-zero or if a page is totally unused, we just cover
- *     the entire range.  All of the addresses are rounded in such a way
- *     that an integral number of pages is written.
- *  stack: We need the stack information in order to get a meaningful
- *     backtrace.  We need to write the data from usp to
- *     current->start_stack, so we round each of these in order to be able
- *     to write an integer number of pages.
- */
-struct user {
-       unsigned long   regs[EF_SIZE/8+32];     /* integer and fp regs */
-       size_t          u_tsize;                /* text size (pages) */
-       size_t          u_dsize;                /* data size (pages) */
-       size_t          u_ssize;                /* stack size (pages) */
-       unsigned long   start_code;             /* text starting address */
-       unsigned long   start_data;             /* data starting address */
-       unsigned long   start_stack;            /* stack starting address */
-       long int        signal;                 /* signal causing core dump */
-       unsigned long   u_ar0;                  /* help gdb find registers */
-       unsigned long   magic;                  /* identifies a core file */
-       char            u_comm[32];             /* user command name */
-};
-
-#define NBPG                   PAGE_SIZE
-#define UPAGES                 1
-#define HOST_TEXT_START_ADDR   (u.start_code)
-#define HOST_DATA_START_ADDR   (u.start_data)
-#define HOST_STACK_END_ADDR    (u.start_stack + u.u_ssize * NBPG)
-
-#endif /* _ALPHA_USER_H */
diff --git a/include/asm-alpha/vga.h b/include/asm-alpha/vga.h
deleted file mode 100644 (file)
index c00106b..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *     Access to VGA videoram
- *
- *     (c) 1998 Martin Mares <mj@ucw.cz>
- */
-
-#ifndef _LINUX_ASM_VGA_H_
-#define _LINUX_ASM_VGA_H_
-
-#include <asm/io.h>
-
-#define VT_BUF_HAVE_RW
-#define VT_BUF_HAVE_MEMSETW
-#define VT_BUF_HAVE_MEMCPYW
-
-static inline void scr_writew(u16 val, volatile u16 *addr)
-{
-       if (__is_ioaddr(addr))
-               __raw_writew(val, (volatile u16 __iomem *) addr);
-       else
-               *addr = val;
-}
-
-static inline u16 scr_readw(volatile const u16 *addr)
-{
-       if (__is_ioaddr(addr))
-               return __raw_readw((volatile const u16 __iomem *) addr);
-       else
-               return *addr;
-}
-
-static inline void scr_memsetw(u16 *s, u16 c, unsigned int count)
-{
-       if (__is_ioaddr(s))
-               memsetw_io((u16 __iomem *) s, c, count);
-       else
-               memsetw(s, c, count);
-}
-
-/* Do not trust that the usage will be correct; analyze the arguments.  */
-extern void scr_memcpyw(u16 *d, const u16 *s, unsigned int count);
-
-/* ??? These are currently only used for downloading character sets.  As
-   such, they don't need memory barriers.  Is this all they are intended
-   to be used for?  */
-#define vga_readb(a)   readb((u8 __iomem *)(a))
-#define vga_writeb(v,a)        writeb(v, (u8 __iomem *)(a))
-
-#ifdef CONFIG_VGA_HOSE
-#include <linux/ioport.h>
-#include <linux/pci.h>
-
-extern struct pci_controller *pci_vga_hose;
-
-# define __is_port_vga(a)       \
-       (((a) >= 0x3b0) && ((a) < 0x3e0) && \
-        ((a) != 0x3b3) && ((a) != 0x3d3))
-
-# define __is_mem_vga(a) \
-       (((a) >= 0xa0000) && ((a) <= 0xc0000))
-
-# define FIXUP_IOADDR_VGA(a) do {                       \
-       if (pci_vga_hose && __is_port_vga(a))     \
-               (a) += pci_vga_hose->io_space->start;     \
- } while(0)
-
-# define FIXUP_MEMADDR_VGA(a) do {                       \
-       if (pci_vga_hose && __is_mem_vga(a))     \
-               (a) += pci_vga_hose->mem_space->start; \
- } while(0)
-
-#else /* CONFIG_VGA_HOSE */
-# define pci_vga_hose 0
-# define __is_port_vga(a) 0
-# define __is_mem_vga(a) 0
-# define FIXUP_IOADDR_VGA(a)
-# define FIXUP_MEMADDR_VGA(a)
-#endif /* CONFIG_VGA_HOSE */
-
-#define VGA_MAP_MEM(x,s)       ((unsigned long) ioremap(x, s))
-
-#endif
diff --git a/include/asm-alpha/xor.h b/include/asm-alpha/xor.h
deleted file mode 100644 (file)
index 5ee1c2b..0000000
+++ /dev/null
@@ -1,855 +0,0 @@
-/*
- * include/asm-alpha/xor.h
- *
- * Optimized RAID-5 checksumming functions for alpha EV5 and EV6
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * (for example /usr/src/linux/COPYING); if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-extern void xor_alpha_2(unsigned long, unsigned long *, unsigned long *);
-extern void xor_alpha_3(unsigned long, unsigned long *, unsigned long *,
-                       unsigned long *);
-extern void xor_alpha_4(unsigned long, unsigned long *, unsigned long *,
-                       unsigned long *, unsigned long *);
-extern void xor_alpha_5(unsigned long, unsigned long *, unsigned long *,
-                       unsigned long *, unsigned long *, unsigned long *);
-
-extern void xor_alpha_prefetch_2(unsigned long, unsigned long *,
-                                unsigned long *);
-extern void xor_alpha_prefetch_3(unsigned long, unsigned long *,
-                                unsigned long *, unsigned long *);
-extern void xor_alpha_prefetch_4(unsigned long, unsigned long *,
-                                unsigned long *, unsigned long *,
-                                unsigned long *);
-extern void xor_alpha_prefetch_5(unsigned long, unsigned long *,
-                                unsigned long *, unsigned long *,
-                                unsigned long *, unsigned long *);
-
-asm("                                                          \n\
-       .text                                                   \n\
-       .align 3                                                \n\
-       .ent xor_alpha_2                                        \n\
-xor_alpha_2:                                                   \n\
-       .prologue 0                                             \n\
-       srl $16, 6, $16                                         \n\
-       .align 4                                                \n\
-2:                                                             \n\
-       ldq $0,0($17)                                           \n\
-       ldq $1,0($18)                                           \n\
-       ldq $2,8($17)                                           \n\
-       ldq $3,8($18)                                           \n\
-                                                               \n\
-       ldq $4,16($17)                                          \n\
-       ldq $5,16($18)                                          \n\
-       ldq $6,24($17)                                          \n\
-       ldq $7,24($18)                                          \n\
-                                                               \n\
-       ldq $19,32($17)                                         \n\
-       ldq $20,32($18)                                         \n\
-       ldq $21,40($17)                                         \n\
-       ldq $22,40($18)                                         \n\
-                                                               \n\
-       ldq $23,48($17)                                         \n\
-       ldq $24,48($18)                                         \n\
-       ldq $25,56($17)                                         \n\
-       xor $0,$1,$0            # 7 cycles from $1 load         \n\
-                                                               \n\
-       ldq $27,56($18)                                         \n\
-       xor $2,$3,$2                                            \n\
-       stq $0,0($17)                                           \n\
-       xor $4,$5,$4                                            \n\
-                                                               \n\
-       stq $2,8($17)                                           \n\
-       xor $6,$7,$6                                            \n\
-       stq $4,16($17)                                          \n\
-       xor $19,$20,$19                                         \n\
-                                                               \n\
-       stq $6,24($17)                                          \n\
-       xor $21,$22,$21                                         \n\
-       stq $19,32($17)                                         \n\
-       xor $23,$24,$23                                         \n\
-                                                               \n\
-       stq $21,40($17)                                         \n\
-       xor $25,$27,$25                                         \n\
-       stq $23,48($17)                                         \n\
-       subq $16,1,$16                                          \n\
-                                                               \n\
-       stq $25,56($17)                                         \n\
-       addq $17,64,$17                                         \n\
-       addq $18,64,$18                                         \n\
-       bgt $16,2b                                              \n\
-                                                               \n\
-       ret                                                     \n\
-       .end xor_alpha_2                                        \n\
-                                                               \n\
-       .align 3                                                \n\
-       .ent xor_alpha_3                                        \n\
-xor_alpha_3:                                                   \n\
-       .prologue 0                                             \n\
-       srl $16, 6, $16                                         \n\
-       .align 4                                                \n\
-3:                                                             \n\
-       ldq $0,0($17)                                           \n\
-       ldq $1,0($18)                                           \n\
-       ldq $2,0($19)                                           \n\
-       ldq $3,8($17)                                           \n\
-                                                               \n\
-       ldq $4,8($18)                                           \n\
-       ldq $6,16($17)                                          \n\
-       ldq $7,16($18)                                          \n\
-       ldq $21,24($17)                                         \n\
-                                                               \n\
-       ldq $22,24($18)                                         \n\
-       ldq $24,32($17)                                         \n\
-       ldq $25,32($18)                                         \n\
-       ldq $5,8($19)                                           \n\
-                                                               \n\
-       ldq $20,16($19)                                         \n\
-       ldq $23,24($19)                                         \n\
-       ldq $27,32($19)                                         \n\
-       nop                                                     \n\
-                                                               \n\
-       xor $0,$1,$1            # 8 cycles from $0 load         \n\
-       xor $3,$4,$4            # 6 cycles from $4 load         \n\
-       xor $6,$7,$7            # 6 cycles from $7 load         \n\
-       xor $21,$22,$22         # 5 cycles from $22 load        \n\
-                                                               \n\
-       xor $1,$2,$2            # 9 cycles from $2 load         \n\
-       xor $24,$25,$25         # 5 cycles from $25 load        \n\
-       stq $2,0($17)                                           \n\
-       xor $4,$5,$5            # 6 cycles from $5 load         \n\
-                                                               \n\
-       stq $5,8($17)                                           \n\
-       xor $7,$20,$20          # 7 cycles from $20 load        \n\
-       stq $20,16($17)                                         \n\
-       xor $22,$23,$23         # 7 cycles from $23 load        \n\
-                                                               \n\
-       stq $23,24($17)                                         \n\
-       xor $25,$27,$27         # 7 cycles from $27 load        \n\
-       stq $27,32($17)                                         \n\
-       nop                                                     \n\
-                                                               \n\
-       ldq $0,40($17)                                          \n\
-       ldq $1,40($18)                                          \n\
-       ldq $3,48($17)                                          \n\
-       ldq $4,48($18)                                          \n\
-                                                               \n\
-       ldq $6,56($17)                                          \n\
-       ldq $7,56($18)                                          \n\
-       ldq $2,40($19)                                          \n\
-       ldq $5,48($19)                                          \n\
-                                                               \n\
-       ldq $20,56($19)                                         \n\
-       xor $0,$1,$1            # 4 cycles from $1 load         \n\
-       xor $3,$4,$4            # 5 cycles from $4 load         \n\
-       xor $6,$7,$7            # 5 cycles from $7 load         \n\
-                                                               \n\
-       xor $1,$2,$2            # 4 cycles from $2 load         \n\
-       xor $4,$5,$5            # 5 cycles from $5 load         \n\
-       stq $2,40($17)                                          \n\
-       xor $7,$20,$20          # 4 cycles from $20 load        \n\
-                                                               \n\
-       stq $5,48($17)                                          \n\
-       subq $16,1,$16                                          \n\
-       stq $20,56($17)                                         \n\
-       addq $19,64,$19                                         \n\
-                                                               \n\
-       addq $18,64,$18                                         \n\
-       addq $17,64,$17                                         \n\
-       bgt $16,3b                                              \n\
-       ret                                                     \n\
-       .end xor_alpha_3                                        \n\
-                                                               \n\
-       .align 3                                                \n\
-       .ent xor_alpha_4                                        \n\
-xor_alpha_4:                                                   \n\
-       .prologue 0                                             \n\
-       srl $16, 6, $16                                         \n\
-       .align 4                                                \n\
-4:                                                             \n\
-       ldq $0,0($17)                                           \n\
-       ldq $1,0($18)                                           \n\
-       ldq $2,0($19)                                           \n\
-       ldq $3,0($20)                                           \n\
-                                                               \n\
-       ldq $4,8($17)                                           \n\
-       ldq $5,8($18)                                           \n\
-       ldq $6,8($19)                                           \n\
-       ldq $7,8($20)                                           \n\
-                                                               \n\
-       ldq $21,16($17)                                         \n\
-       ldq $22,16($18)                                         \n\
-       ldq $23,16($19)                                         \n\
-       ldq $24,16($20)                                         \n\
-                                                               \n\
-       ldq $25,24($17)                                         \n\
-       xor $0,$1,$1            # 6 cycles from $1 load         \n\
-       ldq $27,24($18)                                         \n\
-       xor $2,$3,$3            # 6 cycles from $3 load         \n\
-                                                               \n\
-       ldq $0,24($19)                                          \n\
-       xor $1,$3,$3                                            \n\
-       ldq $1,24($20)                                          \n\
-       xor $4,$5,$5            # 7 cycles from $5 load         \n\
-                                                               \n\
-       stq $3,0($17)                                           \n\
-       xor $6,$7,$7                                            \n\
-       xor $21,$22,$22         # 7 cycles from $22 load        \n\
-       xor $5,$7,$7                                            \n\
-                                                               \n\
-       stq $7,8($17)                                           \n\
-       xor $23,$24,$24         # 7 cycles from $24 load        \n\
-       ldq $2,32($17)                                          \n\
-       xor $22,$24,$24                                         \n\
-                                                               \n\
-       ldq $3,32($18)                                          \n\
-       ldq $4,32($19)                                          \n\
-       ldq $5,32($20)                                          \n\
-       xor $25,$27,$27         # 8 cycles from $27 load        \n\
-                                                               \n\
-       ldq $6,40($17)                                          \n\
-       ldq $7,40($18)                                          \n\
-       ldq $21,40($19)                                         \n\
-       ldq $22,40($20)                                         \n\
-                                                               \n\
-       stq $24,16($17)                                         \n\
-       xor $0,$1,$1            # 9 cycles from $1 load         \n\
-       xor $2,$3,$3            # 5 cycles from $3 load         \n\
-       xor $27,$1,$1                                           \n\
-                                                               \n\
-       stq $1,24($17)                                          \n\
-       xor $4,$5,$5            # 5 cycles from $5 load         \n\
-       ldq $23,48($17)                                         \n\
-       ldq $24,48($18)                                         \n\
-                                                               \n\
-       ldq $25,48($19)                                         \n\
-       xor $3,$5,$5                                            \n\
-       ldq $27,48($20)                                         \n\
-       ldq $0,56($17)                                          \n\
-                                                               \n\
-       ldq $1,56($18)                                          \n\
-       ldq $2,56($19)                                          \n\
-       xor $6,$7,$7            # 8 cycles from $6 load         \n\
-       ldq $3,56($20)                                          \n\
-                                                               \n\
-       stq $5,32($17)                                          \n\
-       xor $21,$22,$22         # 8 cycles from $22 load        \n\
-       xor $7,$22,$22                                          \n\
-       xor $23,$24,$24         # 5 cycles from $24 load        \n\
-                                                               \n\
-       stq $22,40($17)                                         \n\
-       xor $25,$27,$27         # 5 cycles from $27 load        \n\
-       xor $24,$27,$27                                         \n\
-       xor $0,$1,$1            # 5 cycles from $1 load         \n\
-                                                               \n\
-       stq $27,48($17)                                         \n\
-       xor $2,$3,$3            # 4 cycles from $3 load         \n\
-       xor $1,$3,$3                                            \n\
-       subq $16,1,$16                                          \n\
-                                                               \n\
-       stq $3,56($17)                                          \n\
-       addq $20,64,$20                                         \n\
-       addq $19,64,$19                                         \n\
-       addq $18,64,$18                                         \n\
-                                                               \n\
-       addq $17,64,$17                                         \n\
-       bgt $16,4b                                              \n\
-       ret                                                     \n\
-       .end xor_alpha_4                                        \n\
-                                                               \n\
-       .align 3                                                \n\
-       .ent xor_alpha_5                                        \n\
-xor_alpha_5:                                                   \n\
-       .prologue 0                                             \n\
-       srl $16, 6, $16                                         \n\
-       .align 4                                                \n\
-5:                                                             \n\
-       ldq $0,0($17)                                           \n\
-       ldq $1,0($18)                                           \n\
-       ldq $2,0($19)                                           \n\
-       ldq $3,0($20)                                           \n\
-                                                               \n\
-       ldq $4,0($21)                                           \n\
-       ldq $5,8($17)                                           \n\
-       ldq $6,8($18)                                           \n\
-       ldq $7,8($19)                                           \n\
-                                                               \n\
-       ldq $22,8($20)                                          \n\
-       ldq $23,8($21)                                          \n\
-       ldq $24,16($17)                                         \n\
-       ldq $25,16($18)                                         \n\
-                                                               \n\
-       ldq $27,16($19)                                         \n\
-       xor $0,$1,$1            # 6 cycles from $1 load         \n\
-       ldq $28,16($20)                                         \n\
-       xor $2,$3,$3            # 6 cycles from $3 load         \n\
-                                                               \n\
-       ldq $0,16($21)                                          \n\
-       xor $1,$3,$3                                            \n\
-       ldq $1,24($17)                                          \n\
-       xor $3,$4,$4            # 7 cycles from $4 load         \n\
-                                                               \n\
-       stq $4,0($17)                                           \n\
-       xor $5,$6,$6            # 7 cycles from $6 load         \n\
-       xor $7,$22,$22          # 7 cycles from $22 load        \n\
-       xor $6,$23,$23          # 7 cycles from $23 load        \n\
-                                                               \n\
-       ldq $2,24($18)                                          \n\
-       xor $22,$23,$23                                         \n\
-       ldq $3,24($19)                                          \n\
-       xor $24,$25,$25         # 8 cycles from $25 load        \n\
-                                                               \n\
-       stq $23,8($17)                                          \n\
-       xor $25,$27,$27         # 8 cycles from $27 load        \n\
-       ldq $4,24($20)                                          \n\
-       xor $28,$0,$0           # 7 cycles from $0 load         \n\
-                                                               \n\
-       ldq $5,24($21)                                          \n\
-       xor $27,$0,$0                                           \n\
-       ldq $6,32($17)                                          \n\
-       ldq $7,32($18)                                          \n\
-                                                               \n\
-       stq $0,16($17)                                          \n\
-       xor $1,$2,$2            # 6 cycles from $2 load         \n\
-       ldq $22,32($19)                                         \n\
-       xor $3,$4,$4            # 4 cycles from $4 load         \n\
-                                                               \n\
-       ldq $23,32($20)                                         \n\
-       xor $2,$4,$4                                            \n\
-       ldq $24,32($21)                                         \n\
-       ldq $25,40($17)                                         \n\
-                                                               \n\
-       ldq $27,40($18)                                         \n\
-       ldq $28,40($19)                                         \n\
-       ldq $0,40($20)                                          \n\
-       xor $4,$5,$5            # 7 cycles from $5 load         \n\
-                                                               \n\
-       stq $5,24($17)                                          \n\
-       xor $6,$7,$7            # 7 cycles from $7 load         \n\
-       ldq $1,40($21)                                          \n\
-       ldq $2,48($17)                                          \n\
-                                                               \n\
-       ldq $3,48($18)                                          \n\
-       xor $7,$22,$22          # 7 cycles from $22 load        \n\
-       ldq $4,48($19)                                          \n\
-       xor $23,$24,$24         # 6 cycles from $24 load        \n\
-                                                               \n\
-       ldq $5,48($20)                                          \n\
-       xor $22,$24,$24                                         \n\
-       ldq $6,48($21)                                          \n\
-       xor $25,$27,$27         # 7 cycles from $27 load        \n\
-                                                               \n\
-       stq $24,32($17)                                         \n\
-       xor $27,$28,$28         # 8 cycles from $28 load        \n\
-       ldq $7,56($17)                                          \n\
-       xor $0,$1,$1            # 6 cycles from $1 load         \n\
-                                                               \n\
-       ldq $22,56($18)                                         \n\
-       ldq $23,56($19)                                         \n\
-       ldq $24,56($20)                                         \n\
-       ldq $25,56($21)                                         \n\
-                                                               \n\
-       xor $28,$1,$1                                           \n\
-       xor $2,$3,$3            # 9 cycles from $3 load         \n\
-       xor $3,$4,$4            # 9 cycles from $4 load         \n\
-       xor $5,$6,$6            # 8 cycles from $6 load         \n\
-                                                               \n\
-       stq $1,40($17)                                          \n\
-       xor $4,$6,$6                                            \n\
-       xor $7,$22,$22          # 7 cycles from $22 load        \n\
-       xor $23,$24,$24         # 6 cycles from $24 load        \n\
-                                                               \n\
-       stq $6,48($17)                                          \n\
-       xor $22,$24,$24                                         \n\
-       subq $16,1,$16                                          \n\
-       xor $24,$25,$25         # 8 cycles from $25 load        \n\
-                                                               \n\
-       stq $25,56($17)                                         \n\
-       addq $21,64,$21                                         \n\
-       addq $20,64,$20                                         \n\
-       addq $19,64,$19                                         \n\
-                                                               \n\
-       addq $18,64,$18                                         \n\
-       addq $17,64,$17                                         \n\
-       bgt $16,5b                                              \n\
-       ret                                                     \n\
-       .end xor_alpha_5                                        \n\
-                                                               \n\
-       .align 3                                                \n\
-       .ent xor_alpha_prefetch_2                               \n\
-xor_alpha_prefetch_2:                                          \n\
-       .prologue 0                                             \n\
-       srl $16, 6, $16                                         \n\
-                                                               \n\
-       ldq $31, 0($17)                                         \n\
-       ldq $31, 0($18)                                         \n\
-                                                               \n\
-       ldq $31, 64($17)                                        \n\
-       ldq $31, 64($18)                                        \n\
-                                                               \n\
-       ldq $31, 128($17)                                       \n\
-       ldq $31, 128($18)                                       \n\
-                                                               \n\
-       ldq $31, 192($17)                                       \n\
-       ldq $31, 192($18)                                       \n\
-       .align 4                                                \n\
-2:                                                             \n\
-       ldq $0,0($17)                                           \n\
-       ldq $1,0($18)                                           \n\
-       ldq $2,8($17)                                           \n\
-       ldq $3,8($18)                                           \n\
-                                                               \n\
-       ldq $4,16($17)                                          \n\
-       ldq $5,16($18)                                          \n\
-       ldq $6,24($17)                                          \n\
-       ldq $7,24($18)                                          \n\
-                                                               \n\
-       ldq $19,32($17)                                         \n\
-       ldq $20,32($18)                                         \n\
-       ldq $21,40($17)                                         \n\
-       ldq $22,40($18)                                         \n\
-                                                               \n\
-       ldq $23,48($17)                                         \n\
-       ldq $24,48($18)                                         \n\
-       ldq $25,56($17)                                         \n\
-       ldq $27,56($18)                                         \n\
-                                                               \n\
-       ldq $31,256($17)                                        \n\
-       xor $0,$1,$0            # 8 cycles from $1 load         \n\
-       ldq $31,256($18)                                        \n\
-       xor $2,$3,$2                                            \n\
-                                                               \n\
-       stq $0,0($17)                                           \n\
-       xor $4,$5,$4                                            \n\
-       stq $2,8($17)                                           \n\
-       xor $6,$7,$6                                            \n\
-                                                               \n\
-       stq $4,16($17)                                          \n\
-       xor $19,$20,$19                                         \n\
-       stq $6,24($17)                                          \n\
-       xor $21,$22,$21                                         \n\
-                                                               \n\
-       stq $19,32($17)                                         \n\
-       xor $23,$24,$23                                         \n\
-       stq $21,40($17)                                         \n\
-       xor $25,$27,$25                                         \n\
-                                                               \n\
-       stq $23,48($17)                                         \n\
-       subq $16,1,$16                                          \n\
-       stq $25,56($17)                                         \n\
-       addq $17,64,$17                                         \n\
-                                                               \n\
-       addq $18,64,$18                                         \n\
-       bgt $16,2b                                              \n\
-       ret                                                     \n\
-       .end xor_alpha_prefetch_2                               \n\
-                                                               \n\
-       .align 3                                                \n\
-       .ent xor_alpha_prefetch_3                               \n\
-xor_alpha_prefetch_3:                                          \n\
-       .prologue 0                                             \n\
-       srl $16, 6, $16                                         \n\
-                                                               \n\
-       ldq $31, 0($17)                                         \n\
-       ldq $31, 0($18)                                         \n\
-       ldq $31, 0($19)                                         \n\
-                                                               \n\
-       ldq $31, 64($17)                                        \n\
-       ldq $31, 64($18)                                        \n\
-       ldq $31, 64($19)                                        \n\
-                                                               \n\
-       ldq $31, 128($17)                                       \n\
-       ldq $31, 128($18)                                       \n\
-       ldq $31, 128($19)                                       \n\
-                                                               \n\
-       ldq $31, 192($17)                                       \n\
-       ldq $31, 192($18)                                       \n\
-       ldq $31, 192($19)                                       \n\
-       .align 4                                                \n\
-3:                                                             \n\
-       ldq $0,0($17)                                           \n\
-       ldq $1,0($18)                                           \n\
-       ldq $2,0($19)                                           \n\
-       ldq $3,8($17)                                           \n\
-                                                               \n\
-       ldq $4,8($18)                                           \n\
-       ldq $6,16($17)                                          \n\
-       ldq $7,16($18)                                          \n\
-       ldq $21,24($17)                                         \n\
-                                                               \n\
-       ldq $22,24($18)                                         \n\
-       ldq $24,32($17)                                         \n\
-       ldq $25,32($18)                                         \n\
-       ldq $5,8($19)                                           \n\
-                                                               \n\
-       ldq $20,16($19)                                         \n\
-       ldq $23,24($19)                                         \n\
-       ldq $27,32($19)                                         \n\
-       nop                                                     \n\
-                                                               \n\
-       xor $0,$1,$1            # 8 cycles from $0 load         \n\
-       xor $3,$4,$4            # 7 cycles from $4 load         \n\
-       xor $6,$7,$7            # 6 cycles from $7 load         \n\
-       xor $21,$22,$22         # 5 cycles from $22 load        \n\
-                                                               \n\
-       xor $1,$2,$2            # 9 cycles from $2 load         \n\
-       xor $24,$25,$25         # 5 cycles from $25 load        \n\
-       stq $2,0($17)                                           \n\
-       xor $4,$5,$5            # 6 cycles from $5 load         \n\
-                                                               \n\
-       stq $5,8($17)                                           \n\
-       xor $7,$20,$20          # 7 cycles from $20 load        \n\
-       stq $20,16($17)                                         \n\
-       xor $22,$23,$23         # 7 cycles from $23 load        \n\
-                                                               \n\
-       stq $23,24($17)                                         \n\
-       xor $25,$27,$27         # 7 cycles from $27 load        \n\
-       stq $27,32($17)                                         \n\
-       nop                                                     \n\
-                                                               \n\
-       ldq $0,40($17)                                          \n\
-       ldq $1,40($18)                                          \n\
-       ldq $3,48($17)                                          \n\
-       ldq $4,48($18)                                          \n\
-                                                               \n\
-       ldq $6,56($17)                                          \n\
-       ldq $7,56($18)                                          \n\
-       ldq $2,40($19)                                          \n\
-       ldq $5,48($19)                                          \n\
-                                                               \n\
-       ldq $20,56($19)                                         \n\
-       ldq $31,256($17)                                        \n\
-       ldq $31,256($18)                                        \n\
-       ldq $31,256($19)                                        \n\
-                                                               \n\
-       xor $0,$1,$1            # 6 cycles from $1 load         \n\
-       xor $3,$4,$4            # 5 cycles from $4 load         \n\
-       xor $6,$7,$7            # 5 cycles from $7 load         \n\
-       xor $1,$2,$2            # 4 cycles from $2 load         \n\
-                                                               \n\
-       xor $4,$5,$5            # 5 cycles from $5 load         \n\
-       xor $7,$20,$20          # 4 cycles from $20 load        \n\
-       stq $2,40($17)                                          \n\
-       subq $16,1,$16                                          \n\
-                                                               \n\
-       stq $5,48($17)                                          \n\
-       addq $19,64,$19                                         \n\
-       stq $20,56($17)                                         \n\
-       addq $18,64,$18                                         \n\
-                                                               \n\
-       addq $17,64,$17                                         \n\
-       bgt $16,3b                                              \n\
-       ret                                                     \n\
-       .end xor_alpha_prefetch_3                               \n\
-                                                               \n\
-       .align 3                                                \n\
-       .ent xor_alpha_prefetch_4                               \n\
-xor_alpha_prefetch_4:                                          \n\
-       .prologue 0                                             \n\
-       srl $16, 6, $16                                         \n\
-                                                               \n\
-       ldq $31, 0($17)                                         \n\
-       ldq $31, 0($18)                                         \n\
-       ldq $31, 0($19)                                         \n\
-       ldq $31, 0($20)                                         \n\
-                                                               \n\
-       ldq $31, 64($17)                                        \n\
-       ldq $31, 64($18)                                        \n\
-       ldq $31, 64($19)                                        \n\
-       ldq $31, 64($20)                                        \n\
-                                                               \n\
-       ldq $31, 128($17)                                       \n\
-       ldq $31, 128($18)                                       \n\
-       ldq $31, 128($19)                                       \n\
-       ldq $31, 128($20)                                       \n\
-                                                               \n\
-       ldq $31, 192($17)                                       \n\
-       ldq $31, 192($18)                                       \n\
-       ldq $31, 192($19)                                       \n\
-       ldq $31, 192($20)                                       \n\
-       .align 4                                                \n\
-4:                                                             \n\
-       ldq $0,0($17)                                           \n\
-       ldq $1,0($18)                                           \n\
-       ldq $2,0($19)                                           \n\
-       ldq $3,0($20)                                           \n\
-                                                               \n\
-       ldq $4,8($17)                                           \n\
-       ldq $5,8($18)                                           \n\
-       ldq $6,8($19)                                           \n\
-       ldq $7,8($20)                                           \n\
-                                                               \n\
-       ldq $21,16($17)                                         \n\
-       ldq $22,16($18)                                         \n\
-       ldq $23,16($19)                                         \n\
-       ldq $24,16($20)                                         \n\
-                                                               \n\
-       ldq $25,24($17)                                         \n\
-       xor $0,$1,$1            # 6 cycles from $1 load         \n\
-       ldq $27,24($18)                                         \n\
-       xor $2,$3,$3            # 6 cycles from $3 load         \n\
-                                                               \n\
-       ldq $0,24($19)                                          \n\
-       xor $1,$3,$3                                            \n\
-       ldq $1,24($20)                                          \n\
-       xor $4,$5,$5            # 7 cycles from $5 load         \n\
-                                                               \n\
-       stq $3,0($17)                                           \n\
-       xor $6,$7,$7                                            \n\
-       xor $21,$22,$22         # 7 cycles from $22 load        \n\
-       xor $5,$7,$7                                            \n\
-                                                               \n\
-       stq $7,8($17)                                           \n\
-       xor $23,$24,$24         # 7 cycles from $24 load        \n\
-       ldq $2,32($17)                                          \n\
-       xor $22,$24,$24                                         \n\
-                                                               \n\
-       ldq $3,32($18)                                          \n\
-       ldq $4,32($19)                                          \n\
-       ldq $5,32($20)                                          \n\
-       xor $25,$27,$27         # 8 cycles from $27 load        \n\
-                                                               \n\
-       ldq $6,40($17)                                          \n\
-       ldq $7,40($18)                                          \n\
-       ldq $21,40($19)                                         \n\
-       ldq $22,40($20)                                         \n\
-                                                               \n\
-       stq $24,16($17)                                         \n\
-       xor $0,$1,$1            # 9 cycles from $1 load         \n\
-       xor $2,$3,$3            # 5 cycles from $3 load         \n\
-       xor $27,$1,$1                                           \n\
-                                                               \n\
-       stq $1,24($17)                                          \n\
-       xor $4,$5,$5            # 5 cycles from $5 load         \n\
-       ldq $23,48($17)                                         \n\
-       xor $3,$5,$5                                            \n\
-                                                               \n\
-       ldq $24,48($18)                                         \n\
-       ldq $25,48($19)                                         \n\
-       ldq $27,48($20)                                         \n\
-       ldq $0,56($17)                                          \n\
-                                                               \n\
-       ldq $1,56($18)                                          \n\
-       ldq $2,56($19)                                          \n\
-       ldq $3,56($20)                                          \n\
-       xor $6,$7,$7            # 8 cycles from $6 load         \n\
-                                                               \n\
-       ldq $31,256($17)                                        \n\
-       xor $21,$22,$22         # 8 cycles from $22 load        \n\
-       ldq $31,256($18)                                        \n\
-       xor $7,$22,$22                                          \n\
-                                                               \n\
-       ldq $31,256($19)                                        \n\
-       xor $23,$24,$24         # 6 cycles from $24 load        \n\
-       ldq $31,256($20)                                        \n\
-       xor $25,$27,$27         # 6 cycles from $27 load        \n\
-                                                               \n\
-       stq $5,32($17)                                          \n\
-       xor $24,$27,$27                                         \n\
-       xor $0,$1,$1            # 7 cycles from $1 load         \n\
-       xor $2,$3,$3            # 6 cycles from $3 load         \n\
-                                                               \n\
-       stq $22,40($17)                                         \n\
-       xor $1,$3,$3                                            \n\
-       stq $27,48($17)                                         \n\
-       subq $16,1,$16                                          \n\
-                                                               \n\
-       stq $3,56($17)                                          \n\
-       addq $20,64,$20                                         \n\
-       addq $19,64,$19                                         \n\
-       addq $18,64,$18                                         \n\
-                                                               \n\
-       addq $17,64,$17                                         \n\
-       bgt $16,4b                                              \n\
-       ret                                                     \n\
-       .end xor_alpha_prefetch_4                               \n\
-                                                               \n\
-       .align 3                                                \n\
-       .ent xor_alpha_prefetch_5                               \n\
-xor_alpha_prefetch_5:                                          \n\
-       .prologue 0                                             \n\
-       srl $16, 6, $16                                         \n\
-                                                               \n\
-       ldq $31, 0($17)                                         \n\
-       ldq $31, 0($18)                                         \n\
-       ldq $31, 0($19)                                         \n\
-       ldq $31, 0($20)                                         \n\
-       ldq $31, 0($21)                                         \n\
-                                                               \n\
-       ldq $31, 64($17)                                        \n\
-       ldq $31, 64($18)                                        \n\
-       ldq $31, 64($19)                                        \n\
-       ldq $31, 64($20)                                        \n\
-       ldq $31, 64($21)                                        \n\
-                                                               \n\
-       ldq $31, 128($17)                                       \n\
-       ldq $31, 128($18)                                       \n\
-       ldq $31, 128($19)                                       \n\
-       ldq $31, 128($20)                                       \n\
-       ldq $31, 128($21)                                       \n\
-                                                               \n\
-       ldq $31, 192($17)                                       \n\
-       ldq $31, 192($18)                                       \n\
-       ldq $31, 192($19)                                       \n\
-       ldq $31, 192($20)                                       \n\
-       ldq $31, 192($21)                                       \n\
-       .align 4                                                \n\
-5:                                                             \n\
-       ldq $0,0($17)                                           \n\
-       ldq $1,0($18)                                           \n\
-       ldq $2,0($19)                                           \n\
-       ldq $3,0($20)                                           \n\
-                                                               \n\
-       ldq $4,0($21)                                           \n\
-       ldq $5,8($17)                                           \n\
-       ldq $6,8($18)                                           \n\
-       ldq $7,8($19)                                           \n\
-                                                               \n\
-       ldq $22,8($20)                                          \n\
-       ldq $23,8($21)                                          \n\
-       ldq $24,16($17)                                         \n\
-       ldq $25,16($18)                                         \n\
-                                                               \n\
-       ldq $27,16($19)                                         \n\
-       xor $0,$1,$1            # 6 cycles from $1 load         \n\
-       ldq $28,16($20)                                         \n\
-       xor $2,$3,$3            # 6 cycles from $3 load         \n\
-                                                               \n\
-       ldq $0,16($21)                                          \n\
-       xor $1,$3,$3                                            \n\
-       ldq $1,24($17)                                          \n\
-       xor $3,$4,$4            # 7 cycles from $4 load         \n\
-                                                               \n\
-       stq $4,0($17)                                           \n\
-       xor $5,$6,$6            # 7 cycles from $6 load         \n\
-       xor $7,$22,$22          # 7 cycles from $22 load        \n\
-       xor $6,$23,$23          # 7 cycles from $23 load        \n\
-                                                               \n\
-       ldq $2,24($18)                                          \n\
-       xor $22,$23,$23                                         \n\
-       ldq $3,24($19)                                          \n\
-       xor $24,$25,$25         # 8 cycles from $25 load        \n\
-                                                               \n\
-       stq $23,8($17)                                          \n\
-       xor $25,$27,$27         # 8 cycles from $27 load        \n\
-       ldq $4,24($20)                                          \n\
-       xor $28,$0,$0           # 7 cycles from $0 load         \n\
-                                                               \n\
-       ldq $5,24($21)                                          \n\
-       xor $27,$0,$0                                           \n\
-       ldq $6,32($17)                                          \n\
-       ldq $7,32($18)                                          \n\
-                                                               \n\
-       stq $0,16($17)                                          \n\
-       xor $1,$2,$2            # 6 cycles from $2 load         \n\
-       ldq $22,32($19)                                         \n\
-       xor $3,$4,$4            # 4 cycles from $4 load         \n\
-                                                               \n\
-       ldq $23,32($20)                                         \n\
-       xor $2,$4,$4                                            \n\
-       ldq $24,32($21)                                         \n\
-       ldq $25,40($17)                                         \n\
-                                                               \n\
-       ldq $27,40($18)                                         \n\
-       ldq $28,40($19)                                         \n\
-       ldq $0,40($20)                                          \n\
-       xor $4,$5,$5            # 7 cycles from $5 load         \n\
-                                                               \n\
-       stq $5,24($17)                                          \n\
-       xor $6,$7,$7            # 7 cycles from $7 load         \n\
-       ldq $1,40($21)                                          \n\
-       ldq $2,48($17)                                          \n\
-                                                               \n\
-       ldq $3,48($18)                                          \n\
-       xor $7,$22,$22          # 7 cycles from $22 load        \n\
-       ldq $4,48($19)                                          \n\
-       xor $23,$24,$24         # 6 cycles from $24 load        \n\
-                                                               \n\
-       ldq $5,48($20)                                          \n\
-       xor $22,$24,$24                                         \n\
-       ldq $6,48($21)                                          \n\
-       xor $25,$27,$27         # 7 cycles from $27 load        \n\
-                                                               \n\
-       stq $24,32($17)                                         \n\
-       xor $27,$28,$28         # 8 cycles from $28 load        \n\
-       ldq $7,56($17)                                          \n\
-       xor $0,$1,$1            # 6 cycles from $1 load         \n\
-                                                               \n\
-       ldq $22,56($18)                                         \n\
-       ldq $23,56($19)                                         \n\
-       ldq $24,56($20)                                         \n\
-       ldq $25,56($21)                                         \n\
-                                                               \n\
-       ldq $31,256($17)                                        \n\
-       xor $28,$1,$1                                           \n\
-       ldq $31,256($18)                                        \n\
-       xor $2,$3,$3            # 9 cycles from $3 load         \n\
-                                                               \n\
-       ldq $31,256($19)                                        \n\
-       xor $3,$4,$4            # 9 cycles from $4 load         \n\
-       ldq $31,256($20)                                        \n\
-       xor $5,$6,$6            # 8 cycles from $6 load         \n\
-                                                               \n\
-       stq $1,40($17)                                          \n\
-       xor $4,$6,$6                                            \n\
-       xor $7,$22,$22          # 7 cycles from $22 load        \n\
-       xor $23,$24,$24         # 6 cycles from $24 load        \n\
-                                                               \n\
-       stq $6,48($17)                                          \n\
-       xor $22,$24,$24                                         \n\
-       ldq $31,256($21)                                        \n\
-       xor $24,$25,$25         # 8 cycles from $25 load        \n\
-                                                               \n\
-       stq $25,56($17)                                         \n\
-       subq $16,1,$16                                          \n\
-       addq $21,64,$21                                         \n\
-       addq $20,64,$20                                         \n\
-                                                               \n\
-       addq $19,64,$19                                         \n\
-       addq $18,64,$18                                         \n\
-       addq $17,64,$17                                         \n\
-       bgt $16,5b                                              \n\
-                                                               \n\
-       ret                                                     \n\
-       .end xor_alpha_prefetch_5                               \n\
-");
-
-static struct xor_block_template xor_block_alpha = {
-       .name   = "alpha",
-       .do_2   = xor_alpha_2,
-       .do_3   = xor_alpha_3,
-       .do_4   = xor_alpha_4,
-       .do_5   = xor_alpha_5,
-};
-
-static struct xor_block_template xor_block_alpha_prefetch = {
-       .name   = "alpha prefetch",
-       .do_2   = xor_alpha_prefetch_2,
-       .do_3   = xor_alpha_prefetch_3,
-       .do_4   = xor_alpha_prefetch_4,
-       .do_5   = xor_alpha_prefetch_5,
-};
-
-/* For grins, also test the generic routines.  */
-#include <asm-generic/xor.h>
-
-#undef XOR_TRY_TEMPLATES
-#define XOR_TRY_TEMPLATES                              \
-       do {                                            \
-               xor_speed(&xor_block_8regs);            \
-               xor_speed(&xor_block_32regs);           \
-               xor_speed(&xor_block_alpha);            \
-               xor_speed(&xor_block_alpha_prefetch);   \
-       } while (0)
-
-/* Force the use of alpha_prefetch if EV6, as it is significantly
-   faster in the cold cache case.  */
-#define XOR_SELECT_TEMPLATE(FASTEST) \
-       (implver() == IMPLVER_EV6 ? &xor_block_alpha_prefetch : FASTEST)
diff --git a/include/asm-arm/plat-orion/cache-feroceon-l2.h b/include/asm-arm/plat-orion/cache-feroceon-l2.h
deleted file mode 100644 (file)
index ba4e016..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * include/asm-arm/plat-orion/cache-feroceon-l2.h
- *
- * Copyright (C) 2008 Marvell Semiconductor
- *
- * 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.
- */
-
-extern void __init feroceon_l2_init(int l2_wt_override);
diff --git a/include/asm-arm/plat-orion/ehci-orion.h b/include/asm-arm/plat-orion/ehci-orion.h
deleted file mode 100644 (file)
index 7857056..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * include/asm-arm/plat-orion/ehci-orion.h
- *
- * 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 __ASM_PLAT_ORION_EHCI_ORION_H
-#define __ASM_PLAT_ORION_EHCI_ORION_H
-
-#include <linux/mbus.h>
-
-struct orion_ehci_data {
-       struct mbus_dram_target_info    *dram;
-};
-
-
-#endif
diff --git a/include/asm-arm/plat-orion/irq.h b/include/asm-arm/plat-orion/irq.h
deleted file mode 100644 (file)
index 94aeed9..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * include/asm-arm/plat-orion/irq.h
- *
- * Marvell Orion SoC IRQ handling.
- *
- * 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 __ASM_PLAT_ORION_IRQ_H
-#define __ASM_PLAT_ORION_IRQ_H
-
-void orion_irq_init(unsigned int irq_start, void __iomem *maskaddr);
-
-
-#endif
diff --git a/include/asm-arm/plat-orion/mv_xor.h b/include/asm-arm/plat-orion/mv_xor.h
deleted file mode 100644 (file)
index c349e8f..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Marvell XOR platform device data definition file.
- */
-
-#ifndef __ASM_PLAT_ORION_MV_XOR_H
-#define __ASM_PLAT_ORION_MV_XOR_H
-
-#include <linux/dmaengine.h>
-#include <linux/mbus.h>
-
-#define MV_XOR_SHARED_NAME     "mv_xor_shared"
-#define MV_XOR_NAME            "mv_xor"
-
-struct mbus_dram_target_info;
-
-struct mv_xor_platform_shared_data {
-       struct mbus_dram_target_info    *dram;
-};
-
-struct mv_xor_platform_data {
-       struct platform_device          *shared;
-       int                             hw_id;
-       dma_cap_mask_t                  cap_mask;
-       size_t                          pool_size;
-};
-
-
-#endif
diff --git a/include/asm-arm/plat-orion/orion_nand.h b/include/asm-arm/plat-orion/orion_nand.h
deleted file mode 100644 (file)
index ad4ce94..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * include/asm-arm/plat-orion/orion_nand.h
- *
- * 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 __ASM_PLAT_ORION_ORION_NAND_H
-#define __ASM_PLAT_ORION_ORION_NAND_H
-
-/*
- * Device bus NAND private data
- */
-struct orion_nand_data {
-       struct mtd_partition *parts;
-       u32 nr_parts;
-       u8 ale;         /* address line number connected to ALE */
-       u8 cle;         /* address line number connected to CLE */
-       u8 width;       /* buswidth */
-       u8 chip_delay;
-};
-
-
-#endif
diff --git a/include/asm-arm/plat-orion/pcie.h b/include/asm-arm/plat-orion/pcie.h
deleted file mode 100644 (file)
index e61b7bd..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * include/asm-arm/plat-orion/pcie.h
- *
- * Marvell Orion SoC PCIe handling.
- *
- * 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 __ASM_PLAT_ORION_PCIE_H
-#define __ASM_PLAT_ORION_PCIE_H
-
-u32 orion_pcie_dev_id(void __iomem *base);
-u32 orion_pcie_rev(void __iomem *base);
-int orion_pcie_link_up(void __iomem *base);
-int orion_pcie_x4_mode(void __iomem *base);
-int orion_pcie_get_local_bus_nr(void __iomem *base);
-void orion_pcie_set_local_bus_nr(void __iomem *base, int nr);
-void orion_pcie_setup(void __iomem *base,
-                     struct mbus_dram_target_info *dram);
-int orion_pcie_rd_conf(void __iomem *base, struct pci_bus *bus,
-                      u32 devfn, int where, int size, u32 *val);
-int orion_pcie_rd_conf_tlp(void __iomem *base, struct pci_bus *bus,
-                          u32 devfn, int where, int size, u32 *val);
-int orion_pcie_rd_conf_wa(void __iomem *wa_base, struct pci_bus *bus,
-                         u32 devfn, int where, int size, u32 *val);
-int orion_pcie_wr_conf(void __iomem *base, struct pci_bus *bus,
-                      u32 devfn, int where, int size, u32 val);
-
-
-#endif
diff --git a/include/asm-arm/plat-orion/time.h b/include/asm-arm/plat-orion/time.h
deleted file mode 100644 (file)
index 0e85cc8..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * include/asm-arm/plat-orion/time.h
- *
- * Marvell Orion SoC time handling.
- *
- * 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 __ASM_PLAT_ORION_TIME_H
-#define __ASM_PLAT_ORION_TIME_H
-
-void orion_time_init(unsigned int irq, unsigned int tclk);
-
-
-#endif
index 09f0b5503f5bd2bec6fb0b23eae550e0a86b954a..b2caa4bca270d298b8d539b922e110a739fe0860 100644 (file)
@@ -11,7 +11,7 @@
 */
 
 #ifndef __ASM_ARM_REGS_NAND
-#define __ASM_ARM_REGS_NAND "$Id: nand.h,v 1.3 2003/12/09 11:36:29 ben Exp $"
+#define __ASM_ARM_REGS_NAND
 
 
 #define S3C2410_NFREG(x) (x)
index b4366ea39677f65fe3a92a7650c800eff1f4513b..cc0eedd53e38a8a410693c5df3ad20493ab90767 100644 (file)
@@ -12,7 +12,7 @@
 
 
 #ifndef __ASM_ARCH_REGS_TIMER_H
-#define __ASM_ARCH_REGS_TIMER_H "$Id: timer.h,v 1.4 2003/05/06 19:30:50 ben Exp $"
+#define __ASM_ARCH_REGS_TIMER_H
 
 #define S3C_TIMERREG(x) (S3C_VA_TIMER + (x))
 #define S3C_TIMERREG2(tmr,reg) S3C_TIMERREG((reg)+0x0c+((tmr)*0x0c))
index 1229f076c0a06fbb5dfa93c9143d6daee160ee62..4938492470f7bf6dd50b1c57961d73839bc5edb5 100644 (file)
@@ -12,7 +12,7 @@
 
 
 #ifndef __ASM_ARCH_REGS_WATCHDOG_H
-#define __ASM_ARCH_REGS_WATCHDOG_H "$Id: watchdog.h,v 1.2 2003/04/29 13:31:09 ben Exp $"
+#define __ASM_ARCH_REGS_WATCHDOG_H
 
 #define S3C_WDOGREG(x) ((x) + S3C_VA_WATCHDOG)
 
index 36de0b8358737794c0fdcc2e53c58cab7cb56718..3cd1ec677b3ffe00043ebe434016fbf90b1a9461 100644 (file)
@@ -21,11 +21,11 @@ extern void s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no);
 
 extern void s3c2410_init_clocks(int xtal);
 
-extern  int s3c2410_baseclk_add(void);
-
 #else
 #define s3c2410_init_clocks NULL
 #define s3c2410_init_uarts NULL
 #define s3c2410_map_io NULL
 #define s3c2410_init NULL
 #endif
+
+extern int s3c2410_baseclk_add(void);
index 71f8fe7832581b41a60014ba2895e1d9c5cfff10..606ecfdcc962e19dc68a8af35d730b2623603ebf 100644 (file)
@@ -1,3 +1,3 @@
 include include/asm-generic/Kbuild.asm
 
-header-y += fixed_code.h
+unifdef-y += fixed_code.h
index 320aa5e167e95098fca000cb83084266eecc91c9..7ba70de66f2b4077d40de98039bc02b3667a4fc2 100644 (file)
@@ -56,37 +56,20 @@ extern void dump_bfin_process(struct pt_regs *regs);
 extern void dump_bfin_mem(struct pt_regs *regs);
 extern void dump_bfin_trace_buffer(void);
 
+/* init functions only */
 extern int init_arch_irq(void);
-extern void bfin_reset(void);
-extern void _cplb_hdr(void);
-/* Blackfin cache functions */
 extern void bfin_icache_init(void);
 extern void bfin_dcache_init(void);
-extern int read_iloc(void);
-extern int bfin_console_init(void);
-extern asmlinkage void lower_to_irq14(void);
-extern asmlinkage void bfin_return_from_exception(void);
 extern void init_exception_vectors(void);
-extern void init_dma(void);
 extern void program_IAR(void);
-extern void evt14_softirq(void);
+
+extern void bfin_reset(void);
+extern asmlinkage void lower_to_irq14(void);
+extern asmlinkage void bfin_return_from_exception(void);
+extern asmlinkage void evt14_softirq(void);
 extern asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs);
-extern void bfin_gpio_interrupt_setup(int irq, int irq_pfx, int type);
 extern int bfin_internal_set_wake(unsigned int irq, unsigned int state);
 
-extern asmlinkage void finish_atomic_sections (struct pt_regs *regs);
-extern char fixed_code_start;
-extern char fixed_code_end;
-extern int atomic_xchg32(void);
-extern int atomic_cas32(void);
-extern int atomic_add32(void);
-extern int atomic_sub32(void);
-extern int atomic_ior32(void);
-extern int atomic_and32(void);
-extern int atomic_xor32(void);
-extern void safe_user_instruction(void);
-extern void sigreturn_stub(void);
-
 extern void *l1_data_A_sram_alloc(size_t);
 extern void *l1_data_B_sram_alloc(size_t);
 extern void *l1_inst_sram_alloc(size_t);
@@ -110,11 +93,10 @@ extern void *sram_alloc_with_lsl(size_t, unsigned long);
 extern int sram_free_with_lsl(const void*);
 
 extern const char bfin_board_name[];
-extern unsigned long wall_jiffies;
 
 extern unsigned long bfin_sic_iwr[];
+extern unsigned vr_wakeup;
 extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */
-extern struct file_operations dpmc_fops;
 extern unsigned long _ramstart, _ramend, _rambase;
 extern unsigned long memory_start, memory_end, physical_mem_end;
 extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[],
@@ -122,8 +104,12 @@ extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[],
        _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[],
        _ebss_l2[], _l2_lma_start[];
 
-#ifdef CONFIG_MTD_UCLINUX
+/* only used when CONFIG_MTD_UCLINUX */
 extern unsigned long memory_mtd_start, memory_mtd_end, mtd_size;
+
+#ifdef CONFIG_BFIN_ICACHE_LOCK
+extern void cache_grab_lock(int way);
+extern void cache_lock(int way);
 #endif
 
 #endif
index de28e6e018b33a01e0938c0f18119884f3496e59..96e8208f929a77bd8091c147c145dc12728a3f27 100644 (file)
@@ -11,7 +11,6 @@
 #ifndef __ASSEMBLY__
 
 void sleep_mode(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2);
-void deep_sleep(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2);
 void hibernate_mode(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2);
 void sleep_deeper(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2);
 void do_hibernate(int wakeup);
index 37db66c7030d12e91eabc205ed9ea4059195515a..32c4d495d847b14a53ef86dafbb478d906fff211 100644 (file)
@@ -1,6 +1,28 @@
 /* This file defines the fixed addresses where userspace programs can find
    atomic code sequences.  */
 
+#ifndef __BFIN_ASM_FIXED_CODE_H__
+#define __BFIN_ASM_FIXED_CODE_H__
+
+#ifdef __KERNEL__
+#ifndef __ASSEMBLY__
+#include <linux/linkage.h>
+#include <linux/ptrace.h>
+extern asmlinkage void finish_atomic_sections(struct pt_regs *regs);
+extern char fixed_code_start;
+extern char fixed_code_end;
+extern int atomic_xchg32(void);
+extern int atomic_cas32(void);
+extern int atomic_add32(void);
+extern int atomic_sub32(void);
+extern int atomic_ior32(void);
+extern int atomic_and32(void);
+extern int atomic_xor32(void);
+extern void safe_user_instruction(void);
+extern void sigreturn_stub(void);
+#endif
+#endif
+
 #define FIXED_CODE_START       0x400
 
 #define SIGRETURN_STUB         0x400
@@ -20,3 +42,5 @@
 #define SAFE_USER_INSTRUCTION   0x480
 
 #define FIXED_CODE_END         0x490
+
+#endif
index 193082deaa4e22214d510f88334eec59a9ecc3cb..ef46dc991cd447d0a7f33b3baee6f63e515b16fd 100644 (file)
 #define BFIN_DSUPBANKS 0
 #endif                         /*CONFIG_BFIN_DCACHE */
 
+/* Level 2 Memory - none */
+
+#define L2_START       0
+#define L2_LENGTH      0
+
 /* Scratch Pad Memory */
 
 #define L1_SCRATCH_START       0xFFB00000
index 995c06b2b1ef7f2131c28201897fd293eafbf227..ed2034bf10ecfa122ef4001267836a0f625f2028 100644 (file)
@@ -47,7 +47,7 @@
 #define SDRAM_tRCD      TRCD_2
 #define SDRAM_tWR       TWR_2
 #endif
-#if (CONFIG_SCLK_HZ > 8955223) && (CONFIG_SCLK_HZ <= 104477612)
+#if (CONFIG_SCLK_HZ > 89552239) && (CONFIG_SCLK_HZ <= 104477612)
 #define SDRAM_tRP       TRP_2
 #define SDRAM_tRP_num   2
 #define SDRAM_tRAS      TRAS_5
index bd30b6f3be006bdab7d021866c003c1be5675666..581fc6eea789b189a31743d8f2ce90832fba053f 100644 (file)
 
 #endif
 
+/* Level 2 Memory - none */
+
+#define L2_START       0
+#define L2_LENGTH      0
+
 /* Scratch Pad Memory */
 
 #define L1_SCRATCH_START       0xFFB00000
index 5c6726d6f3b17c10f169049f3b0e48dcf99f315d..5078b669431f72204cb780d144167606192ec558 100644 (file)
 
 #endif
 
+/* Level 2 Memory - none */
+
+#define L2_START       0
+#define L2_LENGTH      0
+
 /* Scratch Pad Memory */
 
 #define L1_SCRATCH_START       0xFFB00000
index ede210eca4ec1f6c202601dd77a94abfa52b432f..d39c396f850df6d7f94d034805c41686f2fd4e83 100644 (file)
 #define bfin_read_SRAM_BASE_ADDRESS()        bfin_read32(SRAM_BASE_ADDRESS)
 #define bfin_write_SRAM_BASE_ADDRESS(val)    bfin_write32(SRAM_BASE_ADDRESS,val)
 #define bfin_read_DMEM_CONTROL()             bfin_read32(DMEM_CONTROL)
-#if ANOMALY_05000125
-extern void bfin_write_DMEM_CONTROL(unsigned int val);
-#else
 #define bfin_write_DMEM_CONTROL(val)         bfin_write32(DMEM_CONTROL,val)
-#endif
 #define bfin_read_DCPLB_STATUS()             bfin_read32(DCPLB_STATUS)
 #define bfin_write_DCPLB_STATUS(val)         bfin_write32(DCPLB_STATUS,val)
 #define bfin_read_DCPLB_FAULT_ADDR()         bfin_read32(DCPLB_FAULT_ADDR)
@@ -129,11 +125,7 @@ extern void bfin_write_DMEM_CONTROL(unsigned int val);
 #define DTEST_DATA3            0xFFE0040C
 */
 #define bfin_read_IMEM_CONTROL()             bfin_read32(IMEM_CONTROL)
-#if ANOMALY_05000125
-extern void bfin_write_IMEM_CONTROL(unsigned int val);
-#else
 #define bfin_write_IMEM_CONTROL(val)         bfin_write32(IMEM_CONTROL,val)
-#endif
 #define bfin_read_ICPLB_STATUS()             bfin_read32(ICPLB_STATUS)
 #define bfin_write_ICPLB_STATUS(val)         bfin_write32(ICPLB_STATUS,val)
 #define bfin_read_ICPLB_FAULT_ADDR()         bfin_read32(ICPLB_FAULT_ADDR)
index 42955d0c439b8bb84986a177fc3e1fb0beb74fb7..1e57b636e0bc6985f298486b972336b687bf93c0 100644 (file)
 #define __NR_semtimedop                357
 #define __NR_timerfd_settime   358
 #define __NR_timerfd_gettime   359
+#define __NR_signalfd4         360
+#define __NR_eventfd2          361
+#define __NR_epoll_create1     362
+#define __NR_dup3              363
+#define __NR_pipe2             364
+#define __NR_inotify_init1     365
 
-#define __NR_syscall           360
+#define __NR_syscall           366
 #define NR_syscalls            __NR_syscall
 
 /* Old optional stuff no one actually uses */
index b7037d80d461b793304035dff1a329409732cd4b..d5b631935ec8edc9d00166498d46a4746defd086 100644 (file)
@@ -1,6 +1,5 @@
 include include/asm-generic/Kbuild.asm
 
-header-y += arch/
 header-y += arch-v10/
 header-y += arch-v32/
 
index 20e44fe00abf66f6b74b0daf482bea26d1dcebc7..ca7475e73b5ee7f2673334011f86e5cb77ac62b1 100644 (file)
@@ -271,6 +271,8 @@ static inline void __iomem *ioremap_fullcache(unsigned long physaddr, unsigned l
        return __ioremap(physaddr, size, IOMAP_FULL_CACHING);
 }
 
+#define ioremap_wc ioremap_nocache
+
 extern void iounmap(void volatile __iomem *addr);
 
 static inline void __iomem *ioport_map(unsigned long port, unsigned int nr)
index cdbab43b7d3a6c3b98f0cfd330435148617c4f85..4314892aaebb990572547d371dc5e2febde884ae 100644 (file)
@@ -16,7 +16,7 @@
  /* Maximum address we can use for the control code buffer */
 #define KEXEC_CONTROL_MEMORY_LIMIT (0x20000000)
 
-#define KEXEC_CONTROL_CODE_SIZE 4096
+#define KEXEC_CONTROL_PAGE_SIZE 4096
 
 /* The native architecture */
 #define KEXEC_ARCH KEXEC_ARCH_MIPS
index b8b6dc878250b37ae888f111e286c188c7678db6..c1a4119e6497ee2b23a4460d3c2ef05294cec128 100644 (file)
@@ -259,6 +259,8 @@ static inline void *ioremap_nocache(unsigned long offset, unsigned long size)
        return (void *) (offset | 0x20000000);
 }
 
+#define ioremap_wc ioremap_nocache
+
 static inline void iounmap(void *addr)
 {
 }
index 22aa58ca1991c3003565f8fbc0313f3cf37b9d92..dcc812067394fd5e366810d0d57eb2dbf6f05d70 100644 (file)
@@ -31,9 +31,6 @@
 #define ALIAS_TABLE_ENTRY_SIZE         2
 #define RLOOKUP_TABLE_ENTRY_SIZE       (sizeof(void *))
 
-/* helper macros */
-#define LOW_U32(x) ((x) & ((1ULL << 32)-1))
-
 /* Length of the MMIO region for the AMD IOMMU */
 #define MMIO_REGION_LENGTH       0x4000
 
@@ -69,6 +66,9 @@
 #define MMIO_EVT_TAIL_OFFSET   0x2018
 #define MMIO_STATUS_OFFSET     0x2020
 
+/* MMIO status bits */
+#define MMIO_STATUS_COM_WAIT_INT_MASK  0x04
+
 /* feature control bits */
 #define CONTROL_IOMMU_EN        0x00ULL
 #define CONTROL_HT_TUN_EN       0x01ULL
@@ -89,6 +89,7 @@
 #define CMD_INV_IOMMU_PAGES     0x03
 
 #define CMD_COMPL_WAIT_STORE_MASK      0x01
+#define CMD_COMPL_WAIT_INT_MASK                0x02
 #define CMD_INV_IOMMU_PAGES_SIZE_MASK  0x01
 #define CMD_INV_IOMMU_PAGES_PDE_MASK   0x02
 
 #define DEV_ENTRY_TRANSLATION   0x01
 #define DEV_ENTRY_IR            0x3d
 #define DEV_ENTRY_IW            0x3e
+#define DEV_ENTRY_NO_PAGE_FAULT        0x62
 #define DEV_ENTRY_EX            0x67
 #define DEV_ENTRY_SYSMGT1       0x68
 #define DEV_ENTRY_SYSMGT2       0x69
index a0095191c02e92f319c13b2d3bc27fcd2f1fbc70..91c7d03e65bcc077f4bbffe98cf662ee47bf33dc 100644 (file)
@@ -228,7 +228,7 @@ static inline void atomic64_add(long i, atomic64_t *v)
 {
        asm volatile(LOCK_PREFIX "addq %1,%0"
                     : "=m" (v->counter)
-                    : "ir" (i), "m" (v->counter));
+                    : "er" (i), "m" (v->counter));
 }
 
 /**
@@ -242,7 +242,7 @@ static inline void atomic64_sub(long i, atomic64_t *v)
 {
        asm volatile(LOCK_PREFIX "subq %1,%0"
                     : "=m" (v->counter)
-                    : "ir" (i), "m" (v->counter));
+                    : "er" (i), "m" (v->counter));
 }
 
 /**
@@ -260,7 +260,7 @@ static inline int atomic64_sub_and_test(long i, atomic64_t *v)
 
        asm volatile(LOCK_PREFIX "subq %2,%0; sete %1"
                     : "=m" (v->counter), "=qm" (c)
-                    : "ir" (i), "m" (v->counter) : "memory");
+                    : "er" (i), "m" (v->counter) : "memory");
        return c;
 }
 
@@ -341,7 +341,7 @@ static inline int atomic64_add_negative(long i, atomic64_t *v)
 
        asm volatile(LOCK_PREFIX "addq %2,%0; sets %1"
                     : "=m" (v->counter), "=qm" (c)
-                    : "ir" (i), "m" (v->counter) : "memory");
+                    : "er" (i), "m" (v->counter) : "memory");
        return c;
 }
 
index bb06027fc83e557e006cd3c18e7976ff08f07745..2c1cda0b8a860502aac60502b59fd4f9c9a9a895 100644 (file)
@@ -50,6 +50,7 @@ extern int geode_get_dev_base(unsigned int dev);
 #define MSR_PIC_YSEL_HIGH      0x51400021
 #define MSR_PIC_ZSEL_LOW       0x51400022
 #define MSR_PIC_ZSEL_HIGH      0x51400023
+#define MSR_PIC_IRQM_LPC       0x51400025
 
 #define MSR_MFGPT_IRQ          0x51400028
 #define MSR_MFGPT_NR           0x51400029
@@ -237,7 +238,7 @@ static inline u16 geode_mfgpt_read(int timer, u16 reg)
 }
 
 extern int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable);
-extern int geode_mfgpt_set_irq(int timer, int cmp, int irq, int enable);
+extern int geode_mfgpt_set_irq(int timer, int cmp, int *irq, int enable);
 extern int geode_mfgpt_alloc_timer(int timer, int domain);
 
 #define geode_mfgpt_setup_irq(t, c, i) geode_mfgpt_set_irq((t), (c), (i), 1)
index 6d3b21063419fe3cb81f98369b3ae450e44009bf..56d00e31aec0064856fb0c04a80df039b037a30b 100644 (file)
@@ -63,8 +63,6 @@ static inline int restore_fpu_checking(struct i387_fxsave_struct *fx)
 #else
                     : [fx] "cdaSDb" (fx), "m" (*fx), "0" (0));
 #endif
-       if (unlikely(err))
-               init_fpu(current);
        return err;
 }
 
index bf5d629b3a39a369256564db15ba2d66eb4a014a..0f954dc89cb3c537ebb444e402987616b0a9714b 100644 (file)
@@ -21,7 +21,7 @@ extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
 
 #define build_mmio_read(name, size, type, reg, barrier) \
 static inline type name(const volatile void __iomem *addr) \
-{ type ret; asm volatile("mov" size " %1,%0":"=" reg (ret) \
+{ type ret; asm volatile("mov" size " %1,%0":reg (ret) \
 :"m" (*(volatile type __force *)addr) barrier); return ret; }
 
 #define build_mmio_write(name, size, type, reg, barrier) \
@@ -29,13 +29,13 @@ static inline void name(type val, volatile void __iomem *addr) \
 { asm volatile("mov" size " %0,%1": :reg (val), \
 "m" (*(volatile type __force *)addr) barrier); }
 
-build_mmio_read(readb, "b", unsigned char, "q", :"memory")
-build_mmio_read(readw, "w", unsigned short, "r", :"memory")
-build_mmio_read(readl, "l", unsigned int, "r", :"memory")
+build_mmio_read(readb, "b", unsigned char, "=q", :"memory")
+build_mmio_read(readw, "w", unsigned short, "=r", :"memory")
+build_mmio_read(readl, "l", unsigned int, "=r", :"memory")
 
-build_mmio_read(__readb, "b", unsigned char, "q", )
-build_mmio_read(__readw, "w", unsigned short, "r", )
-build_mmio_read(__readl, "l", unsigned int, "r", )
+build_mmio_read(__readb, "b", unsigned char, "=q", )
+build_mmio_read(__readw, "w", unsigned short, "=r", )
+build_mmio_read(__readl, "l", unsigned int, "=r", )
 
 build_mmio_write(writeb, "b", unsigned char, "q", :"memory")
 build_mmio_write(writew, "w", unsigned short, "r", :"memory")
@@ -59,8 +59,8 @@ build_mmio_write(__writel, "l", unsigned int, "r", )
 #define mmiowb() barrier()
 
 #ifdef CONFIG_X86_64
-build_mmio_read(readq, "q", unsigned long, "r", :"memory")
-build_mmio_read(__readq, "q", unsigned long, "r", )
+build_mmio_read(readq, "q", unsigned long, "=r", :"memory")
+build_mmio_read(__readq, "q", unsigned long, "=r", )
 build_mmio_write(writeq, "q", unsigned long, "r", :"memory")
 build_mmio_write(__writeq, "q", unsigned long, "r", )
 
index c0e52a14fd4dd981ee36ea66484f7f564b40bd04..4246ab7dc9887b58e898569a6173eeb15d3437a9 100644 (file)
 # define PAGES_NR              17
 #endif
 
+#ifdef CONFIG_X86_32
+# define KEXEC_CONTROL_CODE_MAX_SIZE   2048
+#endif
+
 #ifndef __ASSEMBLY__
 
 #include <linux/string.h>
@@ -63,7 +67,7 @@
 /* Maximum address we can use for the control code buffer */
 # define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
 
-# define KEXEC_CONTROL_CODE_SIZE       4096
+# define KEXEC_CONTROL_PAGE_SIZE       4096
 
 /* The native architecture */
 # define KEXEC_ARCH KEXEC_ARCH_386
@@ -79,7 +83,7 @@
 # define KEXEC_CONTROL_MEMORY_LIMIT     (0xFFFFFFFFFFUL)
 
 /* Allocate one page for the pdp and the second for the code */
-# define KEXEC_CONTROL_CODE_SIZE  (4096UL + 4096UL)
+# define KEXEC_CONTROL_PAGE_SIZE  (4096UL + 4096UL)
 
 /* The native architecture */
 # define KEXEC_ARCH KEXEC_ARCH_X86_64
index c1682b542dafe2c02247e9d721fd69d335c874b7..90bc4108a4fdf917fc243502bd7fcf833f482a55 100644 (file)
@@ -12,6 +12,7 @@
 #define MAP_NORESERVE  0x4000          /* don't check for reservations */
 #define MAP_POPULATE   0x8000          /* populate (prefault) pagetables */
 #define MAP_NONBLOCK   0x10000         /* do not block on IO */
+#define MAP_STACK      0x20000         /* give out an address that is best suited for process/thread stacks */
 
 #define MCL_CURRENT    1               /* lock all current mappings */
 #define MCL_FUTURE     2               /* lock all future mappings */
index 95beda07c6fa3e4fefbdd96bf2330c10cedbf674..e293ab81e85017b21dbd0f534ba41692748795ec 100644 (file)
@@ -3,7 +3,7 @@
 
 #ifdef CONFIG_PCI_MMCONFIG
 extern void __cpuinit fam10h_check_enable_mmcfg(void);
-extern void __init check_enable_amd_mmconf_dmi(void);
+extern void __cpuinit check_enable_amd_mmconf_dmi(void);
 #else
 static inline void fam10h_check_enable_mmcfg(void) { }
 static inline void check_enable_amd_mmconf_dmi(void) { }
index b2298a227567fa24f28bd04de70b0b80b70aaa93..5862e6460658d29fc8be6b2a9b2a26389522eb1f 100644 (file)
@@ -97,10 +97,16 @@ static inline int pfn_valid(int pfn)
        reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags))
 #define alloc_bootmem(x) \
        __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS))
+#define alloc_bootmem_nopanic(x) \
+       __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), SMP_CACHE_BYTES, \
+                               __pa(MAX_DMA_ADDRESS))
 #define alloc_bootmem_low(x) \
        __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, 0)
 #define alloc_bootmem_pages(x) \
        __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS))
+#define alloc_bootmem_pages_nopanic(x) \
+       __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), PAGE_SIZE, \
+                               __pa(MAX_DMA_ADDRESS))
 #define alloc_bootmem_low_pages(x) \
        __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0)
 #define alloc_bootmem_node(pgdat, x)                                   \
index 4e91ee1e37aa170140e92814a08232fef4e6dfd4..f643a3a92da08b3789efde09f883850f0e85b0ac 100644 (file)
@@ -182,7 +182,7 @@ do {                                                        \
        DEFINE_PER_CPU(_type, _name) = _initvalue;                      \
        __typeof__(_type) _name##_early_map[NR_CPUS] __initdata =       \
                                { [0 ... NR_CPUS-1] = _initvalue };     \
-       __typeof__(_type) *_name##_early_ptr = _name##_early_map
+       __typeof__(_type) *_name##_early_ptr __refdata = _name##_early_map
 
 #define EXPORT_EARLY_PER_CPU_SYMBOL(_name)                     \
        EXPORT_PER_CPU_SYMBOL(_name)
index ac5fff4cc58aaf364eb41d5027f8e851aceef915..549144d03d99e7972ec2d4806b1763c2c41c933f 100644 (file)
@@ -151,7 +151,7 @@ static inline void native_pgd_clear(pgd_t *pgd)
 #define VMALLOC_END      _AC(0xffffe1ffffffffff, UL)
 #define VMEMMAP_START   _AC(0xffffe20000000000, UL)
 #define MODULES_VADDR    _AC(0xffffffffa0000000, UL)
-#define MODULES_END      _AC(0xfffffffffff00000, UL)
+#define MODULES_END      _AC(0xffffffffff000000, UL)
 #define MODULES_LEN   (MODULES_END - MODULES_VADDR)
 
 #ifndef __ASSEMBLY__
index 5f58da401b43696ee861377fb9aba53500af8b8e..4df3e2f6fb563f2039cbc90aa4016dce9cf9274c 100644 (file)
@@ -728,6 +728,29 @@ extern unsigned long               boot_option_idle_override;
 extern unsigned long           idle_halt;
 extern unsigned long           idle_nomwait;
 
+/*
+ * on systems with caches, caches must be flashed as the absolute
+ * last instruction before going into a suspended halt.  Otherwise,
+ * dirty data can linger in the cache and become stale on resume,
+ * leading to strange errors.
+ *
+ * perform a variety of operations to guarantee that the compiler
+ * will not reorder instructions.  wbinvd itself is serializing
+ * so the processor will not reorder.
+ *
+ * Systems without cache can just go into halt.
+ */
+static inline void wbinvd_halt(void)
+{
+       mb();
+       /* check for clflush to determine if wbinvd is legal */
+       if (cpu_has_clflush)
+               asm volatile("cli; wbinvd; 1: hlt; jmp 1b" : : : "memory");
+       else
+               while (1)
+                       halt();
+}
+
 extern void enable_sep_cpu(void);
 extern int sysenter_setup(void);
 
index 4f9a9861799ac648d406856a8a5ed1881e678a25..e39c790dbfd2be789d812a6cdd89efc3d39cb5ec 100644 (file)
@@ -65,7 +65,7 @@ static inline int __ticket_spin_is_contended(raw_spinlock_t *lock)
 {
        int tmp = ACCESS_ONCE(lock->slock);
 
-       return (((tmp >> 8) & 0xff) - (tmp & 0xff)) > 1;
+       return (((tmp >> 8) - tmp) & 0xff) > 1;
 }
 
 static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock)
@@ -127,7 +127,7 @@ static inline int __ticket_spin_is_contended(raw_spinlock_t *lock)
 {
        int tmp = ACCESS_ONCE(lock->slock);
 
-       return (((tmp >> 16) & 0xffff) - (tmp & 0xffff)) > 1;
+       return (((tmp >> 16) - tmp) & 0xffff) > 1;
 }
 
 static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock)
index 327f60658d947d905b3b1d0d2ff2cc6254ecc8ae..7d970678f9402bbb7c0b73a084831d14dd3d622c 100644 (file)
@@ -250,6 +250,8 @@ unifdef-y += isdn.h
 unifdef-y += isdnif.h
 unifdef-y += isdn_divertif.h
 unifdef-y += isdn_ppp.h
+unifdef-y += ivtv.h
+unifdef-y += ivtvfb.h
 unifdef-y += joystick.h
 unifdef-y += kdev_t.h
 unifdef-y += kd.h
index 1c622e2b0504749e7fdc59b7406a12a1819f6651..1ce19c1ef0e93cbcfcaded43c8a95489ad9d271a 100644 (file)
@@ -46,18 +46,48 @@ enum {
        ATA_MAX_SECTORS_TAPE    = 65535,
 
        ATA_ID_WORDS            = 256,
+       ATA_ID_CONFIG           = 0,
+       ATA_ID_CYLS             = 1,
+       ATA_ID_HEADS            = 3,
+       ATA_ID_SECTORS          = 6,
        ATA_ID_SERNO            = 10,
+       ATA_ID_BUF_SIZE         = 21,
        ATA_ID_FW_REV           = 23,
        ATA_ID_PROD             = 27,
+       ATA_ID_MAX_MULTSECT     = 47,
+       ATA_ID_DWORD_IO         = 48,
+       ATA_ID_CAPABILITY       = 49,
        ATA_ID_OLD_PIO_MODES    = 51,
+       ATA_ID_OLD_DMA_MODES    = 52,
        ATA_ID_FIELD_VALID      = 53,
+       ATA_ID_CUR_CYLS         = 54,
+       ATA_ID_CUR_HEADS        = 55,
+       ATA_ID_CUR_SECTORS      = 56,
+       ATA_ID_MULTSECT         = 59,
+       ATA_ID_LBA_CAPACITY     = 60,
+       ATA_ID_SWDMA_MODES      = 62,
        ATA_ID_MWDMA_MODES      = 63,
        ATA_ID_PIO_MODES        = 64,
        ATA_ID_EIDE_DMA_MIN     = 65,
+       ATA_ID_EIDE_DMA_TIME    = 66,
        ATA_ID_EIDE_PIO         = 67,
        ATA_ID_EIDE_PIO_IORDY   = 68,
-       ATA_ID_UDMA_MODES       = 88,
+       ATA_ID_QUEUE_DEPTH      = 75,
        ATA_ID_MAJOR_VER        = 80,
+       ATA_ID_COMMAND_SET_1    = 82,
+       ATA_ID_COMMAND_SET_2    = 83,
+       ATA_ID_CFSSE            = 84,
+       ATA_ID_CFS_ENABLE_1     = 85,
+       ATA_ID_CFS_ENABLE_2     = 86,
+       ATA_ID_CSF_DEFAULT      = 87,
+       ATA_ID_UDMA_MODES       = 88,
+       ATA_ID_HW_CONFIG        = 93,
+       ATA_ID_SPG              = 98,
+       ATA_ID_LBA_CAPACITY_2   = 100,
+       ATA_ID_LAST_LUN         = 126,
+       ATA_ID_DLF              = 128,
+       ATA_ID_CSFO             = 129,
+       ATA_ID_CFA_POWER        = 160,
        ATA_ID_PIO4             = (1 << 1),
 
        ATA_ID_SERNO_LEN        = 20,
@@ -123,13 +153,26 @@ enum {
        ATA_BUSY                = (1 << 7),     /* BSY status bit */
        ATA_DRDY                = (1 << 6),     /* device ready */
        ATA_DF                  = (1 << 5),     /* device fault */
+       ATA_DSC                 = (1 << 4),     /* drive seek complete */
        ATA_DRQ                 = (1 << 3),     /* data request i/o */
+       ATA_CORR                = (1 << 2),     /* corrected data error */
+       ATA_IDX                 = (1 << 1),     /* index */
        ATA_ERR                 = (1 << 0),     /* have an error */
        ATA_SRST                = (1 << 2),     /* software reset */
        ATA_ICRC                = (1 << 7),     /* interface CRC error */
+       ATA_BBK                 = ATA_ICRC,     /* pre-EIDE: block marked bad */
        ATA_UNC                 = (1 << 6),     /* uncorrectable media error */
+       ATA_MC                  = (1 << 5),     /* media changed */
        ATA_IDNF                = (1 << 4),     /* ID not found */
+       ATA_MCR                 = (1 << 3),     /* media change requested */
        ATA_ABORTED             = (1 << 2),     /* command aborted */
+       ATA_TRK0NF              = (1 << 1),     /* track 0 not found */
+       ATA_AMNF                = (1 << 0),     /* address mark not found */
+       ATAPI_LFS               = 0xF0,         /* last failed sense */
+       ATAPI_EOM               = ATA_TRK0NF,   /* end of media */
+       ATAPI_ILI               = ATA_AMNF,     /* illegal length indication */
+       ATAPI_IO                = (1 << 1),
+       ATAPI_COD               = (1 << 0),
 
        /* ATA command block registers */
        ATA_REG_DATA            = 0x00,
@@ -192,6 +235,13 @@ enum {
        ATA_CMD_PMP_WRITE       = 0xE8,
        ATA_CMD_CONF_OVERLAY    = 0xB1,
        ATA_CMD_SEC_FREEZE_LOCK = 0xF5,
+       ATA_CMD_SMART           = 0xB0,
+       ATA_CMD_MEDIA_LOCK      = 0xDE,
+       ATA_CMD_MEDIA_UNLOCK    = 0xDF,
+       /* marked obsolete in the ATA/ATAPI-7 spec */
+       ATA_CMD_RESTORE         = 0x10,
+       /* EXABYTE specific */
+       ATA_EXABYTE_ENABLE_NEST = 0xF0,
 
        /* READ_LOG_EXT pages */
        ATA_LOG_SATA_NCQ        = 0x10,
@@ -232,6 +282,10 @@ enum {
        SETFEATURES_WC_ON       = 0x02, /* Enable write cache */
        SETFEATURES_WC_OFF      = 0x82, /* Disable write cache */
 
+       /* Enable/Disable Automatic Acoustic Management */
+       SETFEATURES_AAM_ON      = 0x42,
+       SETFEATURES_AAM_OFF     = 0xC2,
+
        SETFEATURES_SPINUP      = 0x07, /* Spin-up drive */
 
        SETFEATURES_SATA_ENABLE = 0x10, /* Enable use of SATA feature */
@@ -254,6 +308,15 @@ enum {
        ATA_DCO_IDENTIFY        = 0xC2,
        ATA_DCO_SET             = 0xC3,
 
+       /* feature values for SMART */
+       ATA_SMART_ENABLE        = 0xD8,
+       ATA_SMART_READ_VALUES   = 0xD0,
+       ATA_SMART_READ_THRESHOLDS = 0xD1,
+
+       /* password used in LBA Mid / LBA High for executing SMART commands */
+       ATA_SMART_LBAM_PASS     = 0x4F,
+       ATA_SMART_LBAH_PASS     = 0xC2,
+
        /* ATAPI stuff */
        ATAPI_PKT_DMA           = (1 << 0),
        ATAPI_DMADIR            = (1 << 2),     /* ATAPI data dir:
@@ -438,17 +501,17 @@ static inline int ata_is_data(u8 prot)
 /*
  * id tests
  */
-#define ata_id_is_ata(id)      (((id)[0] & (1 << 15)) == 0)
-#define ata_id_has_lba(id)     ((id)[49] & (1 << 9))
-#define ata_id_has_dma(id)     ((id)[49] & (1 << 8))
+#define ata_id_is_ata(id)      (((id)[ATA_ID_CONFIG] & (1 << 15)) == 0)
+#define ata_id_has_lba(id)     ((id)[ATA_ID_CAPABILITY] & (1 << 9))
+#define ata_id_has_dma(id)     ((id)[ATA_ID_CAPABILITY] & (1 << 8))
 #define ata_id_has_ncq(id)     ((id)[76] & (1 << 8))
-#define ata_id_queue_depth(id) (((id)[75] & 0x1f) + 1)
-#define ata_id_removeable(id)  ((id)[0] & (1 << 7))
+#define ata_id_queue_depth(id) (((id)[ATA_ID_QUEUE_DEPTH] & 0x1f) + 1)
+#define ata_id_removeable(id)  ((id)[ATA_ID_CONFIG] & (1 << 7))
 #define ata_id_has_atapi_AN(id)        \
        ( (((id)[76] != 0x0000) && ((id)[76] != 0xffff)) && \
          ((id)[78] & (1 << 5)) )
-#define ata_id_iordy_disable(id) ((id)[49] & (1 << 10))
-#define ata_id_has_iordy(id) ((id)[49] & (1 << 11))
+#define ata_id_iordy_disable(id) ((id)[ATA_ID_CAPABILITY] & (1 << 10))
+#define ata_id_has_iordy(id) ((id)[ATA_ID_CAPABILITY] & (1 << 11))
 #define ata_id_u32(id,n)       \
        (((u32) (id)[(n) + 1] << 16) | ((u32) (id)[(n)]))
 #define ata_id_u64(id,n)       \
@@ -457,7 +520,7 @@ static inline int ata_is_data(u8 prot)
          ((u64) (id)[(n) + 1] << 16) | \
          ((u64) (id)[(n) + 0]) )
 
-#define ata_id_cdb_intr(id)    (((id)[0] & 0x60) == 0x20)
+#define ata_id_cdb_intr(id)    (((id)[ATA_ID_CONFIG] & 0x60) == 0x20)
 
 static inline bool ata_id_has_hipm(const u16 *id)
 {
@@ -482,75 +545,75 @@ static inline bool ata_id_has_dipm(const u16 *id)
 
 static inline int ata_id_has_fua(const u16 *id)
 {
-       if ((id[84] & 0xC000) != 0x4000)
+       if ((id[ATA_ID_CFSSE] & 0xC000) != 0x4000)
                return 0;
-       return id[84] & (1 << 6);
+       return id[ATA_ID_CFSSE] & (1 << 6);
 }
 
 static inline int ata_id_has_flush(const u16 *id)
 {
-       if ((id[83] & 0xC000) != 0x4000)
+       if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
                return 0;
-       return id[83] & (1 << 12);
+       return id[ATA_ID_COMMAND_SET_2] & (1 << 12);
 }
 
 static inline int ata_id_has_flush_ext(const u16 *id)
 {
-       if ((id[83] & 0xC000) != 0x4000)
+       if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
                return 0;
-       return id[83] & (1 << 13);
+       return id[ATA_ID_COMMAND_SET_2] & (1 << 13);
 }
 
 static inline int ata_id_has_lba48(const u16 *id)
 {
-       if ((id[83] & 0xC000) != 0x4000)
+       if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
                return 0;
-       if (!ata_id_u64(id, 100))
+       if (!ata_id_u64(id, ATA_ID_LBA_CAPACITY_2))
                return 0;
-       return id[83] & (1 << 10);
+       return id[ATA_ID_COMMAND_SET_2] & (1 << 10);
 }
 
 static inline int ata_id_hpa_enabled(const u16 *id)
 {
        /* Yes children, word 83 valid bits cover word 82 data */
-       if ((id[83] & 0xC000) != 0x4000)
+       if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
                return 0;
        /* And 87 covers 85-87 */
-       if ((id[87] & 0xC000) != 0x4000)
+       if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
                return 0;
        /* Check command sets enabled as well as supported */
-       if ((id[85] & ( 1 << 10)) == 0)
+       if ((id[ATA_ID_CFS_ENABLE_1] & (1 << 10)) == 0)
                return 0;
-       return id[82] & (1 << 10);
+       return id[ATA_ID_COMMAND_SET_1] & (1 << 10);
 }
 
 static inline int ata_id_has_wcache(const u16 *id)
 {
        /* Yes children, word 83 valid bits cover word 82 data */
-       if ((id[83] & 0xC000) != 0x4000)
+       if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
                return 0;
-       return id[82] & (1 << 5);
+       return id[ATA_ID_COMMAND_SET_1] & (1 << 5);
 }
 
 static inline int ata_id_has_pm(const u16 *id)
 {
-       if ((id[83] & 0xC000) != 0x4000)
+       if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
                return 0;
-       return id[82] & (1 << 3);
+       return id[ATA_ID_COMMAND_SET_1] & (1 << 3);
 }
 
 static inline int ata_id_rahead_enabled(const u16 *id)
 {
-       if ((id[87] & 0xC000) != 0x4000)
+       if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
                return 0;
-       return id[85] & (1 << 6);
+       return id[ATA_ID_CFS_ENABLE_1] & (1 << 6);
 }
 
 static inline int ata_id_wcache_enabled(const u16 *id)
 {
-       if ((id[87] & 0xC000) != 0x4000)
+       if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
                return 0;
-       return id[85] & (1 << 5);
+       return id[ATA_ID_CFS_ENABLE_1] & (1 << 5);
 }
 
 /**
@@ -581,7 +644,7 @@ static inline unsigned int ata_id_major_version(const u16 *id)
 
 static inline int ata_id_is_sata(const u16 *id)
 {
-       return ata_id_major_version(id) >= 5 && id[93] == 0;
+       return ata_id_major_version(id) >= 5 && id[ATA_ID_HW_CONFIG] == 0;
 }
 
 static inline int ata_id_has_tpm(const u16 *id)
@@ -599,7 +662,7 @@ static inline int ata_id_has_dword_io(const u16 *id)
        /* ATA 8 reuses this flag for "trusted" computing */
        if (ata_id_major_version(id) > 7)
                return 0;
-       if (id[48] & (1 << 0))
+       if (id[ATA_ID_DWORD_IO] & (1 << 0))
                return 1;
        return 0;
 }
@@ -608,22 +671,22 @@ static inline int ata_id_current_chs_valid(const u16 *id)
 {
        /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command
           has not been issued to the device then the values of
-          id[54] to id[56] are vendor specific. */
-       return (id[53] & 0x01) && /* Current translation valid */
-               id[54] &&  /* cylinders in current translation */
-               id[55] &&  /* heads in current translation */
-               id[55] <= 16 &&
-               id[56];    /* sectors in current translation */
+          id[ATA_ID_CUR_CYLS] to id[ATA_ID_CUR_SECTORS] are vendor specific. */
+       return (id[ATA_ID_FIELD_VALID] & 1) && /* Current translation valid */
+               id[ATA_ID_CUR_CYLS] &&  /* cylinders in current translation */
+               id[ATA_ID_CUR_HEADS] &&  /* heads in current translation */
+               id[ATA_ID_CUR_HEADS] <= 16 &&
+               id[ATA_ID_CUR_SECTORS];    /* sectors in current translation */
 }
 
 static inline int ata_id_is_cfa(const u16 *id)
 {
-       u16 v = id[0];
-       if (v == 0x848A)        /* Standard CF */
+       if (id[ATA_ID_CONFIG] == 0x848A)        /* Standard CF */
                return 1;
        /* Could be CF hiding as standard ATA */
-       if (ata_id_major_version(id) >= 3 &&  id[82] != 0xFFFF &&
-                       (id[82] & ( 1 << 2)))
+       if (ata_id_major_version(id) >= 3 &&
+           id[ATA_ID_COMMAND_SET_1] != 0xFFFF &&
+          (id[ATA_ID_COMMAND_SET_1] & (1 << 2)))
                return 1;
        return 0;
 }
@@ -632,21 +695,21 @@ static inline int ata_drive_40wire(const u16 *dev_id)
 {
        if (ata_id_is_sata(dev_id))
                return 0;       /* SATA */
-       if ((dev_id[93] & 0xE000) == 0x6000)
+       if ((dev_id[ATA_ID_HW_CONFIG] & 0xE000) == 0x6000)
                return 0;       /* 80 wire */
        return 1;
 }
 
 static inline int ata_drive_40wire_relaxed(const u16 *dev_id)
 {
-       if ((dev_id[93] & 0x2000) == 0x2000)
+       if ((dev_id[ATA_ID_HW_CONFIG] & 0x2000) == 0x2000)
                return 0;       /* 80 wire */
        return 1;
 }
 
 static inline int atapi_cdb_len(const u16 *dev_id)
 {
-       u16 tmp = dev_id[0] & 0x3;
+       u16 tmp = dev_id[ATA_ID_CONFIG] & 0x3;
        switch (tmp) {
        case 0:         return 12;
        case 1:         return 16;
@@ -656,7 +719,7 @@ static inline int atapi_cdb_len(const u16 *dev_id)
 
 static inline int atapi_command_packet_set(const u16 *dev_id)
 {
-       return (dev_id[0] >> 8) & 0x1f;
+       return (dev_id[ATA_ID_CONFIG] >> 8) & 0x1f;
 }
 
 static inline int atapi_id_dmadir(const u16 *dev_id)
index 02673846d20539b25949c3e10356ae09e9be762b..9d1fe30b6f6c1226b7fe6e6d37937c2d50be70ac 100644 (file)
@@ -503,8 +503,19 @@ extern const kernel_cap_t __cap_init_eff_set;
 
 kernel_cap_t cap_set_effective(const kernel_cap_t pE_new);
 
-int capable(int cap);
-int __capable(struct task_struct *t, int cap);
+/**
+ * has_capability - Determine if a task has a superior capability available
+ * @t: The task in question
+ * @cap: The capability to be tested for
+ *
+ * Return true if the specified task has the given superior capability
+ * currently in effect, false if not.
+ *
+ * Note that this does not set PF_SUPERPRIV on the task.
+ */
+#define has_capability(t, cap) (security_capable((t), (cap)) == 0)
+
+extern int capable(int cap);
 
 #endif /* __KERNEL__ */
 
index 57faa60de9bd48bef32a6acf9eeff9785b09e48f..02ef8835999cf666c88bb587e47ff7104c0275ac 100644 (file)
@@ -49,6 +49,8 @@ extern unsigned long wait_for_completion_timeout(struct completion *x,
                                                   unsigned long timeout);
 extern unsigned long wait_for_completion_interruptible_timeout(
                        struct completion *x, unsigned long timeout);
+extern bool try_wait_for_completion(struct completion *x);
+extern bool completion_done(struct completion *x);
 
 extern void complete(struct completion *);
 extern void complete_all(struct completion *);
@@ -56,48 +58,4 @@ extern void complete_all(struct completion *);
 #define INIT_COMPLETION(x)     ((x).done = 0)
 
 
-/**
- *     try_wait_for_completion - try to decrement a completion without blocking
- *     @x:     completion structure
- *
- *     Returns: 0 if a decrement cannot be done without blocking
- *              1 if a decrement succeeded.
- *
- *     If a completion is being used as a counting completion,
- *     attempt to decrement the counter without blocking. This
- *     enables us to avoid waiting if the resource the completion
- *     is protecting is not available.
- */
-static inline bool try_wait_for_completion(struct completion *x)
-{
-       int ret = 1;
-
-       spin_lock_irq(&x->wait.lock);
-       if (!x->done)
-               ret = 0;
-       else
-               x->done--;
-       spin_unlock_irq(&x->wait.lock);
-       return ret;
-}
-
-/**
- *     completion_done - Test to see if a completion has any waiters
- *     @x:     completion structure
- *
- *     Returns: 0 if there are waiters (wait_for_completion() in progress)
- *              1 if there are no waiters.
- *
- */
-static inline bool completion_done(struct completion *x)
-{
-       int ret = 1;
-
-       spin_lock_irq(&x->wait.lock);
-       if (!x->done)
-               ret = 0;
-       spin_unlock_irq(&x->wait.lock);
-       return ret;
-}
-
 #endif
index f5abd1306638379ecd609512cc742b8af53169e3..27e772cefb6a5b88e7f8605b3fb817c341d12e4a 100644 (file)
@@ -34,6 +34,27 @@ enum fid_type {
         */
        FILEID_INO32_GEN_PARENT = 2,
 
+       /*
+        * 64 bit object ID, 64 bit root object ID,
+        * 32 bit generation number.
+        */
+       FILEID_BTRFS_WITHOUT_PARENT = 0x4d,
+
+       /*
+        * 64 bit object ID, 64 bit root object ID,
+        * 32 bit generation number,
+        * 64 bit parent object ID, 32 bit parent generation.
+        */
+       FILEID_BTRFS_WITH_PARENT = 0x4e,
+
+       /*
+        * 64 bit object ID, 64 bit root object ID,
+        * 32 bit generation number,
+        * 64 bit parent object ID, 32 bit parent generation,
+        * 64 bit parent root object ID.
+        */
+       FILEID_BTRFS_WITH_PARENT_ROOT = 0x4f,
+
        /*
         * 32 bit block number, 16 bit partition reference,
         * 16 bit unused, 32 bit generation number.
index 3b8870e32afdd14b8166dd876762c0986cafd4ab..531ccd5f5960b0fe5818fdb768d3beb6bd3f3ea7 100644 (file)
@@ -976,6 +976,9 @@ static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch,
 
 /* drivers/video/fb_defio.c */
 extern void fb_deferred_io_init(struct fb_info *info);
+extern void fb_deferred_io_open(struct fb_info *info,
+                               struct inode *inode,
+                               struct file *file);
 extern void fb_deferred_io_cleanup(struct fb_info *info);
 extern int fb_deferred_io_fsync(struct file *file, struct dentry *dentry,
                                int datasync);
index f368d041e02d1f41ccb36bda3a4c5da59c65df3d..bb384068272e1ef5ef9f4aa4a04572e48dcbfca5 100644 (file)
@@ -98,6 +98,27 @@ static inline void tracer_disable(void)
 #endif
 }
 
+/* Ftrace disable/restore without lock. Some synchronization mechanism
+ * must be used to prevent ftrace_enabled to be changed between
+ * disable/restore. */
+static inline int __ftrace_enabled_save(void)
+{
+#ifdef CONFIG_FTRACE
+       int saved_ftrace_enabled = ftrace_enabled;
+       ftrace_enabled = 0;
+       return saved_ftrace_enabled;
+#else
+       return 0;
+#endif
+}
+
+static inline void __ftrace_enabled_restore(int enabled)
+{
+#ifdef CONFIG_FTRACE
+       ftrace_enabled = enabled;
+#endif
+}
+
 #ifdef CONFIG_FRAME_POINTER
 /* TODO: need to fix this for ARM */
 # define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0))
index e157c1399b61c691b9b7ee192556cbbec74f2f03..5028e0b6082b55cb20c4537fdbe8daa13361907a 100644 (file)
@@ -74,6 +74,7 @@
 #define ETH_P_ATMFATE  0x8884          /* Frame-based ATM Transport
                                         * over Ethernet
                                         */
+#define ETH_P_PAE      0x888E          /* Port Access Entity (IEEE 802.1X) */
 #define ETH_P_AOE      0x88A2          /* ATA over Ethernet            */
 #define ETH_P_TIPC     0x88CA          /* TIPC                         */
 
index 794b8daa9378e6647064f34174b6849ba50bb2a8..17ca64b5a66cc253f9284e51e4e8c7c3e8e50544 100644 (file)
 #ifndef __LINUX_IVTV_H__
 #define __LINUX_IVTV_H__
 
-#ifdef __KERNEL__
-#include <linux/compiler.h> /* need __user */
-#else
-#define __user
-#endif
+#include <linux/compiler.h>
 #include <linux/types.h>
 
 /* ivtv knows several distinct output modes: MPEG streaming,
index e980ba62ddcc23f405fa06a91d512bb25193312b..e20af47b59ad5df5d84224e75fa89f1173ab7dba 100644 (file)
 #ifndef __LINUX_IVTVFB_H__
 #define __LINUX_IVTVFB_H__
 
-#ifdef __KERNEL__
-#include <linux/compiler.h> /* need __user */
-#else
-#define __user
-#endif
+#include <linux/compiler.h>
 #include <linux/types.h>
 
 /* Framebuffer external API */
index 32110cede64fd23554f1c8c5a24233d5a63f14ab..17f76fc0517377094cf318a544eb55b2e8eaeb56 100644 (file)
@@ -25,8 +25,8 @@
 #error KEXEC_CONTROL_MEMORY_LIMIT not defined
 #endif
 
-#ifndef KEXEC_CONTROL_CODE_SIZE
-#error KEXEC_CONTROL_CODE_SIZE not defined
+#ifndef KEXEC_CONTROL_PAGE_SIZE
+#error KEXEC_CONTROL_PAGE_SIZE not defined
 #endif
 
 #ifndef KEXEC_ARCH
index fa651609b65dbc928a1a3d20035c29b42a1a8947..72a15dc26bbf399bb891f01f740283e723929b33 100644 (file)
@@ -73,7 +73,7 @@ extern unsigned int kobjsize(const void *objp);
 #endif
 
 /*
- * vm_flags..
+ * vm_flags in vm_area_struct, see mm_types.h.
  */
 #define VM_READ                0x00000001      /* currently active flags */
 #define VM_WRITE       0x00000002
index 386edbe2cb4e98b1a01767e15978b02df896d895..bf334138c7c148da4c9ec7b409254045de0d327b 100644 (file)
@@ -113,7 +113,7 @@ struct vm_area_struct {
        struct vm_area_struct *vm_next;
 
        pgprot_t vm_page_prot;          /* Access permissions of this VMA. */
-       unsigned long vm_flags;         /* Flags, listed below. */
+       unsigned long vm_flags;         /* Flags, see mm.h. */
 
        struct rb_node vm_rb;
 
index 3ba25065fa96b0f3907447f20fda02a8ea7e840c..8837928fbf33744249765eaedab779494a452d92 100644 (file)
@@ -57,6 +57,15 @@ static inline acpi_status pcie_osc_support_set(u32 flags)
 {
        return __pci_osc_support_set(flags, PCI_EXPRESS_ROOT_HID_STRING);
 }
+static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev)
+{
+       /* Find root host bridge */
+       while (pdev->bus->self)
+               pdev = pdev->bus->self;
+
+       return acpi_get_pci_rootbridge_handle(pci_domain_nr(pdev->bus),
+                       pdev->bus->number);
+}
 #else
 #if !defined(AE_ERROR)
 typedef u32            acpi_status;
@@ -66,6 +75,8 @@ static inline acpi_status pci_osc_control_set(acpi_handle handle, u32 flags)
 {return AE_ERROR;}
 static inline acpi_status pci_osc_support_set(u32 flags) {return AE_ERROR;} 
 static inline acpi_status pcie_osc_support_set(u32 flags) {return AE_ERROR;}
+static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev)
+{ return NULL; }
 #endif
 
 #endif /* _PCI_ACPI_H_ */
index 9ec2bcce8e8385d3e192f8b7c835a2062c592314..f1624b3967548fc116211aee27114e65e91f5d36 100644 (file)
 #define PCI_DEVICE_ID_INTEL_ICH10_3    0x3a1a
 #define PCI_DEVICE_ID_INTEL_ICH10_4    0x3a30
 #define PCI_DEVICE_ID_INTEL_ICH10_5    0x3a60
+#define PCI_DEVICE_ID_INTEL_PCH_0      0x3b10
+#define PCI_DEVICE_ID_INTEL_PCH_1      0x3b11
+#define PCI_DEVICE_ID_INTEL_PCH_2      0x3b30
 #define PCI_DEVICE_ID_INTEL_IOAT_SNB   0x402f
 #define PCI_DEVICE_ID_INTEL_5100_16    0x65f0
 #define PCI_DEVICE_ID_INTEL_5100_21    0x65f5
index 22921ac4cfd948b88e10a06c0725b33363b38caf..d7e98ff8021eb3bfc38e4c851b425c7eac5c097f 100644 (file)
@@ -161,4 +161,13 @@ pid_t pid_vnr(struct pid *pid);
                        }                                               \
        } while (0)
 
+#define do_each_pid_thread(pid, type, task)                            \
+       do_each_pid_task(pid, type, task) {                             \
+               struct task_struct *tg___ = task;                       \
+               do {
+
+#define while_each_pid_thread(pid, type, task)                         \
+               } while_each_thread(tg___, task);                       \
+               task = tg___;                                           \
+       } while_each_pid_task(pid, type, task)
 #endif /* _LINUX_PID_H */
index b93b541cf111d08701c40939b9f201429a213e56..988e55fe649b8e7bcf8c6a325ac29c5b59edab8b 100644 (file)
@@ -59,6 +59,7 @@ extern void machine_crash_shutdown(struct pt_regs *);
  * Architecture independent implemenations of sys_reboot commands.
  */
 
+extern void kernel_restart_prepare(char *cmd);
 extern void kernel_restart(char *cmd);
 extern void kernel_halt(void);
 extern void kernel_power_off(void);
index 741d1a62cc3f28e68ff4ce0f2e0ac5ef636aabb7..4cd64b0d9825a6b2bbe33b9a584b1233a03ac54d 100644 (file)
@@ -49,6 +49,7 @@ enum rfkill_state {
        RFKILL_STATE_SOFT_BLOCKED = 0,  /* Radio output blocked */
        RFKILL_STATE_UNBLOCKED    = 1,  /* Radio output allowed */
        RFKILL_STATE_HARD_BLOCKED = 2,  /* Output blocked, non-overrideable */
+       RFKILL_STATE_MAX,               /* marker for last valid state */
 };
 
 /*
@@ -110,12 +111,14 @@ struct rfkill {
 };
 #define to_rfkill(d)   container_of(d, struct rfkill, dev)
 
-struct rfkill *rfkill_allocate(struct device *parent, enum rfkill_type type);
+struct rfkill * __must_check rfkill_allocate(struct device *parent,
+                                            enum rfkill_type type);
 void rfkill_free(struct rfkill *rfkill);
-int rfkill_register(struct rfkill *rfkill);
+int __must_check rfkill_register(struct rfkill *rfkill);
 void rfkill_unregister(struct rfkill *rfkill);
 
 int rfkill_force_state(struct rfkill *rfkill, enum rfkill_state state);
+int rfkill_set_default(enum rfkill_type type, enum rfkill_state state);
 
 /**
  * rfkill_state_complement - return complementar state
index 69407f85e10b32daa4bd8ac82f88d43e36b82f78..fed6f5e0b41139070dd9c99b84ee324e7254f63f 100644 (file)
@@ -102,7 +102,7 @@ int try_to_unmap(struct page *, int ignore_refs);
  * Called from mm/filemap_xip.c to unmap empty zero page
  */
 pte_t *page_check_address(struct page *, struct mm_struct *,
-                               unsigned long, spinlock_t **);
+                               unsigned long, spinlock_t **, int);
 
 /*
  * Used by swapoff to help locate where page is expected in vma.
index fd96e7f8a6f9c9ecad138a0eaae84c5f6c82dc64..80c4d002864cb2f3e9db8ebb575de2baeafe47c8 100644 (file)
@@ -46,8 +46,8 @@ struct audit_krule;
  */
 extern int cap_capable(struct task_struct *tsk, int cap);
 extern int cap_settime(struct timespec *ts, struct timezone *tz);
-extern int cap_ptrace(struct task_struct *parent, struct task_struct *child,
-                     unsigned int mode);
+extern int cap_ptrace_may_access(struct task_struct *child, unsigned int mode);
+extern int cap_ptrace_traceme(struct task_struct *parent);
 extern int cap_capget(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted);
 extern int cap_capset_check(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted);
 extern void cap_capset_set(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted);
@@ -1157,17 +1157,24 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
  *     @alter contains the flag indicating whether changes are to be made.
  *     Return 0 if permission is granted.
  *
- * @ptrace:
- *     Check permission before allowing the @parent process to trace the
+ * @ptrace_may_access:
+ *     Check permission before allowing the current process to trace the
  *     @child process.
  *     Security modules may also want to perform a process tracing check
  *     during an execve in the set_security or apply_creds hooks of
  *     binprm_security_ops if the process is being traced and its security
  *     attributes would be changed by the execve.
- *     @parent contains the task_struct structure for parent process.
- *     @child contains the task_struct structure for child process.
+ *     @child contains the task_struct structure for the target process.
  *     @mode contains the PTRACE_MODE flags indicating the form of access.
  *     Return 0 if permission is granted.
+ * @ptrace_traceme:
+ *     Check that the @parent process has sufficient permission to trace the
+ *     current process before allowing the current process to present itself
+ *     to the @parent process for tracing.
+ *     The parent process will still have to undergo the ptrace_may_access
+ *     checks before it is allowed to trace this one.
+ *     @parent contains the task_struct structure for debugger process.
+ *     Return 0 if permission is granted.
  * @capget:
  *     Get the @effective, @inheritable, and @permitted capability sets for
  *     the @target process.  The hook may also perform permission checking to
@@ -1287,8 +1294,8 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
 struct security_operations {
        char name[SECURITY_NAME_MAX + 1];
 
-       int (*ptrace) (struct task_struct *parent, struct task_struct *child,
-                      unsigned int mode);
+       int (*ptrace_may_access) (struct task_struct *child, unsigned int mode);
+       int (*ptrace_traceme) (struct task_struct *parent);
        int (*capget) (struct task_struct *target,
                       kernel_cap_t *effective,
                       kernel_cap_t *inheritable, kernel_cap_t *permitted);
@@ -1560,8 +1567,8 @@ extern struct dentry *securityfs_create_dir(const char *name, struct dentry *par
 extern void securityfs_remove(struct dentry *dentry);
 
 /* Security operations */
-int security_ptrace(struct task_struct *parent, struct task_struct *child,
-                   unsigned int mode);
+int security_ptrace_may_access(struct task_struct *child, unsigned int mode);
+int security_ptrace_traceme(struct task_struct *parent);
 int security_capget(struct task_struct *target,
                    kernel_cap_t *effective,
                    kernel_cap_t *inheritable,
@@ -1742,11 +1749,15 @@ static inline int security_init(void)
        return 0;
 }
 
-static inline int security_ptrace(struct task_struct *parent,
-                                 struct task_struct *child,
-                                 unsigned int mode)
+static inline int security_ptrace_may_access(struct task_struct *child,
+                                            unsigned int mode)
+{
+       return cap_ptrace_may_access(child, mode);
+}
+
+static inline int security_ptrace_traceme(struct task_struct *parent)
 {
-       return cap_ptrace(parent, child, mode);
+       return cap_ptrace_traceme(parent);
 }
 
 static inline int security_capget(struct task_struct *target,
index c63435095970660b585a232bc50bcdedc94e80c4..2ce8207686e2b5a81b671533119ceb6be8461e19 100644 (file)
@@ -217,11 +217,11 @@ struct platform_hibernation_ops {
 #ifdef CONFIG_HIBERNATION
 /* kernel/power/snapshot.c */
 extern void __register_nosave_region(unsigned long b, unsigned long e, int km);
-static inline void register_nosave_region(unsigned long b, unsigned long e)
+static inline void __init register_nosave_region(unsigned long b, unsigned long e)
 {
        __register_nosave_region(b, e, 0);
 }
-static inline void register_nosave_region_late(unsigned long b, unsigned long e)
+static inline void __init register_nosave_region_late(unsigned long b, unsigned long e)
 {
        __register_nosave_region(b, e, 1);
 }
index e3579cb086e0b46a294b437198cd4eb479dcbc5a..0cbec74ec0865af37673d58cbd435d7c39475279 100644 (file)
@@ -331,6 +331,8 @@ extern int tty_write_room(struct tty_struct *tty);
 extern void tty_driver_flush_buffer(struct tty_struct *tty);
 extern void tty_throttle(struct tty_struct *tty);
 extern void tty_unthrottle(struct tty_struct *tty);
+extern int tty_do_resize(struct tty_struct *tty, struct tty_struct *real_tty,
+                                               struct winsize *ws);
 
 extern int is_current_pgrp_orphaned(void);
 extern struct pid *tty_get_pgrp(struct tty_struct *tty);
index e1065ac0d9226c1217dfd142792e3e03f9944d40..16d27944c3211af2f954fa6fff4950d3c3591812 100644 (file)
  *
  *     Optional: If not provided then the write method is called under
  *     the atomic write lock to keep it serialized with the ldisc.
+ *
+ * int (*resize)(struct tty_struct *tty, struct tty_struct *real_tty,
+ *                             unsigned int rows, unsigned int cols);
+ *
+ *     Called when a termios request is issued which changes the
+ *     requested terminal geometry.
+ *
+ *     Optional: the default action is to update the termios structure
+ *     without error. This is usually the correct behaviour. Drivers should
+ *     not force errors here if they are not resizable objects (eg a serial
+ *     line). See tty_do_resize() if you need to wrap the standard method
+ *     in your own logic - the usual case.
  */
 
 #include <linux/fs.h>
@@ -206,6 +218,8 @@ struct tty_operations {
        int (*tiocmget)(struct tty_struct *tty, struct file *file);
        int (*tiocmset)(struct tty_struct *tty, struct file *file,
                        unsigned int set, unsigned int clear);
+       int (*resize)(struct tty_struct *tty, struct tty_struct *real_tty,
+                               struct winsize *ws);
 #ifdef CONFIG_CONSOLE_POLL
        int (*poll_init)(struct tty_driver *driver, int line, char *options);
        int (*poll_get_char)(struct tty_driver *driver, int line);
index e466bd54a50e25b9a719799672e988c3a924c5c5..e65a6bed4e3ee0baf1c5185f676ff7e08b8a4351 100644 (file)
  */
 #ifndef __LINUX_VIDEODEV2_H
 #define __LINUX_VIDEODEV2_H
+
 #ifdef __KERNEL__
 #include <linux/time.h>     /* need struct timeval */
-#include <linux/compiler.h> /* need __user */
 #else
-#define __user
 #include <sys/time.h>
 #endif
+#include <linux/compiler.h>
 #include <linux/ioctl.h>
 #include <linux/types.h>
 
index 364789aae9f335c44fa9e8b71848048134ab5ea2..328eb40227277967c8a6179efb56ad14e03fc233 100644 (file)
@@ -4,9 +4,9 @@
 #include <linux/spinlock.h>
 #include <asm/page.h>          /* pgprot_t */
 
-struct vm_area_struct;
+struct vm_area_struct;         /* vma defining user mapping in mm_types.h */
 
-/* bits in vm_struct->flags */
+/* bits in flags of vmalloc's vm_struct below */
 #define VM_IOREMAP     0x00000001      /* ioremap() and friends */
 #define VM_ALLOC       0x00000002      /* vmalloc() */
 #define VM_MAP         0x00000004      /* vmap()ed pages */
index 1c78d56c57e546cf6492e075e6c5ad5604144457..1cbd0a7db4e6b73c72084c346451573b0ea2e1a8 100644 (file)
@@ -35,7 +35,6 @@ extern int fg_console, last_console, want_console;
 int vc_allocate(unsigned int console);
 int vc_cons_allocated(unsigned int console);
 int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines);
-int vc_lock_resize(struct vc_data *vc, unsigned int cols, unsigned int lines);
 void vc_deallocate(unsigned int console);
 void reset_palette(struct vc_data *vc);
 void do_blank_screen(int entering_gfx);
index ff137fd7714f2909aca78a352990366cb02005b9..0fdc3dabc9642723dfc15dc720b7d41a490015c1 100644 (file)
@@ -363,6 +363,7 @@ static inline struct ieee80211_tx_info *IEEE80211_SKB_CB(struct sk_buff *skb)
  * @RX_FLAG_TSFT: The timestamp passed in the RX status (@mactime field)
  *     is valid. This is useful in monitor mode and necessary for beacon frames
  *     to enable IBSS merging.
+ * @RX_FLAG_SHORTPRE: Short preamble was used for this frame
  */
 enum mac80211_rx_flags {
        RX_FLAG_MMIC_ERROR      = 1<<0,
@@ -373,6 +374,7 @@ enum mac80211_rx_flags {
        RX_FLAG_FAILED_FCS_CRC  = 1<<5,
        RX_FLAG_FAILED_PLCP_CRC = 1<<6,
        RX_FLAG_TSFT            = 1<<7,
+       RX_FLAG_SHORTPRE        = 1<<8
 };
 
 /**
@@ -1556,16 +1558,6 @@ ieee80211_get_buffered_bc(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
  */
 unsigned int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb);
 
-/**
- * ieee80211_get_hdrlen - get header length from frame control
- *
- * This function returns the 802.11 header length in bytes (not including
- * encryption headers.)
- *
- * @fc: the frame control field (in CPU endianness)
- */
-int ieee80211_get_hdrlen(u16 fc);
-
 /**
  * ieee80211_hdrlen - get header length in bytes from frame control
  * @fc: frame control field in little-endian format
@@ -1607,6 +1599,16 @@ void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue);
  */
 void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue);
 
+/**
+ * ieee80211_queue_stopped - test status of the queue
+ * @hw: pointer as obtained from ieee80211_alloc_hw().
+ * @queue: queue number (counted from zero).
+ *
+ * Drivers should use this function instead of netif_stop_queue.
+ */
+
+int ieee80211_queue_stopped(struct ieee80211_hw *hw, int queue);
+
 /**
  * ieee80211_stop_queues - stop all queues
  * @hw: pointer as obtained from ieee80211_alloc_hw().
index 84d25f2e6188764931268b5b6b6a3b70e4516c18..b1d2cfea89c5221b568a709c34ccb7031dfeff69 100644 (file)
@@ -193,6 +193,11 @@ static inline struct Qdisc *qdisc_root(struct Qdisc *qdisc)
        return qdisc->dev_queue->qdisc;
 }
 
+static inline struct Qdisc *qdisc_root_sleeping(struct Qdisc *qdisc)
+{
+       return qdisc->dev_queue->qdisc_sleeping;
+}
+
 /* The qdisc root lock is a mechanism by which to top level
  * of a qdisc tree can be locked from any qdisc node in the
  * forest.  This allows changing the configuration of some
index 291d56a19167db9b8688dbbba446d051daae3b17..80b2e93c29360887eb55f65afd543c76e5b225cf 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/spinlock.h>
 #include <linux/workqueue.h>
 #include <linux/blkdev.h>
+#include <scsi/scsi.h>
 #include <asm/atomic.h>
 
 struct request_queue;
@@ -426,7 +427,7 @@ static inline int scsi_device_enclosure(struct scsi_device *sdev)
 
 static inline int scsi_device_protection(struct scsi_device *sdev)
 {
-       return sdev->inquiry[5] & (1<<0);
+       return sdev->scsi_level > SCSI_2 && sdev->inquiry[5] & (1<<0);
 }
 
 #define MODULE_ALIAS_SCSI_DEVICE(type) \
index b678803deccf964f5a2bf29afee202aaf3d75965..c11da38837e5b7bef935297d3ec0da85c90e1fd7 100644 (file)
@@ -558,17 +558,6 @@ config SYSCTL_SYSCALL
 
          If unsure say Y here.
 
-config SYSCTL_SYSCALL_CHECK
-       bool "Sysctl checks" if EMBEDDED
-       depends on SYSCTL_SYSCALL
-       default y
-       ---help---
-         sys_sysctl uses binary paths that have been found challenging
-         to properly maintain and use. This enables checks that help
-         you to keep things correct.
-
-         If unsure say Y here.
-
 config KALLSYMS
         bool "Load all symbols for debugging/ksymoops" if EMBEDDED
         default y
index 0101e847603e675d46cbfd53154455e3ba8943de..33e51e78c2d8672559fa4aa6d5dcc4d38d113627 100644 (file)
@@ -486,17 +486,22 @@ asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data)
        return ret;
 }
 
-int __capable(struct task_struct *t, int cap)
+/**
+ * capable - Determine if the current task has a superior capability in effect
+ * @cap: The capability to be tested for
+ *
+ * Return true if the current task has the given superior capability currently
+ * available for use, false if not.
+ *
+ * This sets PF_SUPERPRIV on the task if the capability is available on the
+ * assumption that it's about to be used.
+ */
+int capable(int cap)
 {
-       if (security_capable(t, cap) == 0) {
-               t->flags |= PF_SUPERPRIV;
+       if (has_capability(current, cap)) {
+               current->flags |= PF_SUPERPRIV;
                return 1;
        }
        return 0;
 }
-
-int capable(int cap)
-{
-       return __capable(current, cap);
-}
 EXPORT_SYMBOL(capable);
index c8a4370e2a34e94b2e391fada22fec051b162195..59f3f0df35d4e04365480f5362aac097a236b63d 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/slab.h>
 #include <linux/fs.h>
 #include <linux/kexec.h>
-#include <linux/spinlock.h>
+#include <linux/mutex.h>
 #include <linux/list.h>
 #include <linux/highmem.h>
 #include <linux/syscalls.h>
@@ -77,7 +77,7 @@ int kexec_should_crash(struct task_struct *p)
  *
  * The code for the transition from the current kernel to the
  * the new kernel is placed in the control_code_buffer, whose size
- * is given by KEXEC_CONTROL_CODE_SIZE.  In the best case only a single
+ * is given by KEXEC_CONTROL_PAGE_SIZE.  In the best case only a single
  * page of memory is necessary, but some architectures require more.
  * Because this memory must be identity mapped in the transition from
  * virtual to physical addresses it must live in the range
@@ -242,7 +242,7 @@ static int kimage_normal_alloc(struct kimage **rimage, unsigned long entry,
         */
        result = -ENOMEM;
        image->control_code_page = kimage_alloc_control_pages(image,
-                                          get_order(KEXEC_CONTROL_CODE_SIZE));
+                                          get_order(KEXEC_CONTROL_PAGE_SIZE));
        if (!image->control_code_page) {
                printk(KERN_ERR "Could not allocate control_code_buffer\n");
                goto out;
@@ -317,7 +317,7 @@ static int kimage_crash_alloc(struct kimage **rimage, unsigned long entry,
         */
        result = -ENOMEM;
        image->control_code_page = kimage_alloc_control_pages(image,
-                                          get_order(KEXEC_CONTROL_CODE_SIZE));
+                                          get_order(KEXEC_CONTROL_PAGE_SIZE));
        if (!image->control_code_page) {
                printk(KERN_ERR "Could not allocate control_code_buffer\n");
                goto out;
@@ -924,19 +924,14 @@ static int kimage_load_segment(struct kimage *image,
  */
 struct kimage *kexec_image;
 struct kimage *kexec_crash_image;
-/*
- * A home grown binary mutex.
- * Nothing can wait so this mutex is safe to use
- * in interrupt context :)
- */
-static int kexec_lock;
+
+static DEFINE_MUTEX(kexec_mutex);
 
 asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments,
                                struct kexec_segment __user *segments,
                                unsigned long flags)
 {
        struct kimage **dest_image, *image;
-       int locked;
        int result;
 
        /* We only trust the superuser with rebooting the system. */
@@ -972,8 +967,7 @@ asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments,
         *
         * KISS: always take the mutex.
         */
-       locked = xchg(&kexec_lock, 1);
-       if (locked)
+       if (!mutex_trylock(&kexec_mutex))
                return -EBUSY;
 
        dest_image = &kexec_image;
@@ -1015,8 +1009,7 @@ asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments,
        image = xchg(dest_image, image);
 
 out:
-       locked = xchg(&kexec_lock, 0); /* Release the mutex */
-       BUG_ON(!locked);
+       mutex_unlock(&kexec_mutex);
        kimage_free(image);
 
        return result;
@@ -1063,10 +1056,7 @@ asmlinkage long compat_sys_kexec_load(unsigned long entry,
 
 void crash_kexec(struct pt_regs *regs)
 {
-       int locked;
-
-
-       /* Take the kexec_lock here to prevent sys_kexec_load
+       /* Take the kexec_mutex here to prevent sys_kexec_load
         * running on one cpu from replacing the crash kernel
         * we are using after a panic on a different cpu.
         *
@@ -1074,8 +1064,7 @@ void crash_kexec(struct pt_regs *regs)
         * of memory the xchg(&kexec_crash_image) would be
         * sufficient.  But since I reuse the memory...
         */
-       locked = xchg(&kexec_lock, 1);
-       if (!locked) {
+       if (mutex_trylock(&kexec_mutex)) {
                if (kexec_crash_image) {
                        struct pt_regs fixed_regs;
                        crash_setup_regs(&fixed_regs, regs);
@@ -1083,8 +1072,7 @@ void crash_kexec(struct pt_regs *regs)
                        machine_crash_shutdown(&fixed_regs);
                        machine_kexec(kexec_crash_image);
                }
-               locked = xchg(&kexec_lock, 0);
-               BUG_ON(!locked);
+               mutex_unlock(&kexec_mutex);
        }
 }
 
@@ -1426,25 +1414,23 @@ static int __init crash_save_vmcoreinfo_init(void)
 
 module_init(crash_save_vmcoreinfo_init)
 
-/**
- *     kernel_kexec - reboot the system
- *
- *     Move into place and start executing a preloaded standalone
- *     executable.  If nothing was preloaded return an error.
+/*
+ * Move into place and start executing a preloaded standalone
+ * executable.  If nothing was preloaded return an error.
  */
 int kernel_kexec(void)
 {
        int error = 0;
 
-       if (xchg(&kexec_lock, 1))
+       if (!mutex_trylock(&kexec_mutex))
                return -EBUSY;
        if (!kexec_image) {
                error = -EINVAL;
                goto Unlock;
        }
 
-       if (kexec_image->preserve_context) {
 #ifdef CONFIG_KEXEC_JUMP
+       if (kexec_image->preserve_context) {
                mutex_lock(&pm_mutex);
                pm_prepare_console();
                error = freeze_processes();
@@ -1459,6 +1445,7 @@ int kernel_kexec(void)
                error = disable_nonboot_cpus();
                if (error)
                        goto Resume_devices;
+               device_pm_lock();
                local_irq_disable();
                /* At this point, device_suspend() has been called,
                 * but *not* device_power_down(). We *must*
@@ -1470,26 +1457,22 @@ int kernel_kexec(void)
                error = device_power_down(PMSG_FREEZE);
                if (error)
                        goto Enable_irqs;
-               save_processor_state();
+       } else
 #endif
-       } else {
-               blocking_notifier_call_chain(&reboot_notifier_list,
-                                            SYS_RESTART, NULL);
-               system_state = SYSTEM_RESTART;
-               device_shutdown();
-               sysdev_shutdown();
+       {
+               kernel_restart_prepare(NULL);
                printk(KERN_EMERG "Starting new kernel\n");
                machine_shutdown();
        }
 
        machine_kexec(kexec_image);
 
-       if (kexec_image->preserve_context) {
 #ifdef CONFIG_KEXEC_JUMP
-               restore_processor_state();
+       if (kexec_image->preserve_context) {
                device_power_up(PMSG_RESTORE);
  Enable_irqs:
                local_irq_enable();
+               device_pm_unlock();
                enable_nonboot_cpus();
  Resume_devices:
                device_resume(PMSG_RESTORE);
@@ -1499,11 +1482,10 @@ int kernel_kexec(void)
  Restore_console:
                pm_restore_console();
                mutex_unlock(&pm_mutex);
-#endif
        }
+#endif
 
  Unlock:
-       xchg(&kexec_lock, 0);
-
+       mutex_unlock(&kexec_mutex);
        return error;
 }
index 1aa91fd6b06ec341897646f2322e35920640f448..3bfb1877a00372b0a99e4a37d1686a220251b910 100644 (file)
@@ -1759,11 +1759,10 @@ static void check_chain_key(struct task_struct *curr)
                hlock = curr->held_locks + i;
                if (chain_key != hlock->prev_chain_key) {
                        debug_locks_off();
-                       printk("hm#1, depth: %u [%u], %016Lx != %016Lx\n",
+                       WARN(1, "hm#1, depth: %u [%u], %016Lx != %016Lx\n",
                                curr->lockdep_depth, i,
                                (unsigned long long)chain_key,
                                (unsigned long long)hlock->prev_chain_key);
-                       WARN_ON(1);
                        return;
                }
                id = hlock->class_idx - 1;
@@ -1778,11 +1777,10 @@ static void check_chain_key(struct task_struct *curr)
        }
        if (chain_key != curr->curr_chain_key) {
                debug_locks_off();
-               printk("hm#2, depth: %u [%u], %016Lx != %016Lx\n",
+               WARN(1, "hm#2, depth: %u [%u], %016Lx != %016Lx\n",
                        curr->lockdep_depth, i,
                        (unsigned long long)chain_key,
                        (unsigned long long)curr->curr_chain_key);
-               WARN_ON(1);
        }
 #endif
 }
@@ -2584,7 +2582,7 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
        hlock->trylock = trylock;
        hlock->read = read;
        hlock->check = check;
-       hlock->hardirqs_off = hardirqs_off;
+       hlock->hardirqs_off = !!hardirqs_off;
 #ifdef CONFIG_LOCK_STAT
        hlock->waittime_stamp = 0;
        hlock->holdtime_stamp = sched_clock();
index 55db193d366dcd8489290883f411c4938f45df0e..56b196932c081e915568d4fef27a92c08e129758 100644 (file)
@@ -50,8 +50,21 @@ extern unsigned int nr_process_chains;
 extern unsigned int max_lockdep_depth;
 extern unsigned int max_recursion_depth;
 
+#ifdef CONFIG_PROVE_LOCKING
 extern unsigned long lockdep_count_forward_deps(struct lock_class *);
 extern unsigned long lockdep_count_backward_deps(struct lock_class *);
+#else
+static inline unsigned long
+lockdep_count_forward_deps(struct lock_class *class)
+{
+       return 0;
+}
+static inline unsigned long
+lockdep_count_backward_deps(struct lock_class *class)
+{
+       return 0;
+}
+#endif
 
 #ifdef CONFIG_DEBUG_LOCKDEP
 /*
index fa19aee604c28233822701ac5f86bcb288ffe239..4b194d34d77f3b2d665c7c03734c9591c73dc71f 100644 (file)
@@ -82,7 +82,6 @@ static void print_name(struct seq_file *m, struct lock_class *class)
 
 static int l_show(struct seq_file *m, void *v)
 {
-       unsigned long nr_forward_deps, nr_backward_deps;
        struct lock_class *class = v;
        struct lock_list *entry;
        char c1, c2, c3, c4;
@@ -96,11 +95,10 @@ static int l_show(struct seq_file *m, void *v)
 #ifdef CONFIG_DEBUG_LOCKDEP
        seq_printf(m, " OPS:%8ld", class->ops);
 #endif
-       nr_forward_deps = lockdep_count_forward_deps(class);
-       seq_printf(m, " FD:%5ld", nr_forward_deps);
-
-       nr_backward_deps = lockdep_count_backward_deps(class);
-       seq_printf(m, " BD:%5ld", nr_backward_deps);
+#ifdef CONFIG_PROVE_LOCKING
+       seq_printf(m, " FD:%5ld", lockdep_count_forward_deps(class));
+       seq_printf(m, " BD:%5ld", lockdep_count_backward_deps(class));
+#endif
 
        get_usage_chars(class, &c1, &c2, &c3, &c4);
        seq_printf(m, " %c%c%c%c", c1, c2, c3, c4);
@@ -325,7 +323,9 @@ static int lockdep_stats_show(struct seq_file *m, void *v)
                if (class->usage_mask & LOCKF_ENABLED_HARDIRQS_READ)
                        nr_hardirq_read_unsafe++;
 
+#ifdef CONFIG_PROVE_LOCKING
                sum_forward_deps += lockdep_count_forward_deps(class);
+#endif
        }
 #ifdef CONFIG_DEBUG_LOCKDEP
        DEBUG_LOCKS_WARN_ON(debug_atomic_read(&nr_unused_locks) != nr_unused);
index 082b3fcb32a09e2110c97b6c7527d5f3eca137b7..356699a96d565faa2e034253f9178c7d0aa2829d 100644 (file)
@@ -140,7 +140,7 @@ int __ptrace_may_access(struct task_struct *task, unsigned int mode)
        if (!dumpable && !capable(CAP_SYS_PTRACE))
                return -EPERM;
 
-       return security_ptrace(current, task, mode);
+       return security_ptrace_may_access(task, mode);
 }
 
 bool ptrace_may_access(struct task_struct *task, unsigned int mode)
@@ -499,8 +499,7 @@ repeat:
                        goto repeat;
                }
 
-               ret = security_ptrace(current->parent, current,
-                                     PTRACE_MODE_ATTACH);
+               ret = security_ptrace_traceme(current->parent);
 
                /*
                 * Set the ptrace bit in the process ptrace flags.
index d601fb0406caefd39cb4eaf2dca25105f2ce3f0c..9a1ddb84e26d56e7d6b283daab1edbad20ae2042 100644 (file)
@@ -808,9 +808,9 @@ const_debug unsigned int sysctl_sched_nr_migrate = 32;
 
 /*
  * ratelimit for updating the group shares.
- * default: 0.5ms
+ * default: 0.25ms
  */
-const_debug unsigned int sysctl_sched_shares_ratelimit = 500000;
+unsigned int sysctl_sched_shares_ratelimit = 250000;
 
 /*
  * period over which we measure -rt task cpu usage in us.
@@ -4669,6 +4669,52 @@ int __sched wait_for_completion_killable(struct completion *x)
 }
 EXPORT_SYMBOL(wait_for_completion_killable);
 
+/**
+ *     try_wait_for_completion - try to decrement a completion without blocking
+ *     @x:     completion structure
+ *
+ *     Returns: 0 if a decrement cannot be done without blocking
+ *              1 if a decrement succeeded.
+ *
+ *     If a completion is being used as a counting completion,
+ *     attempt to decrement the counter without blocking. This
+ *     enables us to avoid waiting if the resource the completion
+ *     is protecting is not available.
+ */
+bool try_wait_for_completion(struct completion *x)
+{
+       int ret = 1;
+
+       spin_lock_irq(&x->wait.lock);
+       if (!x->done)
+               ret = 0;
+       else
+               x->done--;
+       spin_unlock_irq(&x->wait.lock);
+       return ret;
+}
+EXPORT_SYMBOL(try_wait_for_completion);
+
+/**
+ *     completion_done - Test to see if a completion has any waiters
+ *     @x:     completion structure
+ *
+ *     Returns: 0 if there are waiters (wait_for_completion() in progress)
+ *              1 if there are no waiters.
+ *
+ */
+bool completion_done(struct completion *x)
+{
+       int ret = 1;
+
+       spin_lock_irq(&x->wait.lock);
+       if (!x->done)
+               ret = 0;
+       spin_unlock_irq(&x->wait.lock);
+       return ret;
+}
+EXPORT_SYMBOL(completion_done);
+
 static long __sched
 sleep_on_common(wait_queue_head_t *q, int state, long timeout)
 {
@@ -5740,6 +5786,8 @@ static inline void sched_init_granularity(void)
                sysctl_sched_latency = limit;
 
        sysctl_sched_wakeup_granularity *= factor;
+
+       sysctl_sched_shares_ratelimit *= factor;
 }
 
 #ifdef CONFIG_SMP
@@ -8462,8 +8510,8 @@ struct task_group *sched_create_group(struct task_group *parent)
        WARN_ON(!parent); /* root should already exist */
 
        tg->parent = parent;
-       list_add_rcu(&tg->siblings, &parent->children);
        INIT_LIST_HEAD(&tg->children);
+       list_add_rcu(&tg->siblings, &parent->children);
        spin_unlock_irqrestore(&task_group_lock, flags);
 
        return tg;
index 6163e4cf885b90075fd2734427fac4f3f24eae1f..998ba54b4543d876a6fa82f4a41debb981923319 100644 (file)
@@ -298,7 +298,7 @@ static void __disable_runtime(struct rq *rq)
                        struct rt_rq *iter = sched_rt_period_rt_rq(rt_b, i);
                        s64 diff;
 
-                       if (iter == rt_rq)
+                       if (iter == rt_rq || iter->rt_runtime == RUNTIME_INF)
                                continue;
 
                        spin_lock(&iter->rt_runtime_lock);
index c539f60c6f41bc2b9e170b93bf66a8bca5e93ce3..e661b01d340f06a17afb6cfef13a712ae0338ff9 100644 (file)
@@ -1338,6 +1338,7 @@ int do_notify_parent(struct task_struct *tsk, int sig)
        struct siginfo info;
        unsigned long flags;
        struct sighand_struct *psig;
+       int ret = sig;
 
        BUG_ON(sig == -1);
 
@@ -1402,7 +1403,7 @@ int do_notify_parent(struct task_struct *tsk, int sig)
                 * is implementation-defined: we do (if you don't want
                 * it, just use SIG_IGN instead).
                 */
-               tsk->exit_signal = -1;
+               ret = tsk->exit_signal = -1;
                if (psig->action[SIGCHLD-1].sa.sa_handler == SIG_IGN)
                        sig = -1;
        }
@@ -1411,7 +1412,7 @@ int do_notify_parent(struct task_struct *tsk, int sig)
        __wake_up_parent(tsk, tsk->parent);
        spin_unlock_irqrestore(&psig->siglock, flags);
 
-       return sig;
+       return ret;
 }
 
 static void do_notify_parent_cldstop(struct task_struct *tsk, int why)
index 44baeea94ab906b06ff87d6bf936f8a19d71915d..29ab20749dd3da1df6bd6f03f5cdbf62ed9ae52e 100644 (file)
@@ -290,7 +290,6 @@ void __lockfunc _spin_lock_nested(spinlock_t *lock, int subclass)
        spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_);
        LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock);
 }
-
 EXPORT_SYMBOL(_spin_lock_nested);
 
 unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass)
@@ -312,7 +311,6 @@ unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclas
 #endif
        return flags;
 }
-
 EXPORT_SYMBOL(_spin_lock_irqsave_nested);
 
 void __lockfunc _spin_lock_nest_lock(spinlock_t *lock,
@@ -322,7 +320,6 @@ void __lockfunc _spin_lock_nest_lock(spinlock_t *lock,
        spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_);
        LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock);
 }
-
 EXPORT_SYMBOL(_spin_lock_nest_lock);
 
 #endif
index c01858090a981634cd31b26b439fba7b360b9ca3..038a7bc0901d20f90f841c5e4326fc1f2f2b963f 100644 (file)
@@ -169,9 +169,9 @@ asmlinkage long sys_setpriority(int which, int who, int niceval)
                                pgrp = find_vpid(who);
                        else
                                pgrp = task_pgrp(current);
-                       do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
+                       do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
                                error = set_one_prio(p, niceval, error);
-                       } while_each_pid_task(pgrp, PIDTYPE_PGID, p);
+                       } while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
                        break;
                case PRIO_USER:
                        user = current->user;
@@ -229,11 +229,11 @@ asmlinkage long sys_getpriority(int which, int who)
                                pgrp = find_vpid(who);
                        else
                                pgrp = task_pgrp(current);
-                       do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
+                       do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
                                niceval = 20 - task_nice(p);
                                if (niceval > retval)
                                        retval = niceval;
-                       } while_each_pid_task(pgrp, PIDTYPE_PGID, p);
+                       } while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
                        break;
                case PRIO_USER:
                        user = current->user;
@@ -274,7 +274,7 @@ void emergency_restart(void)
 }
 EXPORT_SYMBOL_GPL(emergency_restart);
 
-static void kernel_restart_prepare(char *cmd)
+void kernel_restart_prepare(char *cmd)
 {
        blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
        system_state = SYSTEM_RESTART;
index 800ac848554425015c626e60ce2f6a02e949c229..8b5a7d304a5f5709cfb97436396916fc074db428 100644 (file)
@@ -693,6 +693,14 @@ config LATENCYTOP
          Enable this option if you want to use the LatencyTOP tool
          to find out which userspace is blocking on what kernel operations.
 
+config SYSCTL_SYSCALL_CHECK
+       bool "Sysctl checks"
+       depends on SYSCTL_SYSCALL
+       ---help---
+         sys_sysctl uses binary paths that have been found challenging
+         to properly maintain and use. This enables checks that help
+         you to keep things correct.
+
 source kernel/trace/Kconfig
 
 config PROVIDE_OHCI1394_DMA_INIT
index 5d7b9286503ece62fc47997f8085650779e99526..97e547037084dc22fc3fd93f5fd2aacd7419db02 100644 (file)
--- a/lib/lmb.c
+++ b/lib/lmb.c
@@ -462,6 +462,8 @@ void __init lmb_enforce_memory_limit(u64 memory_limit)
        if (lmb.memory.region[0].size < lmb.rmo_size)
                lmb.rmo_size = lmb.memory.region[0].size;
 
+       memory_limit = lmb_end_of_DRAM();
+
        /* And truncate any reserves above the limit also. */
        for (i = 0; i < lmb.reserved.cnt; i++) {
                p = &lmb.reserved.region[i];
index 4af15d0340adaa7bc9cded10d36302679d86f90a..ad8eec6e44a85a9593c781ce252b127cb96992cd 100644 (file)
@@ -405,6 +405,29 @@ int __init reserve_bootmem(unsigned long addr, unsigned long size,
 }
 #endif /* !CONFIG_HAVE_ARCH_BOOTMEM_NODE */
 
+static unsigned long align_idx(struct bootmem_data *bdata, unsigned long idx,
+                       unsigned long step)
+{
+       unsigned long base = bdata->node_min_pfn;
+
+       /*
+        * Align the index with respect to the node start so that the
+        * combination of both satisfies the requested alignment.
+        */
+
+       return ALIGN(base + idx, step) - base;
+}
+
+static unsigned long align_off(struct bootmem_data *bdata, unsigned long off,
+                       unsigned long align)
+{
+       unsigned long base = PFN_PHYS(bdata->node_min_pfn);
+
+       /* Same as align_idx for byte offsets */
+
+       return ALIGN(base + off, align) - base;
+}
+
 static void * __init alloc_bootmem_core(struct bootmem_data *bdata,
                                unsigned long size, unsigned long align,
                                unsigned long goal, unsigned long limit)
@@ -441,7 +464,7 @@ static void * __init alloc_bootmem_core(struct bootmem_data *bdata,
        else
                start = ALIGN(min, step);
 
-       sidx = start - bdata->node_min_pfn;;
+       sidx = start - bdata->node_min_pfn;
        midx = max - bdata->node_min_pfn;
 
        if (bdata->hint_idx > sidx) {
@@ -450,7 +473,7 @@ static void * __init alloc_bootmem_core(struct bootmem_data *bdata,
                 * catch the fallback below.
                 */
                fallback = sidx + 1;
-               sidx = ALIGN(bdata->hint_idx, step);
+               sidx = align_idx(bdata, bdata->hint_idx, step);
        }
 
        while (1) {
@@ -459,7 +482,7 @@ static void * __init alloc_bootmem_core(struct bootmem_data *bdata,
                unsigned long eidx, i, start_off, end_off;
 find_block:
                sidx = find_next_zero_bit(bdata->node_bootmem_map, midx, sidx);
-               sidx = ALIGN(sidx, step);
+               sidx = align_idx(bdata, sidx, step);
                eidx = sidx + PFN_UP(size);
 
                if (sidx >= midx || eidx > midx)
@@ -467,15 +490,15 @@ find_block:
 
                for (i = sidx; i < eidx; i++)
                        if (test_bit(i, bdata->node_bootmem_map)) {
-                               sidx = ALIGN(i, step);
+                               sidx = align_idx(bdata, i, step);
                                if (sidx == i)
                                        sidx += step;
                                goto find_block;
                        }
 
-               if (bdata->last_end_off &&
+               if (bdata->last_end_off & (PAGE_SIZE - 1) &&
                                PFN_DOWN(bdata->last_end_off) + 1 == sidx)
-                       start_off = ALIGN(bdata->last_end_off, align);
+                       start_off = align_off(bdata, bdata->last_end_off, align);
                else
                        start_off = PFN_PHYS(sidx);
 
@@ -499,7 +522,7 @@ find_block:
        }
 
        if (fallback) {
-               sidx = ALIGN(fallback - 1, step);
+               sidx = align_idx(bdata, fallback - 1, step);
                fallback = 0;
                goto find_block;
        }
index 380ab402d71160a05d82a00598e5e35efeb5f116..b5167dfb2f2d65366004963558dfa765643423b8 100644 (file)
@@ -15,6 +15,8 @@
 #include <linux/rmap.h>
 #include <linux/mmu_notifier.h>
 #include <linux/sched.h>
+#include <linux/seqlock.h>
+#include <linux/mutex.h>
 #include <asm/tlbflush.h>
 #include <asm/io.h>
 
  * We do use our own empty page to avoid interference with other users
  * of ZERO_PAGE(), such as /dev/zero
  */
+static DEFINE_MUTEX(xip_sparse_mutex);
+static seqcount_t xip_sparse_seq = SEQCNT_ZERO;
 static struct page *__xip_sparse_page;
 
+/* called under xip_sparse_mutex */
 static struct page *xip_sparse_page(void)
 {
        if (!__xip_sparse_page) {
                struct page *page = alloc_page(GFP_HIGHUSER | __GFP_ZERO);
 
-               if (page) {
-                       static DEFINE_SPINLOCK(xip_alloc_lock);
-                       spin_lock(&xip_alloc_lock);
-                       if (!__xip_sparse_page)
-                               __xip_sparse_page = page;
-                       else
-                               __free_page(page);
-                       spin_unlock(&xip_alloc_lock);
-               }
+               if (page)
+                       __xip_sparse_page = page;
        }
        return __xip_sparse_page;
 }
@@ -174,18 +172,23 @@ __xip_unmap (struct address_space * mapping,
        pte_t pteval;
        spinlock_t *ptl;
        struct page *page;
+       unsigned count;
+       int locked = 0;
+
+       count = read_seqcount_begin(&xip_sparse_seq);
 
        page = __xip_sparse_page;
        if (!page)
                return;
 
+retry:
        spin_lock(&mapping->i_mmap_lock);
        vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) {
                mm = vma->vm_mm;
                address = vma->vm_start +
                        ((pgoff - vma->vm_pgoff) << PAGE_SHIFT);
                BUG_ON(address < vma->vm_start || address >= vma->vm_end);
-               pte = page_check_address(page, mm, address, &ptl);
+               pte = page_check_address(page, mm, address, &ptl, 1);
                if (pte) {
                        /* Nuke the page table entry. */
                        flush_cache_page(vma, address, pte_pfn(*pte));
@@ -198,6 +201,14 @@ __xip_unmap (struct address_space * mapping,
                }
        }
        spin_unlock(&mapping->i_mmap_lock);
+
+       if (locked) {
+               mutex_unlock(&xip_sparse_mutex);
+       } else if (read_seqcount_retry(&xip_sparse_seq, count)) {
+               mutex_lock(&xip_sparse_mutex);
+               locked = 1;
+               goto retry;
+       }
 }
 
 /*
@@ -218,7 +229,7 @@ static int xip_file_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
        int error;
 
        /* XXX: are VM_FAULT_ codes OK? */
-
+again:
        size = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
        if (vmf->pgoff >= size)
                return VM_FAULT_SIGBUS;
@@ -237,8 +248,10 @@ static int xip_file_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
                int err;
 
                /* maybe shared writable, allocate new block */
+               mutex_lock(&xip_sparse_mutex);
                error = mapping->a_ops->get_xip_mem(mapping, vmf->pgoff, 1,
                                                        &xip_mem, &xip_pfn);
+               mutex_unlock(&xip_sparse_mutex);
                if (error)
                        return VM_FAULT_SIGBUS;
                /* unmap sparse mappings at pgoff from all other vmas */
@@ -252,14 +265,34 @@ found:
                BUG_ON(err);
                return VM_FAULT_NOPAGE;
        } else {
+               int err, ret = VM_FAULT_OOM;
+
+               mutex_lock(&xip_sparse_mutex);
+               write_seqcount_begin(&xip_sparse_seq);
+               error = mapping->a_ops->get_xip_mem(mapping, vmf->pgoff, 0,
+                                                       &xip_mem, &xip_pfn);
+               if (unlikely(!error)) {
+                       write_seqcount_end(&xip_sparse_seq);
+                       mutex_unlock(&xip_sparse_mutex);
+                       goto again;
+               }
+               if (error != -ENODATA)
+                       goto out;
                /* not shared and writable, use xip_sparse_page() */
                page = xip_sparse_page();
                if (!page)
-                       return VM_FAULT_OOM;
+                       goto out;
+               err = vm_insert_page(vma, (unsigned long)vmf->virtual_address,
+                                                       page);
+               if (err == -ENOMEM)
+                       goto out;
 
-               page_cache_get(page);
-               vmf->page = page;
-               return 0;
+               ret = VM_FAULT_NOPAGE;
+out:
+               write_seqcount_end(&xip_sparse_seq);
+               mutex_unlock(&xip_sparse_mutex);
+
+               return ret;
        }
 }
 
@@ -308,8 +341,10 @@ __xip_file_write(struct file *filp, const char __user *buf,
                                                &xip_mem, &xip_pfn);
                if (status == -ENODATA) {
                        /* we allocate a new page unmap it */
+                       mutex_lock(&xip_sparse_mutex);
                        status = a_ops->get_xip_mem(mapping, index, 1,
                                                        &xip_mem, &xip_pfn);
+                       mutex_unlock(&xip_sparse_mutex);
                        if (!status)
                                /* unmap page at pgoff from all other vmas */
                                __xip_unmap(mapping, index);
index 936ef2efd892029b1abf1c08c860fd40991d213d..4e0e26591dfaa6f242c4514fd83bdb54f7194b43 100644 (file)
@@ -12,7 +12,7 @@
 #include "internal.h"
 
 #ifdef CONFIG_DEBUG_MEMORY_INIT
-int __meminitdata mminit_loglevel;
+int mminit_loglevel;
 
 #ifndef SECTIONS_SHIFT
 #define SECTIONS_SHIFT 0
index 8a5467ee6265deb11a48fe9861348dd182dc9f7f..64e5b4bcd964cd912b5a5f6b22dc392621269d84 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/module.h>
 #include <linux/notifier.h>
 #include <linux/memcontrol.h>
+#include <linux/security.h>
 
 int sysctl_panic_on_oom;
 int sysctl_oom_kill_allocating_task;
@@ -128,7 +129,8 @@ unsigned long badness(struct task_struct *p, unsigned long uptime)
         * Superuser processes are usually more important, so we make it
         * less likely that we kill those.
         */
-       if (__capable(p, CAP_SYS_ADMIN) || __capable(p, CAP_SYS_RESOURCE))
+       if (has_capability(p, CAP_SYS_ADMIN) ||
+           has_capability(p, CAP_SYS_RESOURCE))
                points /= 4;
 
        /*
@@ -137,7 +139,7 @@ unsigned long badness(struct task_struct *p, unsigned long uptime)
         * tend to only have this flag set on applications they think
         * of as important.
         */
-       if (__capable(p, CAP_SYS_RAWIO))
+       if (has_capability(p, CAP_SYS_RAWIO))
                points /= 4;
 
        /*
index 1ea4e6fcee77986f673d578a42bece82a92fb81e..0383acfcb0681a877f15f59d4d712980c37e1811 100644 (file)
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -224,10 +224,14 @@ unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma)
 /*
  * Check that @page is mapped at @address into @mm.
  *
+ * If @sync is false, page_check_address may perform a racy check to avoid
+ * the page table lock when the pte is not present (helpful when reclaiming
+ * highly shared pages).
+ *
  * On success returns with pte mapped and locked.
  */
 pte_t *page_check_address(struct page *page, struct mm_struct *mm,
-                         unsigned long address, spinlock_t **ptlp)
+                         unsigned long address, spinlock_t **ptlp, int sync)
 {
        pgd_t *pgd;
        pud_t *pud;
@@ -249,7 +253,7 @@ pte_t *page_check_address(struct page *page, struct mm_struct *mm,
 
        pte = pte_offset_map(pmd, address);
        /* Make a quick check before getting the lock */
-       if (!pte_present(*pte)) {
+       if (!sync && !pte_present(*pte)) {
                pte_unmap(pte);
                return NULL;
        }
@@ -281,7 +285,7 @@ static int page_referenced_one(struct page *page,
        if (address == -EFAULT)
                goto out;
 
-       pte = page_check_address(page, mm, address, &ptl);
+       pte = page_check_address(page, mm, address, &ptl, 0);
        if (!pte)
                goto out;
 
@@ -450,7 +454,7 @@ static int page_mkclean_one(struct page *page, struct vm_area_struct *vma)
        if (address == -EFAULT)
                goto out;
 
-       pte = page_check_address(page, mm, address, &ptl);
+       pte = page_check_address(page, mm, address, &ptl, 1);
        if (!pte)
                goto out;
 
@@ -659,23 +663,30 @@ void page_remove_rmap(struct page *page, struct vm_area_struct *vma)
                }
 
                /*
-                * It would be tidy to reset the PageAnon mapping here,
-                * but that might overwrite a racing page_add_anon_rmap
-                * which increments mapcount after us but sets mapping
-                * before us: so leave the reset to free_hot_cold_page,
-                * and remember that it's only reliable while mapped.
-                * Leaving it set also helps swapoff to reinstate ptes
-                * faster for those pages still in swapcache.
+                * Now that the last pte has gone, s390 must transfer dirty
+                * flag from storage key to struct page.  We can usually skip
+                * this if the page is anon, so about to be freed; but perhaps
+                * not if it's in swapcache - there might be another pte slot
+                * containing the swap entry, but page not yet written to swap.
                 */
                if ((!PageAnon(page) || PageSwapCache(page)) &&
                    page_test_dirty(page)) {
                        page_clear_dirty(page);
                        set_page_dirty(page);
                }
-               mem_cgroup_uncharge_page(page);
 
+               mem_cgroup_uncharge_page(page);
                __dec_zone_page_state(page,
-                               PageAnon(page) ? NR_ANON_PAGES : NR_FILE_MAPPED);
+                       PageAnon(page) ? NR_ANON_PAGES : NR_FILE_MAPPED);
+               /*
+                * It would be tidy to reset the PageAnon mapping here,
+                * but that might overwrite a racing page_add_anon_rmap
+                * which increments mapcount after us but sets mapping
+                * before us: so leave the reset to free_hot_cold_page,
+                * and remember that it's only reliable while mapped.
+                * Leaving it set also helps swapoff to reinstate ptes
+                * faster for those pages still in swapcache.
+                */
        }
 }
 
@@ -697,7 +708,7 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
        if (address == -EFAULT)
                goto out;
 
-       pte = page_check_address(page, mm, address, &ptl);
+       pte = page_check_address(page, mm, address, &ptl, 0);
        if (!pte)
                goto out;
 
index 167cf2dc8a03c16d3022c60a303b102f09732bdd..797c3831cbec7401ccfecd3ecdc98c7667c8d6bb 100644 (file)
@@ -60,7 +60,7 @@ void show_swap_cache_info(void)
        printk("Swap cache stats: add %lu, delete %lu, find %lu/%lu\n",
                swap_cache_info.add_total, swap_cache_info.del_total,
                swap_cache_info.find_success, swap_cache_info.find_total);
-       printk("Free swap  = %lukB\n", nr_swap_pages << (PAGE_SHIFT - 10));
+       printk("Free swap  = %ldkB\n", nr_swap_pages << (PAGE_SHIFT - 10));
        printk("Total swap = %lukB\n", total_swap_pages << (PAGE_SHIFT - 10));
 }
 
index 7612cc8c337cc6ba7e909a08f6c63a3b026abf81..d87de48ba6567b4a4bbafab249837b0a0d20cf66 100644 (file)
@@ -236,14 +236,18 @@ source "net/rxrpc/Kconfig"
 config FIB_RULES
        bool
 
-menu "Wireless"
+menuconfig WIRELESS
+       bool "Wireless"
        depends on !S390
+       default y
+
+if WIRELESS
 
 source "net/wireless/Kconfig"
 source "net/mac80211/Kconfig"
 source "net/ieee80211/Kconfig"
 
-endmenu
+endif # WIRELESS
 
 source "net/rfkill/Kconfig"
 source "net/9p/Kconfig"
index 4e59df5f8e05a613d9990671162db5e7b8beb169..1edfdf4c095ba085ebe134eb6a3ee00d23128f1d 100644 (file)
@@ -456,7 +456,7 @@ static void __exit bt_exit(void)
 subsys_initcall(bt_init);
 module_exit(bt_exit);
 
-MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>");
+MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
 MODULE_DESCRIPTION("Bluetooth Core ver " VERSION);
 MODULE_VERSION(VERSION);
 MODULE_LICENSE("GPL");
index 12bba6207a8dca2719391bf1966072c9d3a107e3..80ba30cf4b682556252587e2ed57468f6663efa0 100644 (file)
@@ -736,7 +736,7 @@ MODULE_PARM_DESC(compress_src, "Compress sources headers");
 module_param(compress_dst, bool, 0644);
 MODULE_PARM_DESC(compress_dst, "Compress destination headers");
 
-MODULE_AUTHOR("David Libault <david.libault@inventel.fr>, Maxim Krasnyansky <maxk@qualcomm.com>");
+MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
 MODULE_DESCRIPTION("Bluetooth BNEP ver " VERSION);
 MODULE_VERSION(VERSION);
 MODULE_LICENSE("GPL");
index c85bf8f678dc5f1456788d3ebce5212627211912..f4f6615cad9f910c55f1cc70db8e633e010ce6eb 100644 (file)
@@ -3,8 +3,6 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 
-#include <linux/platform_device.h>
-
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
 
 #undef  BT_DBG
 #define BT_DBG(D...)
 #endif
+
+struct class *bt_class = NULL;
+EXPORT_SYMBOL_GPL(bt_class);
+
 static struct workqueue_struct *btaddconn;
 static struct workqueue_struct *btdelconn;
 
-static inline char *typetostr(int type)
+static inline char *link_typetostr(int type)
+{
+       switch (type) {
+       case ACL_LINK:
+               return "ACL";
+       case SCO_LINK:
+               return "SCO";
+       case ESCO_LINK:
+               return "eSCO";
+       default:
+               return "UNKNOWN";
+       }
+}
+
+static ssize_t show_link_type(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct hci_conn *conn = dev_get_drvdata(dev);
+       return sprintf(buf, "%s\n", link_typetostr(conn->type));
+}
+
+static ssize_t show_link_address(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct hci_conn *conn = dev_get_drvdata(dev);
+       bdaddr_t bdaddr;
+       baswap(&bdaddr, &conn->dst);
+       return sprintf(buf, "%s\n", batostr(&bdaddr));
+}
+
+static ssize_t show_link_features(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct hci_conn *conn = dev_get_drvdata(dev);
+
+       return sprintf(buf, "0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
+                               conn->features[0], conn->features[1],
+                               conn->features[2], conn->features[3],
+                               conn->features[4], conn->features[5],
+                               conn->features[6], conn->features[7]);
+}
+
+#define LINK_ATTR(_name,_mode,_show,_store) \
+struct device_attribute link_attr_##_name = __ATTR(_name,_mode,_show,_store)
+
+static LINK_ATTR(type, S_IRUGO, show_link_type, NULL);
+static LINK_ATTR(address, S_IRUGO, show_link_address, NULL);
+static LINK_ATTR(features, S_IRUGO, show_link_features, NULL);
+
+static struct attribute *bt_link_attrs[] = {
+       &link_attr_type.attr,
+       &link_attr_address.attr,
+       &link_attr_features.attr,
+       NULL
+};
+
+static struct attribute_group bt_link_group = {
+       .attrs = bt_link_attrs,
+};
+
+static struct attribute_group *bt_link_groups[] = {
+       &bt_link_group,
+       NULL
+};
+
+static void bt_link_release(struct device *dev)
+{
+       void *data = dev_get_drvdata(dev);
+       kfree(data);
+}
+
+static struct device_type bt_link = {
+       .name    = "link",
+       .groups  = bt_link_groups,
+       .release = bt_link_release,
+};
+
+static void add_conn(struct work_struct *work)
+{
+       struct hci_conn *conn = container_of(work, struct hci_conn, work);
+
+       flush_workqueue(btdelconn);
+
+       if (device_add(&conn->dev) < 0) {
+               BT_ERR("Failed to register connection device");
+               return;
+       }
+}
+
+void hci_conn_add_sysfs(struct hci_conn *conn)
+{
+       struct hci_dev *hdev = conn->hdev;
+
+       BT_DBG("conn %p", conn);
+
+       conn->dev.type = &bt_link;
+       conn->dev.class = bt_class;
+       conn->dev.parent = &hdev->dev;
+
+       snprintf(conn->dev.bus_id, BUS_ID_SIZE, "%s:%d",
+                                       hdev->name, conn->handle);
+
+       dev_set_drvdata(&conn->dev, conn);
+
+       device_initialize(&conn->dev);
+
+       INIT_WORK(&conn->work, add_conn);
+
+       queue_work(btaddconn, &conn->work);
+}
+
+/*
+ * The rfcomm tty device will possibly retain even when conn
+ * is down, and sysfs doesn't support move zombie device,
+ * so we should move the device before conn device is destroyed.
+ */
+static int __match_tty(struct device *dev, void *data)
+{
+       return !strncmp(dev->bus_id, "rfcomm", 6);
+}
+
+static void del_conn(struct work_struct *work)
+{
+       struct hci_conn *conn = container_of(work, struct hci_conn, work);
+       struct hci_dev *hdev = conn->hdev;
+
+       while (1) {
+               struct device *dev;
+
+               dev = device_find_child(&conn->dev, NULL, __match_tty);
+               if (!dev)
+                       break;
+               device_move(dev, NULL);
+               put_device(dev);
+       }
+
+       device_del(&conn->dev);
+       put_device(&conn->dev);
+       hci_dev_put(hdev);
+}
+
+void hci_conn_del_sysfs(struct hci_conn *conn)
+{
+       BT_DBG("conn %p", conn);
+
+       if (!device_is_registered(&conn->dev))
+               return;
+
+       INIT_WORK(&conn->work, del_conn);
+
+       queue_work(btdelconn, &conn->work);
+}
+
+static inline char *host_typetostr(int type)
 {
        switch (type) {
        case HCI_VIRTUAL:
@@ -40,7 +192,7 @@ static inline char *typetostr(int type)
 static ssize_t show_type(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct hci_dev *hdev = dev_get_drvdata(dev);
-       return sprintf(buf, "%s\n", typetostr(hdev->type));
+       return sprintf(buf, "%s\n", host_typetostr(hdev->type));
 }
 
 static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf)
@@ -221,183 +373,62 @@ static DEVICE_ATTR(sniff_max_interval, S_IRUGO | S_IWUSR,
 static DEVICE_ATTR(sniff_min_interval, S_IRUGO | S_IWUSR,
                                show_sniff_min_interval, store_sniff_min_interval);
 
-static struct device_attribute *bt_attrs[] = {
-       &dev_attr_type,
-       &dev_attr_name,
-       &dev_attr_class,
-       &dev_attr_address,
-       &dev_attr_features,
-       &dev_attr_manufacturer,
-       &dev_attr_hci_version,
-       &dev_attr_hci_revision,
-       &dev_attr_inquiry_cache,
-       &dev_attr_idle_timeout,
-       &dev_attr_sniff_max_interval,
-       &dev_attr_sniff_min_interval,
+static struct attribute *bt_host_attrs[] = {
+       &dev_attr_type.attr,
+       &dev_attr_name.attr,
+       &dev_attr_class.attr,
+       &dev_attr_address.attr,
+       &dev_attr_features.attr,
+       &dev_attr_manufacturer.attr,
+       &dev_attr_hci_version.attr,
+       &dev_attr_hci_revision.attr,
+       &dev_attr_inquiry_cache.attr,
+       &dev_attr_idle_timeout.attr,
+       &dev_attr_sniff_max_interval.attr,
+       &dev_attr_sniff_min_interval.attr,
        NULL
 };
 
-static ssize_t show_conn_type(struct device *dev, struct device_attribute *attr, char *buf)
-{
-       struct hci_conn *conn = dev_get_drvdata(dev);
-       return sprintf(buf, "%s\n", conn->type == ACL_LINK ? "ACL" : "SCO");
-}
-
-static ssize_t show_conn_address(struct device *dev, struct device_attribute *attr, char *buf)
-{
-       struct hci_conn *conn = dev_get_drvdata(dev);
-       bdaddr_t bdaddr;
-       baswap(&bdaddr, &conn->dst);
-       return sprintf(buf, "%s\n", batostr(&bdaddr));
-}
-
-static ssize_t show_conn_features(struct device *dev, struct device_attribute *attr, char *buf)
-{
-       struct hci_conn *conn = dev_get_drvdata(dev);
-
-       return sprintf(buf, "0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
-                               conn->features[0], conn->features[1],
-                               conn->features[2], conn->features[3],
-                               conn->features[4], conn->features[5],
-                               conn->features[6], conn->features[7]);
-}
-
-#define CONN_ATTR(_name,_mode,_show,_store) \
-struct device_attribute conn_attr_##_name = __ATTR(_name,_mode,_show,_store)
-
-static CONN_ATTR(type, S_IRUGO, show_conn_type, NULL);
-static CONN_ATTR(address, S_IRUGO, show_conn_address, NULL);
-static CONN_ATTR(features, S_IRUGO, show_conn_features, NULL);
-
-static struct device_attribute *conn_attrs[] = {
-       &conn_attr_type,
-       &conn_attr_address,
-       &conn_attr_features,
-       NULL
+static struct attribute_group bt_host_group = {
+       .attrs = bt_host_attrs,
 };
 
-struct class *bt_class = NULL;
-EXPORT_SYMBOL_GPL(bt_class);
-
-static struct bus_type bt_bus = {
-       .name   = "bluetooth",
+static struct attribute_group *bt_host_groups[] = {
+       &bt_host_group,
+       NULL
 };
 
-static struct platform_device *bt_platform;
-
-static void bt_release(struct device *dev)
+static void bt_host_release(struct device *dev)
 {
        void *data = dev_get_drvdata(dev);
        kfree(data);
 }
 
-static void add_conn(struct work_struct *work)
-{
-       struct hci_conn *conn = container_of(work, struct hci_conn, work);
-       int i;
-
-       flush_workqueue(btdelconn);
-
-       if (device_add(&conn->dev) < 0) {
-               BT_ERR("Failed to register connection device");
-               return;
-       }
-
-       for (i = 0; conn_attrs[i]; i++)
-               if (device_create_file(&conn->dev, conn_attrs[i]) < 0)
-                       BT_ERR("Failed to create connection attribute");
-}
-
-void hci_conn_add_sysfs(struct hci_conn *conn)
-{
-       struct hci_dev *hdev = conn->hdev;
-
-       BT_DBG("conn %p", conn);
-
-       conn->dev.bus = &bt_bus;
-       conn->dev.parent = &hdev->dev;
-
-       conn->dev.release = bt_release;
-
-       snprintf(conn->dev.bus_id, BUS_ID_SIZE, "%s:%d",
-                                       hdev->name, conn->handle);
-
-       dev_set_drvdata(&conn->dev, conn);
-
-       device_initialize(&conn->dev);
-
-       INIT_WORK(&conn->work, add_conn);
-
-       queue_work(btaddconn, &conn->work);
-}
-
-/*
- * The rfcomm tty device will possibly retain even when conn
- * is down, and sysfs doesn't support move zombie device,
- * so we should move the device before conn device is destroyed.
- */
-static int __match_tty(struct device *dev, void *data)
-{
-       return !strncmp(dev->bus_id, "rfcomm", 6);
-}
-
-static void del_conn(struct work_struct *work)
-{
-       struct hci_conn *conn = container_of(work, struct hci_conn, work);
-       struct hci_dev *hdev = conn->hdev;
-
-       while (1) {
-               struct device *dev;
-
-               dev = device_find_child(&conn->dev, NULL, __match_tty);
-               if (!dev)
-                       break;
-               device_move(dev, NULL);
-               put_device(dev);
-       }
-
-       device_del(&conn->dev);
-       put_device(&conn->dev);
-       hci_dev_put(hdev);
-}
-
-void hci_conn_del_sysfs(struct hci_conn *conn)
-{
-       BT_DBG("conn %p", conn);
-
-       if (!device_is_registered(&conn->dev))
-               return;
-
-       INIT_WORK(&conn->work, del_conn);
-
-       queue_work(btdelconn, &conn->work);
-}
+static struct device_type bt_host = {
+       .name    = "host",
+       .groups  = bt_host_groups,
+       .release = bt_host_release,
+};
 
 int hci_register_sysfs(struct hci_dev *hdev)
 {
        struct device *dev = &hdev->dev;
-       unsigned int i;
        int err;
 
        BT_DBG("%p name %s type %d", hdev, hdev->name, hdev->type);
 
-       dev->bus = &bt_bus;
+       dev->type = &bt_host;
+       dev->class = bt_class;
        dev->parent = hdev->parent;
 
        strlcpy(dev->bus_id, hdev->name, BUS_ID_SIZE);
 
-       dev->release = bt_release;
-
        dev_set_drvdata(dev, hdev);
 
        err = device_register(dev);
        if (err < 0)
                return err;
 
-       for (i = 0; bt_attrs[i]; i++)
-               if (device_create_file(dev, bt_attrs[i]) < 0)
-                       BT_ERR("Failed to create device attribute");
-
        return 0;
 }
 
@@ -410,59 +441,30 @@ void hci_unregister_sysfs(struct hci_dev *hdev)
 
 int __init bt_sysfs_init(void)
 {
-       int err;
-
        btaddconn = create_singlethread_workqueue("btaddconn");
-       if (!btaddconn) {
-               err = -ENOMEM;
-               goto out;
-       }
+       if (!btaddconn)
+               return -ENOMEM;
 
        btdelconn = create_singlethread_workqueue("btdelconn");
        if (!btdelconn) {
-               err = -ENOMEM;
-               goto out_del;
-       }
-
-       bt_platform = platform_device_register_simple("bluetooth", -1, NULL, 0);
-       if (IS_ERR(bt_platform)) {
-               err = PTR_ERR(bt_platform);
-               goto out_platform;
+               destroy_workqueue(btaddconn);
+               return -ENOMEM;
        }
 
-       err = bus_register(&bt_bus);
-       if (err < 0)
-               goto out_bus;
-
        bt_class = class_create(THIS_MODULE, "bluetooth");
        if (IS_ERR(bt_class)) {
-               err = PTR_ERR(bt_class);
-               goto out_class;
+               destroy_workqueue(btdelconn);
+               destroy_workqueue(btaddconn);
+               return PTR_ERR(bt_class);
        }
 
        return 0;
-
-out_class:
-       bus_unregister(&bt_bus);
-out_bus:
-       platform_device_unregister(bt_platform);
-out_platform:
-       destroy_workqueue(btdelconn);
-out_del:
-       destroy_workqueue(btaddconn);
-out:
-       return err;
 }
 
 void bt_sysfs_cleanup(void)
 {
        destroy_workqueue(btaddconn);
-
        destroy_workqueue(btdelconn);
 
        class_destroy(bt_class);
-
-       bus_unregister(&bt_bus);
-
-       platform_device_unregister(bt_platform);
 }
index c1239852834aa78361939eba75ca596c5dba7d62..3396d5bdef1c3f8e0f24af0a64dd7b1eca7a333f 100644 (file)
@@ -2516,7 +2516,7 @@ EXPORT_SYMBOL(l2cap_load);
 module_init(l2cap_init);
 module_exit(l2cap_exit);
 
-MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>");
+MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
 MODULE_DESCRIPTION("Bluetooth L2CAP ver " VERSION);
 MODULE_VERSION(VERSION);
 MODULE_LICENSE("GPL");
index 6cfc7ba611b36bfd5af56816bc7bfef409cb81b7..ba537fae0a4ca653b4a7eedb7b941deb8aef613b 100644 (file)
@@ -2115,7 +2115,7 @@ MODULE_PARM_DESC(channel_mtu, "Default MTU for the RFCOMM channel");
 module_param(l2cap_mtu, uint, 0644);
 MODULE_PARM_DESC(l2cap_mtu, "Default MTU for the L2CAP connection");
 
-MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>");
+MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
 MODULE_DESCRIPTION("Bluetooth RFCOMM ver " VERSION);
 MODULE_VERSION(VERSION);
 MODULE_LICENSE("GPL");
index 8cda498748689d510e3452c187ce464b89987a5b..a16011fedc1d73d3adc24e66ff5e7ff24a37373c 100644 (file)
@@ -1002,7 +1002,7 @@ module_exit(sco_exit);
 module_param(disable_esco, bool, 0644);
 MODULE_PARM_DESC(disable_esco, "Disable eSCO connection creation");
 
-MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>");
+MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
 MODULE_DESCRIPTION("Bluetooth SCO ver " VERSION);
 MODULE_VERSION(VERSION);
 MODULE_LICENSE("GPL");
index 8d133802372be7c0b27fbead20cb8a3cd36dfffb..60c51f7658870257571ee9455f95bb48888b4398 100644 (file)
@@ -1990,7 +1990,9 @@ static void net_tx_action(struct softirq_action *h)
                                qdisc_run(q);
                                spin_unlock(root_lock);
                        } else {
-                               __netif_reschedule(q);
+                               if (!test_bit(__QDISC_STATE_DEACTIVATED,
+                                             &q->state))
+                                       __netif_reschedule(q);
                        }
                }
        }
index a89f32fa94f6b0f9631a7353f3cbfd2e68bdcb70..57abe8266be198dd483c71ce07cf3ce0757ced0e 100644 (file)
@@ -99,7 +99,7 @@ struct gen_estimator_head
 
 static struct gen_estimator_head elist[EST_MAX_INTERVAL+1];
 
-/* Protects against NULL dereference and RCU write-side */
+/* Protects against NULL dereference */
 static DEFINE_RWLOCK(est_lock);
 
 static void est_timer(unsigned long arg)
@@ -185,7 +185,6 @@ int gen_new_estimator(struct gnet_stats_basic *bstats,
        est->last_packets = bstats->packets;
        est->avpps = rate_est->pps<<10;
 
-       write_lock_bh(&est_lock);
        if (!elist[idx].timer.function) {
                INIT_LIST_HEAD(&elist[idx].list);
                setup_timer(&elist[idx].timer, est_timer, idx);
@@ -195,7 +194,6 @@ int gen_new_estimator(struct gnet_stats_basic *bstats,
                mod_timer(&elist[idx].timer, jiffies + ((HZ/4) << idx));
 
        list_add_rcu(&est->list, &elist[idx].list);
-       write_unlock_bh(&est_lock);
        return 0;
 }
 
@@ -214,6 +212,7 @@ static void __gen_kill_estimator(struct rcu_head *head)
  * Removes the rate estimator specified by &bstats and &rate_est
  * and deletes the timer.
  *
+ * NOTE: Called under rtnl_mutex
  */
 void gen_kill_estimator(struct gnet_stats_basic *bstats,
        struct gnet_stats_rate_est *rate_est)
@@ -227,17 +226,17 @@ void gen_kill_estimator(struct gnet_stats_basic *bstats,
                if (!elist[idx].timer.function)
                        continue;
 
-               write_lock_bh(&est_lock);
                list_for_each_entry_safe(e, n, &elist[idx].list, list) {
                        if (e->rate_est != rate_est || e->bstats != bstats)
                                continue;
 
+                       write_lock_bh(&est_lock);
                        e->bstats = NULL;
+                       write_unlock_bh(&est_lock);
 
                        list_del_rcu(&e->list);
                        call_rcu(&e->e_rcu, __gen_kill_estimator);
                }
-               write_unlock_bh(&est_lock);
        }
 }
 
index 3bca97f55d47c3b6e7b1591d999bed3800efd64f..949772a5a7dc15bd35152c3ada3df912681acfd7 100644 (file)
@@ -157,7 +157,7 @@ struct net_device *alloc_ieee80211(int sizeof_priv)
        err = ieee80211_networks_allocate(ieee);
        if (err) {
                IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err);
-               goto failed;
+               goto failed_free_netdev;
        }
        ieee80211_networks_initialize(ieee);
 
@@ -193,9 +193,9 @@ struct net_device *alloc_ieee80211(int sizeof_priv)
 
        return dev;
 
-      failed:
-       if (dev)
-               free_netdev(dev);
+failed_free_netdev:
+       free_netdev(dev);
+failed:
        return NULL;
 }
 
index 67ccce2a96bd0d7d506bc7bca08a7ac29c38fea6..f79a51607292bc7a39dd45fd3389139533af49a2 100644 (file)
@@ -3442,6 +3442,22 @@ void tcp_parse_options(struct sk_buff *skb, struct tcp_options_received *opt_rx,
        }
 }
 
+static int tcp_parse_aligned_timestamp(struct tcp_sock *tp, struct tcphdr *th)
+{
+       __be32 *ptr = (__be32 *)(th + 1);
+
+       if (*ptr == htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16)
+                         | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) {
+               tp->rx_opt.saw_tstamp = 1;
+               ++ptr;
+               tp->rx_opt.rcv_tsval = ntohl(*ptr);
+               ++ptr;
+               tp->rx_opt.rcv_tsecr = ntohl(*ptr);
+               return 1;
+       }
+       return 0;
+}
+
 /* Fast parse options. This hopes to only see timestamps.
  * If it is wrong it falls back on tcp_parse_options().
  */
@@ -3453,16 +3469,8 @@ static int tcp_fast_parse_options(struct sk_buff *skb, struct tcphdr *th,
                return 0;
        } else if (tp->rx_opt.tstamp_ok &&
                   th->doff == (sizeof(struct tcphdr)>>2)+(TCPOLEN_TSTAMP_ALIGNED>>2)) {
-               __be32 *ptr = (__be32 *)(th + 1);
-               if (*ptr == htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16)
-                                 | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)) {
-                       tp->rx_opt.saw_tstamp = 1;
-                       ++ptr;
-                       tp->rx_opt.rcv_tsval = ntohl(*ptr);
-                       ++ptr;
-                       tp->rx_opt.rcv_tsecr = ntohl(*ptr);
+               if (tcp_parse_aligned_timestamp(tp, th))
                        return 1;
-               }
        }
        tcp_parse_options(skb, &tp->rx_opt, 1);
        return 1;
@@ -4161,6 +4169,18 @@ add_sack:
        }
 }
 
+static struct sk_buff *tcp_collapse_one(struct sock *sk, struct sk_buff *skb,
+                                       struct sk_buff_head *list)
+{
+       struct sk_buff *next = skb->next;
+
+       __skb_unlink(skb, list);
+       __kfree_skb(skb);
+       NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPRCVCOLLAPSED);
+
+       return next;
+}
+
 /* Collapse contiguous sequence of skbs head..tail with
  * sequence numbers start..end.
  * Segments with FIN/SYN are not collapsed (only because this
@@ -4178,11 +4198,7 @@ tcp_collapse(struct sock *sk, struct sk_buff_head *list,
        for (skb = head; skb != tail;) {
                /* No new bits? It is possible on ofo queue. */
                if (!before(start, TCP_SKB_CB(skb)->end_seq)) {
-                       struct sk_buff *next = skb->next;
-                       __skb_unlink(skb, list);
-                       __kfree_skb(skb);
-                       NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPRCVCOLLAPSED);
-                       skb = next;
+                       skb = tcp_collapse_one(sk, skb, list);
                        continue;
                }
 
@@ -4246,11 +4262,7 @@ tcp_collapse(struct sock *sk, struct sk_buff_head *list,
                                start += size;
                        }
                        if (!before(start, TCP_SKB_CB(skb)->end_seq)) {
-                               struct sk_buff *next = skb->next;
-                               __skb_unlink(skb, list);
-                               __kfree_skb(skb);
-                               NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPRCVCOLLAPSED);
-                               skb = next;
+                               skb = tcp_collapse_one(sk, skb, list);
                                if (skb == tail ||
                                    tcp_hdr(skb)->syn ||
                                    tcp_hdr(skb)->fin)
@@ -4691,6 +4703,67 @@ out:
 }
 #endif /* CONFIG_NET_DMA */
 
+/* Does PAWS and seqno based validation of an incoming segment, flags will
+ * play significant role here.
+ */
+static int tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
+                             struct tcphdr *th, int syn_inerr)
+{
+       struct tcp_sock *tp = tcp_sk(sk);
+
+       /* RFC1323: H1. Apply PAWS check first. */
+       if (tcp_fast_parse_options(skb, th, tp) && tp->rx_opt.saw_tstamp &&
+           tcp_paws_discard(sk, skb)) {
+               if (!th->rst) {
+                       NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSESTABREJECTED);
+                       tcp_send_dupack(sk, skb);
+                       goto discard;
+               }
+               /* Reset is accepted even if it did not pass PAWS. */
+       }
+
+       /* Step 1: check sequence number */
+       if (!tcp_sequence(tp, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq)) {
+               /* RFC793, page 37: "In all states except SYN-SENT, all reset
+                * (RST) segments are validated by checking their SEQ-fields."
+                * And page 69: "If an incoming segment is not acceptable,
+                * an acknowledgment should be sent in reply (unless the RST
+                * bit is set, if so drop the segment and return)".
+                */
+               if (!th->rst)
+                       tcp_send_dupack(sk, skb);
+               goto discard;
+       }
+
+       /* Step 2: check RST bit */
+       if (th->rst) {
+               tcp_reset(sk);
+               goto discard;
+       }
+
+       /* ts_recent update must be made after we are sure that the packet
+        * is in window.
+        */
+       tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq);
+
+       /* step 3: check security and precedence [ignored] */
+
+       /* step 4: Check for a SYN in window. */
+       if (th->syn && !before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) {
+               if (syn_inerr)
+                       TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS);
+               NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPABORTONSYN);
+               tcp_reset(sk);
+               return -1;
+       }
+
+       return 1;
+
+discard:
+       __kfree_skb(skb);
+       return 0;
+}
+
 /*
  *     TCP receive function for the ESTABLISHED state.
  *
@@ -4718,6 +4791,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
                        struct tcphdr *th, unsigned len)
 {
        struct tcp_sock *tp = tcp_sk(sk);
+       int res;
 
        /*
         *      Header prediction.
@@ -4756,19 +4830,10 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
 
                /* Check timestamp */
                if (tcp_header_len == sizeof(struct tcphdr) + TCPOLEN_TSTAMP_ALIGNED) {
-                       __be32 *ptr = (__be32 *)(th + 1);
-
                        /* No? Slow path! */
-                       if (*ptr != htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16)
-                                         | (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP))
+                       if (!tcp_parse_aligned_timestamp(tp, th))
                                goto slow_path;
 
-                       tp->rx_opt.saw_tstamp = 1;
-                       ++ptr;
-                       tp->rx_opt.rcv_tsval = ntohl(*ptr);
-                       ++ptr;
-                       tp->rx_opt.rcv_tsecr = ntohl(*ptr);
-
                        /* If PAWS failed, check it more carefully in slow path */
                        if ((s32)(tp->rx_opt.rcv_tsval - tp->rx_opt.ts_recent) < 0)
                                goto slow_path;
@@ -4898,52 +4963,13 @@ slow_path:
        if (len < (th->doff << 2) || tcp_checksum_complete_user(sk, skb))
                goto csum_error;
 
-       /*
-        * RFC1323: H1. Apply PAWS check first.
-        */
-       if (tcp_fast_parse_options(skb, th, tp) && tp->rx_opt.saw_tstamp &&
-           tcp_paws_discard(sk, skb)) {
-               if (!th->rst) {
-                       NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSESTABREJECTED);
-                       tcp_send_dupack(sk, skb);
-                       goto discard;
-               }
-               /* Resets are accepted even if PAWS failed.
-
-                  ts_recent update must be made after we are sure
-                  that the packet is in window.
-                */
-       }
-
        /*
         *      Standard slow path.
         */
 
-       if (!tcp_sequence(tp, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq)) {
-               /* RFC793, page 37: "In all states except SYN-SENT, all reset
-                * (RST) segments are validated by checking their SEQ-fields."
-                * And page 69: "If an incoming segment is not acceptable,
-                * an acknowledgment should be sent in reply (unless the RST bit
-                * is set, if so drop the segment and return)".
-                */
-               if (!th->rst)
-                       tcp_send_dupack(sk, skb);
-               goto discard;
-       }
-
-       if (th->rst) {
-               tcp_reset(sk);
-               goto discard;
-       }
-
-       tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq);
-
-       if (th->syn && !before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) {
-               TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS);
-               NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPABORTONSYN);
-               tcp_reset(sk);
-               return 1;
-       }
+       res = tcp_validate_incoming(sk, skb, th, 1);
+       if (res <= 0)
+               return -res;
 
 step5:
        if (th->ack)
@@ -5225,6 +5251,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
        struct tcp_sock *tp = tcp_sk(sk);
        struct inet_connection_sock *icsk = inet_csk(sk);
        int queued = 0;
+       int res;
 
        tp->rx_opt.saw_tstamp = 0;
 
@@ -5277,42 +5304,9 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                return 0;
        }
 
-       if (tcp_fast_parse_options(skb, th, tp) && tp->rx_opt.saw_tstamp &&
-           tcp_paws_discard(sk, skb)) {
-               if (!th->rst) {
-                       NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSESTABREJECTED);
-                       tcp_send_dupack(sk, skb);
-                       goto discard;
-               }
-               /* Reset is accepted even if it did not pass PAWS. */
-       }
-
-       /* step 1: check sequence number */
-       if (!tcp_sequence(tp, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq)) {
-               if (!th->rst)
-                       tcp_send_dupack(sk, skb);
-               goto discard;
-       }
-
-       /* step 2: check RST bit */
-       if (th->rst) {
-               tcp_reset(sk);
-               goto discard;
-       }
-
-       tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq);
-
-       /* step 3: check security and precedence [ignored] */
-
-       /*      step 4:
-        *
-        *      Check for a SYN in window.
-        */
-       if (th->syn && !before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) {
-               NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPABORTONSYN);
-               tcp_reset(sk);
-               return 1;
-       }
+       res = tcp_validate_incoming(sk, skb, th, 0);
+       if (res <= 0)
+               return -res;
 
        /* step 5: check the ACK field */
        if (th->ack) {
index 297c257864c771c069c44f2b04aa68c2ad1b48c7..6d2ad2bf3ab5a97f93a54a7ea2428baed6a68460 100644 (file)
@@ -66,13 +66,16 @@ static int ieee80211_add_iface(struct wiphy *wiphy, char *name,
 static int ieee80211_del_iface(struct wiphy *wiphy, int ifindex)
 {
        struct net_device *dev;
+       struct ieee80211_sub_if_data *sdata;
 
        /* we're under RTNL */
        dev = __dev_get_by_index(&init_net, ifindex);
        if (!dev)
                return -ENODEV;
 
-       ieee80211_if_remove(dev);
+       sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+
+       ieee80211_if_remove(sdata);
 
        return 0;
 }
@@ -842,13 +845,13 @@ static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,
                return -ENOENT;
        }
 
-       err = mesh_path_add(dst, dev);
+       err = mesh_path_add(dst, sdata);
        if (err) {
                rcu_read_unlock();
                return err;
        }
 
-       mpath = mesh_path_lookup(dst, dev);
+       mpath = mesh_path_lookup(dst, sdata);
        if (!mpath) {
                rcu_read_unlock();
                return -ENXIO;
@@ -862,10 +865,12 @@ static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,
 static int ieee80211_del_mpath(struct wiphy *wiphy, struct net_device *dev,
                                 u8 *dst)
 {
+       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+
        if (dst)
-               return mesh_path_del(dst, dev);
+               return mesh_path_del(dst, sdata);
 
-       mesh_path_flush(dev);
+       mesh_path_flush(sdata);
        return 0;
 }
 
@@ -897,7 +902,7 @@ static int ieee80211_change_mpath(struct wiphy *wiphy,
                return -ENOENT;
        }
 
-       mpath = mesh_path_lookup(dst, dev);
+       mpath = mesh_path_lookup(dst, sdata);
        if (!mpath) {
                rcu_read_unlock();
                return -ENOENT;
@@ -965,7 +970,7 @@ static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
                return -ENOTSUPP;
 
        rcu_read_lock();
-       mpath = mesh_path_lookup(dst, dev);
+       mpath = mesh_path_lookup(dst, sdata);
        if (!mpath) {
                rcu_read_unlock();
                return -ENOENT;
@@ -993,7 +998,7 @@ static int ieee80211_dump_mpath(struct wiphy *wiphy, struct net_device *dev,
                return -ENOTSUPP;
 
        rcu_read_lock();
-       mpath = mesh_path_lookup_by_idx(idx, dev);
+       mpath = mesh_path_lookup_by_idx(idx, sdata);
        if (!mpath) {
                rcu_read_unlock();
                return -ENOENT;
index 79a062782d52e2da757532901a29017e9f420d4e..6abe5427752b2e715e16483f9cc2bbf33a6c602d 100644 (file)
@@ -201,7 +201,7 @@ static ssize_t sta_agg_status_write(struct file *file,
                tid_num = tid_num - 100;
                if (tid_static_rx[tid_num] == 1) {
                        strcpy(state, "off ");
-                       ieee80211_sta_stop_rx_ba_session(dev, da, tid_num, 0,
+                       ieee80211_sta_stop_rx_ba_session(sta->sdata, da, tid_num, 0,
                                        WLAN_REASON_QSTA_REQUIRE_SETUP);
                        sta->ampdu_mlme.tid_state_rx[tid_num] |=
                                        HT_AGG_STATE_DEBUGFS_CTL;
index 2280f40b4560ba3c963cc84f35e73a543bb47064..8de60de70bc9bffa32a4fea6dc3b7641f139c563 100644 (file)
@@ -8,7 +8,6 @@
  * mac80211 - events
  */
 
-#include <linux/netdevice.h>
 #include <net/iw_handler.h>
 #include "ieee80211_i.h"
 
@@ -17,7 +16,7 @@
  * (in the variable hdr) must be long enough to extract the TKIP
  * fields like TSC
  */
-void mac80211_ev_michael_mic_failure(struct net_device *dev, int keyidx,
+void mac80211_ev_michael_mic_failure(struct ieee80211_sub_if_data *sdata, int keyidx,
                                     struct ieee80211_hdr *hdr)
 {
        union iwreq_data wrqu;
@@ -32,7 +31,7 @@ void mac80211_ev_michael_mic_failure(struct net_device *dev, int keyidx,
                        print_mac(mac, hdr->addr2));
                memset(&wrqu, 0, sizeof(wrqu));
                wrqu.data.length = strlen(buf);
-               wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
+               wireless_send_event(sdata->dev, IWEVCUSTOM, &wrqu, buf);
                kfree(buf);
        }
 
index ec59345af65b9bd2f62accd7e23ca511f9d0e3a2..8361054fb7cf36e25a43cf4568876d2e25ec640d 100644 (file)
 /* ieee80211.o internal definitions, etc. These are not included into
  * low-level drivers. */
 
-#ifndef ETH_P_PAE
-#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
-#endif /* ETH_P_PAE */
-
-#define WLAN_FC_DATA_PRESENT(fc) (((fc) & 0x4c) == 0x08)
-
-#define IEEE80211_FC(type, subtype) cpu_to_le16(type | subtype)
-
 struct ieee80211_local;
 
 /* Maximum number of broadcast/multicast frames to buffer when some of the
@@ -108,7 +100,7 @@ struct ieee80211_sta_bss {
        u64 timestamp;
        int beacon_int;
 
-       bool probe_resp;
+       unsigned long last_probe_resp;
        unsigned long last_update;
 
        /* during assocation, we save an ERP value from a probe response so
@@ -174,7 +166,7 @@ struct ieee80211_tx_data {
        struct sk_buff **extra_frag;
        int num_extra_frag;
 
-       u16 fc, ethertype;
+       u16 ethertype;
        unsigned int flags;
 };
 
@@ -202,7 +194,7 @@ struct ieee80211_rx_data {
        struct ieee80211_rx_status *status;
        struct ieee80211_rate *rate;
 
-       u16 fc, ethertype;
+       u16 ethertype;
        unsigned int flags;
        int sent_ps_buffered;
        int queue;
@@ -300,17 +292,35 @@ struct mesh_config {
 #define IEEE80211_STA_AUTO_BSSID_SEL   BIT(11)
 #define IEEE80211_STA_AUTO_CHANNEL_SEL BIT(12)
 #define IEEE80211_STA_PRIVACY_INVOKED  BIT(13)
+/* flags for  MLME request*/
+#define IEEE80211_STA_REQ_SCAN 0
+#define IEEE80211_STA_REQ_DIRECT_PROBE 1
+#define IEEE80211_STA_REQ_AUTH 2
+#define IEEE80211_STA_REQ_RUN  3
+
+/* flags used for setting mlme state */
+enum ieee80211_sta_mlme_state {
+       IEEE80211_STA_MLME_DISABLED,
+       IEEE80211_STA_MLME_DIRECT_PROBE,
+       IEEE80211_STA_MLME_AUTHENTICATE,
+       IEEE80211_STA_MLME_ASSOCIATE,
+       IEEE80211_STA_MLME_ASSOCIATED,
+       IEEE80211_STA_MLME_IBSS_SEARCH,
+       IEEE80211_STA_MLME_IBSS_JOINED,
+       IEEE80211_STA_MLME_MESH_UP
+};
+
+/* bitfield of allowed auth algs */
+#define IEEE80211_AUTH_ALG_OPEN BIT(0)
+#define IEEE80211_AUTH_ALG_SHARED_KEY BIT(1)
+#define IEEE80211_AUTH_ALG_LEAP BIT(2)
+
 struct ieee80211_if_sta {
        struct timer_list timer;
        struct work_struct work;
        u8 bssid[ETH_ALEN], prev_bssid[ETH_ALEN];
        u8 ssid[IEEE80211_MAX_SSID_LEN];
-       enum {
-               IEEE80211_DISABLED, IEEE80211_AUTHENTICATE,
-               IEEE80211_ASSOCIATE, IEEE80211_ASSOCIATED,
-               IEEE80211_IBSS_SEARCH, IEEE80211_IBSS_JOINED,
-               IEEE80211_MESH_UP
-       } state;
+       enum ieee80211_sta_mlme_state state;
        size_t ssid_len;
        u8 scan_ssid[IEEE80211_MAX_SSID_LEN];
        size_t scan_ssid_len;
@@ -353,20 +363,17 @@ struct ieee80211_if_sta {
 
        struct sk_buff_head skb_queue;
 
-       int auth_tries, assoc_tries;
+       int assoc_scan_tries; /* number of scans done pre-association */
+       int direct_probe_tries; /* retries for direct probes */
+       int auth_tries; /* retries for auth req */
+       int assoc_tries; /* retries for assoc req */
 
        unsigned long request;
 
        unsigned long last_probe;
 
        unsigned int flags;
-#define IEEE80211_STA_REQ_SCAN 0
-#define IEEE80211_STA_REQ_AUTH 1
-#define IEEE80211_STA_REQ_RUN  2
 
-#define IEEE80211_AUTH_ALG_OPEN BIT(0)
-#define IEEE80211_AUTH_ALG_SHARED_KEY BIT(1)
-#define IEEE80211_AUTH_ALG_LEAP BIT(2)
        unsigned int auth_algs; /* bitfield of allowed auth algs */
        int auth_alg; /* currently used IEEE 802.11 authentication algorithm */
        int auth_transaction;
@@ -859,65 +866,65 @@ u32 ieee80211_handle_ht(struct ieee80211_local *local, int enable_ht,
 
 /* ieee80211_ioctl.c */
 extern const struct iw_handler_def ieee80211_iw_handler_def;
-int ieee80211_set_freq(struct net_device *dev, int freq);
+int ieee80211_set_freq(struct ieee80211_sub_if_data *sdata, int freq);
 
 /* ieee80211_sta.c */
 void ieee80211_sta_timer(unsigned long data);
 void ieee80211_sta_work(struct work_struct *work);
 void ieee80211_sta_scan_work(struct work_struct *work);
-void ieee80211_sta_rx_mgmt(struct net_device *dev, struct sk_buff *skb,
+void ieee80211_sta_rx_mgmt(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb,
                           struct ieee80211_rx_status *rx_status);
-int ieee80211_sta_set_ssid(struct net_device *dev, char *ssid, size_t len);
-int ieee80211_sta_get_ssid(struct net_device *dev, char *ssid, size_t *len);
-int ieee80211_sta_set_bssid(struct net_device *dev, u8 *bssid);
-int ieee80211_sta_req_scan(struct net_device *dev, u8 *ssid, size_t ssid_len);
-void ieee80211_sta_req_auth(struct net_device *dev,
+int ieee80211_sta_set_ssid(struct ieee80211_sub_if_data *sdata, char *ssid, size_t len);
+int ieee80211_sta_get_ssid(struct ieee80211_sub_if_data *sdata, char *ssid, size_t *len);
+int ieee80211_sta_set_bssid(struct ieee80211_sub_if_data *sdata, u8 *bssid);
+int ieee80211_sta_req_scan(struct ieee80211_sub_if_data *sdata, u8 *ssid, size_t ssid_len);
+void ieee80211_sta_req_auth(struct ieee80211_sub_if_data *sdata,
                            struct ieee80211_if_sta *ifsta);
-int ieee80211_sta_scan_results(struct net_device *dev,
+int ieee80211_sta_scan_results(struct ieee80211_local *local,
                               struct iw_request_info *info,
                               char *buf, size_t len);
 ieee80211_rx_result ieee80211_sta_rx_scan(
-       struct net_device *dev, struct sk_buff *skb,
+       struct ieee80211_sub_if_data *sdata, struct sk_buff *skb,
        struct ieee80211_rx_status *rx_status);
 void ieee80211_rx_bss_list_init(struct ieee80211_local *local);
 void ieee80211_rx_bss_list_deinit(struct ieee80211_local *local);
-int ieee80211_sta_set_extra_ie(struct net_device *dev, char *ie, size_t len);
-struct sta_info *ieee80211_ibss_add_sta(struct net_device *dev,
+int ieee80211_sta_set_extra_ie(struct ieee80211_sub_if_data *sdata, char *ie, size_t len);
+struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
                                        struct sk_buff *skb, u8 *bssid,
                                        u8 *addr, u64 supp_rates);
-int ieee80211_sta_deauthenticate(struct net_device *dev, u16 reason);
-int ieee80211_sta_disassociate(struct net_device *dev, u16 reason);
+int ieee80211_sta_deauthenticate(struct ieee80211_sub_if_data *sdata, u16 reason);
+int ieee80211_sta_disassociate(struct ieee80211_sub_if_data *sdata, u16 reason);
 void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata,
                                      u32 changed);
-u32 ieee80211_reset_erp_info(struct net_device *dev);
+u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata);
 int ieee80211_ht_cap_ie_to_ht_info(struct ieee80211_ht_cap *ht_cap_ie,
                                   struct ieee80211_ht_info *ht_info);
 int ieee80211_ht_addt_info_ie_to_ht_bss_info(
                        struct ieee80211_ht_addt_info *ht_add_info_ie,
                        struct ieee80211_ht_bss_info *bss_info);
-void ieee80211_send_addba_request(struct net_device *dev, const u8 *da,
+void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata, const u8 *da,
                                  u16 tid, u8 dialog_token, u16 start_seq_num,
                                  u16 agg_size, u16 timeout);
-void ieee80211_send_delba(struct net_device *dev, const u8 *da, u16 tid,
+void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata, const u8 *da, u16 tid,
                                u16 initiator, u16 reason_code);
-void ieee80211_send_bar(struct net_device *dev, u8 *ra, u16 tid, u16 ssn);
+void ieee80211_send_bar(struct ieee80211_sub_if_data *sdata, u8 *ra, u16 tid, u16 ssn);
 
-void ieee80211_sta_stop_rx_ba_session(struct net_device *dev, u8 *da,
+void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *da,
                                u16 tid, u16 initiator, u16 reason);
 void sta_addba_resp_timer_expired(unsigned long data);
-void ieee80211_sta_tear_down_BA_sessions(struct net_device *dev, u8 *addr);
+void ieee80211_sta_tear_down_BA_sessions(struct ieee80211_sub_if_data *sdata, u8 *addr);
 u64 ieee80211_sta_get_rates(struct ieee80211_local *local,
                            struct ieee802_11_elems *elems,
                            enum ieee80211_band band);
-void ieee80211_sta_tx(struct net_device *dev, struct sk_buff *skb,
+void ieee80211_sta_tx(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb,
                int encrypt);
 void ieee802_11_parse_elems(u8 *start, size_t len,
                                   struct ieee802_11_elems *elems);
 
 #ifdef CONFIG_MAC80211_MESH
-void ieee80211_start_mesh(struct net_device *dev);
+void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata);
 #else
-static inline void ieee80211_start_mesh(struct net_device *dev)
+static inline void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata)
 {}
 #endif
 
@@ -928,7 +935,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
                     struct vif_params *params);
 int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
                             enum ieee80211_if_types type);
-void ieee80211_if_remove(struct net_device *dev);
+void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata);
 void ieee80211_remove_interfaces(struct ieee80211_local *local);
 
 /* tx handling */
@@ -946,7 +953,7 @@ u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len,
                        enum ieee80211_if_types type);
 int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
                             int rate, int erp, int short_preamble);
-void mac80211_ev_michael_mic_failure(struct net_device *dev, int keyidx,
+void mac80211_ev_michael_mic_failure(struct ieee80211_sub_if_data *sdata, int keyidx,
                                     struct ieee80211_hdr *hdr);
 
 #ifdef CONFIG_MAC80211_NOINLINE
index 610ed1d9893af95b3fda10005f3d6d535c3603ad..4a623b8e91fd532f4f5c5a44ce070ede32776219 100644 (file)
@@ -56,7 +56,7 @@ static void ieee80211_teardown_sdata(struct net_device *dev)
        case IEEE80211_IF_TYPE_MESH_POINT:
                /* Allow compiler to elide mesh_rmc_free call. */
                if (ieee80211_vif_is_mesh(&sdata->vif))
-                       mesh_rmc_free(dev);
+                       mesh_rmc_free(sdata);
                /* fall through */
        case IEEE80211_IF_TYPE_STA:
        case IEEE80211_IF_TYPE_IBSS:
@@ -241,15 +241,13 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
        return ret;
 }
 
-void ieee80211_if_remove(struct net_device *dev)
+void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-
        ASSERT_RTNL();
 
        list_del_rcu(&sdata->list);
        synchronize_rcu();
-       unregister_netdevice(dev);
+       unregister_netdevice(sdata->dev);
 }
 
 /*
index aa5a191598c9f1a6ab487abbfdeb964ee2fae4f9..398ca66bdfcb3dacce7a28b2fb12b97a969be0e0 100644 (file)
@@ -187,9 +187,15 @@ static int ieee80211_open(struct net_device *dev)
        u32 changed = 0;
        int res;
        bool need_hw_reconfig = 0;
+       u8 null_addr[ETH_ALEN] = {0};
 
        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
+       /* fail early if user set an invalid address */
+       if (compare_ether_addr(dev->dev_addr, null_addr) &&
+           !is_valid_ether_addr(dev->dev_addr))
+               return -EADDRNOTAVAIL;
+
        /* we hold the RTNL here so can safely walk the list */
        list_for_each_entry(nsdata, &local->interfaces, list) {
                struct net_device *ndev = nsdata->dev;
@@ -270,6 +276,36 @@ static int ieee80211_open(struct net_device *dev)
                ieee80211_led_radio(local, local->hw.conf.radio_enabled);
        }
 
+       /*
+        * Check all interfaces and copy the hopefully now-present
+        * MAC address to those that have the special null one.
+        */
+       list_for_each_entry(nsdata, &local->interfaces, list) {
+               struct net_device *ndev = nsdata->dev;
+
+               /*
+                * No need to check netif_running since we do not allow
+                * it to start up with this invalid address.
+                */
+               if (compare_ether_addr(null_addr, ndev->dev_addr) == 0)
+                       memcpy(ndev->dev_addr,
+                              local->hw.wiphy->perm_addr,
+                              ETH_ALEN);
+       }
+
+       if (compare_ether_addr(null_addr, local->mdev->dev_addr) == 0)
+               memcpy(local->mdev->dev_addr, local->hw.wiphy->perm_addr,
+                      ETH_ALEN);
+
+       /*
+        * Validate the MAC address for this device.
+        */
+       if (!is_valid_ether_addr(dev->dev_addr)) {
+               if (!local->open_count && local->ops->stop)
+                       local->ops->stop(local_to_hw(local));
+               return -EADDRNOTAVAIL;
+       }
+
        switch (sdata->vif.type) {
        case IEEE80211_IF_TYPE_VLAN:
                /* no need to tell driver */
@@ -311,8 +347,8 @@ static int ieee80211_open(struct net_device *dev)
                        goto err_stop;
 
                if (ieee80211_vif_is_mesh(&sdata->vif))
-                       ieee80211_start_mesh(sdata->dev);
-               changed |= ieee80211_reset_erp_info(dev);
+                       ieee80211_start_mesh(sdata);
+               changed |= ieee80211_reset_erp_info(sdata);
                ieee80211_bss_info_change_notify(sdata, changed);
                ieee80211_enable_keys(sdata);
 
@@ -412,7 +448,7 @@ static int ieee80211_stop(struct net_device *dev)
 
        list_for_each_entry_rcu(sta, &local->sta_list, list) {
                if (sta->sdata == sdata)
-                       ieee80211_sta_tear_down_BA_sessions(dev, sta->addr);
+                       ieee80211_sta_tear_down_BA_sessions(sdata, sta->addr);
        }
 
        rcu_read_unlock();
@@ -503,7 +539,7 @@ static int ieee80211_stop(struct net_device *dev)
                /* fall through */
        case IEEE80211_IF_TYPE_STA:
        case IEEE80211_IF_TYPE_IBSS:
-               sdata->u.sta.state = IEEE80211_DISABLED;
+               sdata->u.sta.state = IEEE80211_STA_MLME_DISABLED;
                memset(sdata->u.sta.bssid, 0, ETH_ALEN);
                del_timer_sync(&sdata->u.sta.timer);
                /*
@@ -670,7 +706,7 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid)
        sta->ampdu_mlme.tid_tx[tid]->ssn = start_seq_num;
 
 
-       ieee80211_send_addba_request(sta->sdata->dev, ra, tid,
+       ieee80211_send_addba_request(sta->sdata, ra, tid,
                         sta->ampdu_mlme.tid_tx[tid]->dialog_token,
                         sta->ampdu_mlme.tid_tx[tid]->ssn,
                         0x40, 5000);
@@ -853,7 +889,7 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid)
        }
 
        if (*state & HT_AGG_STATE_INITIATOR_MSK)
-               ieee80211_send_delba(sta->sdata->dev, ra, tid,
+               ieee80211_send_delba(sta->sdata, ra, tid,
                        WLAN_BACK_INITIATOR, WLAN_REASON_QSTA_NOT_USE);
 
        agg_queue = sta->tid_to_tx_q[tid];
@@ -975,6 +1011,8 @@ void ieee80211_if_setup(struct net_device *dev)
        dev->open = ieee80211_open;
        dev->stop = ieee80211_stop;
        dev->destructor = free_netdev;
+       /* we will validate the address ourselves in ->open */
+       dev->validate_addr = NULL;
 }
 
 /* everything else */
@@ -1162,10 +1200,8 @@ void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata,
                                             changed);
 }
 
-u32 ieee80211_reset_erp_info(struct net_device *dev)
+u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-
        sdata->bss_conf.use_cts_prot = 0;
        sdata->bss_conf.use_short_preamble = 0;
        return BSS_CHANGED_ERP_CTS_PROT | BSS_CHANGED_ERP_PREAMBLE;
@@ -1244,9 +1280,10 @@ static void ieee80211_remove_tx_extra(struct ieee80211_local *local,
                                      struct ieee80211_key *key,
                                      struct sk_buff *skb)
 {
-       int hdrlen, iv_len, mic_len;
+       unsigned int hdrlen, iv_len, mic_len;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
 
-       hdrlen = ieee80211_get_hdrlen_from_skb(skb);
+       hdrlen = ieee80211_hdrlen(hdr->frame_control);
 
        if (!key)
                goto no_key;
@@ -1268,24 +1305,20 @@ static void ieee80211_remove_tx_extra(struct ieee80211_local *local,
                goto no_key;
        }
 
-       if (skb->len >= mic_len &&
+       if (skb->len >= hdrlen + mic_len &&
            !(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
                skb_trim(skb, skb->len - mic_len);
-       if (skb->len >= iv_len && skb->len > hdrlen) {
+       if (skb->len >= hdrlen + iv_len) {
                memmove(skb->data + iv_len, skb->data, hdrlen);
-               skb_pull(skb, iv_len);
+               hdr = (struct ieee80211_hdr *)skb_pull(skb, iv_len);
        }
 
 no_key:
-       {
-               struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-               u16 fc = le16_to_cpu(hdr->frame_control);
-               if ((fc & 0x8C) == 0x88) /* QoS Control Field */ {
-                       fc &= ~IEEE80211_STYPE_QOS_DATA;
-                       hdr->frame_control = cpu_to_le16(fc);
-                       memmove(skb->data + 2, skb->data, hdrlen - 2);
-                       skb_pull(skb, 2);
-               }
+       if (ieee80211_is_data_qos(hdr->frame_control)) {
+               hdr->frame_control &= ~cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
+               memmove(skb->data + IEEE80211_QOS_CTL_LEN, skb->data,
+                       hdrlen - IEEE80211_QOS_CTL_LEN);
+               skb_pull(skb, IEEE80211_QOS_CTL_LEN);
        }
 }
 
@@ -1403,7 +1436,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
                        tid = qc[0] & 0xf;
                        ssn = ((le16_to_cpu(hdr->seq_ctrl) + 0x10)
                                                & IEEE80211_SCTL_SEQ);
-                       ieee80211_send_bar(sta->sdata->dev, hdr->addr1,
+                       ieee80211_send_bar(sta->sdata, hdr->addr1,
                                           tid, ssn);
                }
        }
index b5933b271491551bc10edacdfda4416be6b8125d..b631703bcc82828ceac4a384115fcad100642fae 100644 (file)
@@ -39,14 +39,13 @@ void ieee80211s_stop(void)
  * mesh_matches_local - check if the config of a mesh point matches ours
  *
  * @ie: information elements of a management frame from the mesh peer
- * @dev: local mesh interface
+ * @sdata: local mesh subif
  *
  * This function checks if the mesh configuration of a mesh point matches the
  * local mesh configuration, i.e. if both nodes belong to the same mesh network.
  */
-bool mesh_matches_local(struct ieee802_11_elems *ie, struct net_device *dev)
+bool mesh_matches_local(struct ieee802_11_elems *ie, struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_if_sta *sta = &sdata->u.sta;
 
        /*
@@ -73,10 +72,8 @@ bool mesh_matches_local(struct ieee802_11_elems *ie, struct net_device *dev)
  * mesh_peer_accepts_plinks - check if an mp is willing to establish peer links
  *
  * @ie: information elements of a management frame from the mesh peer
- * @dev: local mesh interface
  */
-bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie,
-                             struct net_device *dev)
+bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie)
 {
        return (*(ie->mesh_config + CAPAB_OFFSET) & ACCEPT_PLINKS) != 0;
 }
@@ -111,9 +108,8 @@ void mesh_ids_set_default(struct ieee80211_if_sta *sta)
        memcpy(sta->mesh_cc_id, def_id, 4);
 }
 
-int mesh_rmc_init(struct net_device *dev)
+int mesh_rmc_init(struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        int i;
 
        sdata->u.sta.rmc = kmalloc(sizeof(struct mesh_rmc), GFP_KERNEL);
@@ -125,9 +121,8 @@ int mesh_rmc_init(struct net_device *dev)
        return 0;
 }
 
-void mesh_rmc_free(struct net_device *dev)
+void mesh_rmc_free(struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct mesh_rmc *rmc = sdata->u.sta.rmc;
        struct rmc_entry *p, *n;
        int i;
@@ -158,9 +153,8 @@ void mesh_rmc_free(struct net_device *dev)
  * it.
  */
 int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr,
-                  struct net_device *dev)
+                  struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct mesh_rmc *rmc = sdata->u.sta.rmc;
        u32 seqnum = 0;
        int entries = 0;
@@ -194,10 +188,9 @@ int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr,
        return 0;
 }
 
-void mesh_mgmt_ies_add(struct sk_buff *skb, struct net_device *dev)
+void mesh_mgmt_ies_add(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_supported_band *sband;
        u8 *pos;
        int len, i, rate;
@@ -262,10 +255,10 @@ void mesh_mgmt_ies_add(struct sk_buff *skb, struct net_device *dev)
        return;
 }
 
-u32 mesh_table_hash(u8 *addr, struct net_device *dev, struct mesh_table *tbl)
+u32 mesh_table_hash(u8 *addr, struct ieee80211_sub_if_data *sdata, struct mesh_table *tbl)
 {
        /* Use last four bytes of hw addr and interface index as hash index */
-       return jhash_2words(*(u32 *)(addr+2), dev->ifindex, tbl->hash_rnd)
+       return jhash_2words(*(u32 *)(addr+2), sdata->dev->ifindex, tbl->hash_rnd)
                & tbl->hash_mask;
 }
 
@@ -434,7 +427,7 @@ void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata)
        ifsta->preq_id = 0;
        ifsta->dsn = 0;
        atomic_set(&ifsta->mpaths, 0);
-       mesh_rmc_init(sdata->dev);
+       mesh_rmc_init(sdata);
        ifsta->last_preq = jiffies;
        /* Allocate all mesh structures when creating the first mesh interface. */
        if (!mesh_allocated)
index 7495fbb0d211b14e0d311e03f6647e31aefd372f..84ff5d828fdb9db07e0b074644636f573ef0d903 100644 (file)
@@ -47,7 +47,7 @@ enum mesh_path_flags {
  * struct mesh_path - mac80211 mesh path structure
  *
  * @dst: mesh path destination mac address
- * @dev: mesh path device
+ * @sdata: mesh subif
  * @next_hop: mesh neighbor to which frames for this destination will be
  *     forwarded
  * @timer: mesh path discovery timer
@@ -64,14 +64,14 @@ enum mesh_path_flags {
  * @state_lock: mesh pat state lock
  *
  *
- * The combination of dst and dev is unique in the mesh path table. Since the
+ * The combination of dst and sdata is unique in the mesh path table. Since the
  * next_hop STA is only protected by RCU as well, deleting the STA must also
  * remove/substitute the mesh_path structure and wait until that is no longer
  * reachable before destroying the STA completely.
  */
 struct mesh_path {
        u8 dst[ETH_ALEN];
-       struct net_device *dev;
+       struct ieee80211_sub_if_data *sdata;
        struct sta_info *next_hop;
        struct timer_list timer;
        struct sk_buff_head frame_queue;
@@ -203,59 +203,66 @@ int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr);
 int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr,
                struct ieee80211_sub_if_data *sdata);
 int mesh_rmc_check(u8 *addr, struct ieee80211s_hdr *mesh_hdr,
-               struct net_device *dev);
-bool mesh_matches_local(struct ieee802_11_elems *ie, struct net_device *dev);
+               struct ieee80211_sub_if_data *sdata);
+bool mesh_matches_local(struct ieee802_11_elems *ie,
+               struct ieee80211_sub_if_data *sdata);
 void mesh_ids_set_default(struct ieee80211_if_sta *sta);
-void mesh_mgmt_ies_add(struct sk_buff *skb, struct net_device *dev);
-void mesh_rmc_free(struct net_device *dev);
-int mesh_rmc_init(struct net_device *dev);
+void mesh_mgmt_ies_add(struct sk_buff *skb,
+               struct ieee80211_sub_if_data *sdata);
+void mesh_rmc_free(struct ieee80211_sub_if_data *sdata);
+int mesh_rmc_init(struct ieee80211_sub_if_data *sdata);
 void ieee80211s_init(void);
 void ieee80211s_stop(void);
 void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata);
 
 /* Mesh paths */
-int mesh_nexthop_lookup(struct sk_buff *skb, struct net_device *dev);
-void mesh_path_start_discovery(struct net_device *dev);
-struct mesh_path *mesh_path_lookup(u8 *dst, struct net_device *dev);
-struct mesh_path *mesh_path_lookup_by_idx(int idx, struct net_device *dev);
+int mesh_nexthop_lookup(struct sk_buff *skb,
+               struct ieee80211_sub_if_data *sdata);
+void mesh_path_start_discovery(struct ieee80211_sub_if_data *sdata);
+struct mesh_path *mesh_path_lookup(u8 *dst,
+               struct ieee80211_sub_if_data *sdata);
+struct mesh_path *mesh_path_lookup_by_idx(int idx,
+               struct ieee80211_sub_if_data *sdata);
 void mesh_path_fix_nexthop(struct mesh_path *mpath, struct sta_info *next_hop);
-void mesh_path_expire(struct net_device *dev);
-void mesh_path_flush(struct net_device *dev);
-void mesh_rx_path_sel_frame(struct net_device *dev, struct ieee80211_mgmt *mgmt,
-               size_t len);
-int mesh_path_add(u8 *dst, struct net_device *dev);
+void mesh_path_expire(struct ieee80211_sub_if_data *sdata);
+void mesh_path_flush(struct ieee80211_sub_if_data *sdata);
+void mesh_rx_path_sel_frame(struct ieee80211_sub_if_data *sdata,
+               struct ieee80211_mgmt *mgmt, size_t len);
+int mesh_path_add(u8 *dst, struct ieee80211_sub_if_data *sdata);
 /* Mesh plinks */
-void mesh_neighbour_update(u8 *hw_addr, u64 rates, struct net_device *dev,
-               bool add);
-bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie,
-                             struct net_device *dev);
+void mesh_neighbour_update(u8 *hw_addr, u64 rates,
+               struct ieee80211_sub_if_data *sdata, bool add);
+bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie);
 void mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata);
 void mesh_plink_broken(struct sta_info *sta);
 void mesh_plink_deactivate(struct sta_info *sta);
 int mesh_plink_open(struct sta_info *sta);
 int mesh_plink_close(struct sta_info *sta);
 void mesh_plink_block(struct sta_info *sta);
-void mesh_rx_plink_frame(struct net_device *dev, struct ieee80211_mgmt *mgmt,
-                        size_t len, struct ieee80211_rx_status *rx_status);
+void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata,
+                        struct ieee80211_mgmt *mgmt, size_t len,
+                        struct ieee80211_rx_status *rx_status);
 
 /* Private interfaces */
 /* Mesh tables */
 struct mesh_table *mesh_table_alloc(int size_order);
 void mesh_table_free(struct mesh_table *tbl, bool free_leafs);
 struct mesh_table *mesh_table_grow(struct mesh_table *tbl);
-u32 mesh_table_hash(u8 *addr, struct net_device *dev, struct mesh_table *tbl);
+u32 mesh_table_hash(u8 *addr, struct ieee80211_sub_if_data *sdata,
+               struct mesh_table *tbl);
 /* Mesh paths */
 int mesh_path_error_tx(u8 *dest, __le32 dest_dsn, u8 *ra,
-               struct net_device *dev);
+               struct ieee80211_sub_if_data *sdata);
 void mesh_path_assign_nexthop(struct mesh_path *mpath, struct sta_info *sta);
 void mesh_path_flush_pending(struct mesh_path *mpath);
 void mesh_path_tx_pending(struct mesh_path *mpath);
 int mesh_pathtbl_init(void);
 void mesh_pathtbl_unregister(void);
-int mesh_path_del(u8 *addr, struct net_device *dev);
+int mesh_path_del(u8 *addr, struct ieee80211_sub_if_data *sdata);
 void mesh_path_timer(unsigned long data);
 void mesh_path_flush_by_nexthop(struct sta_info *sta);
-void mesh_path_discard_frame(struct sk_buff *skb, struct net_device *dev);
+void mesh_path_discard_frame(struct sk_buff *skb,
+               struct ieee80211_sub_if_data *sdata);
 
 #ifdef CONFIG_MAC80211_MESH
 extern int mesh_allocated;
index 08aca446ca01822c5e7ca25c51cef9dca515168b..eeb0ce2d5d377295d936fd9a8b2b7b40bf76ee7b 100644 (file)
@@ -82,9 +82,9 @@ enum mpath_frame_type {
 static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags,
                u8 *orig_addr, __le32 orig_dsn, u8 dst_flags, u8 *dst,
                __le32 dst_dsn, u8 *da, u8 hop_count, u8 ttl, __le32 lifetime,
-               __le32 metric, __le32 preq_id, struct net_device *dev)
+               __le32 metric, __le32 preq_id, struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400);
        struct ieee80211_mgmt *mgmt;
        u8 *pos;
@@ -99,11 +99,11 @@ static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags,
        mgmt = (struct ieee80211_mgmt *)
                skb_put(skb, 25 + sizeof(mgmt->u.action.u.mesh_action));
        memset(mgmt, 0, 25 + sizeof(mgmt->u.action.u.mesh_action));
-       mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                          IEEE80211_STYPE_ACTION);
+       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                         IEEE80211_STYPE_ACTION);
 
        memcpy(mgmt->da, da, ETH_ALEN);
-       memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+       memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
        /* BSSID is left zeroed, wildcard value */
        mgmt->u.action.category = MESH_PATH_SEL_CATEGORY;
        mgmt->u.action.u.mesh_action.action_code = action;
@@ -149,7 +149,7 @@ static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags,
        pos += ETH_ALEN;
        memcpy(pos, &dst_dsn, 4);
 
-       ieee80211_sta_tx(dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
        return 0;
 }
 
@@ -161,9 +161,9 @@ static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags,
  * @ra: node this frame is addressed to
  */
 int mesh_path_error_tx(u8 *dst, __le32 dst_dsn, u8 *ra,
-               struct net_device *dev)
+               struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400);
        struct ieee80211_mgmt *mgmt;
        u8 *pos;
@@ -178,11 +178,11 @@ int mesh_path_error_tx(u8 *dst, __le32 dst_dsn, u8 *ra,
        mgmt = (struct ieee80211_mgmt *)
                skb_put(skb, 25 + sizeof(mgmt->u.action.u.mesh_action));
        memset(mgmt, 0, 25 + sizeof(mgmt->u.action.u.mesh_action));
-       mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                          IEEE80211_STYPE_ACTION);
+       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                         IEEE80211_STYPE_ACTION);
 
        memcpy(mgmt->da, ra, ETH_ALEN);
-       memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+       memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
        /* BSSID is left zeroed, wildcard value */
        mgmt->u.action.category = MESH_PATH_SEL_CATEGORY;
        mgmt->u.action.u.mesh_action.action_code = MPATH_PERR;
@@ -198,7 +198,7 @@ int mesh_path_error_tx(u8 *dst, __le32 dst_dsn, u8 *ra,
        pos += ETH_ALEN;
        memcpy(pos, &dst_dsn, 4);
 
-       ieee80211_sta_tx(dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
        return 0;
 }
 
@@ -233,7 +233,7 @@ static u32 airtime_link_metric_get(struct ieee80211_local *local,
 /**
  * hwmp_route_info_get - Update routing info to originator and transmitter
  *
- * @dev: local mesh interface
+ * @sdata: local mesh subif
  * @mgmt: mesh management frame
  * @hwmp_ie: hwmp information element (PREP or PREQ)
  *
@@ -246,11 +246,11 @@ static u32 airtime_link_metric_get(struct ieee80211_local *local,
  * Notes: this function is the only place (besides user-provided info) where
  * path routing information is updated.
  */
-static u32 hwmp_route_info_get(struct net_device *dev,
+static u32 hwmp_route_info_get(struct ieee80211_sub_if_data *sdata,
                            struct ieee80211_mgmt *mgmt,
                            u8 *hwmp_ie)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct mesh_path *mpath;
        struct sta_info *sta;
        bool fresh_info;
@@ -301,14 +301,14 @@ static u32 hwmp_route_info_get(struct net_device *dev,
                new_metric = MAX_METRIC;
        exp_time = TU_TO_EXP_TIME(orig_lifetime);
 
-       if (memcmp(orig_addr, dev->dev_addr, ETH_ALEN) == 0) {
+       if (memcmp(orig_addr, sdata->dev->dev_addr, ETH_ALEN) == 0) {
                /* This MP is the originator, we are not interested in this
                 * frame, except for updating transmitter's path info.
                 */
                process = false;
                fresh_info = false;
        } else {
-               mpath = mesh_path_lookup(orig_addr, dev);
+               mpath = mesh_path_lookup(orig_addr, sdata);
                if (mpath) {
                        spin_lock_bh(&mpath->state_lock);
                        if (mpath->flags & MESH_PATH_FIXED)
@@ -324,8 +324,8 @@ static u32 hwmp_route_info_get(struct net_device *dev,
                                }
                        }
                } else {
-                       mesh_path_add(orig_addr, dev);
-                       mpath = mesh_path_lookup(orig_addr, dev);
+                       mesh_path_add(orig_addr, sdata);
+                       mpath = mesh_path_lookup(orig_addr, sdata);
                        if (!mpath) {
                                rcu_read_unlock();
                                return 0;
@@ -357,7 +357,7 @@ static u32 hwmp_route_info_get(struct net_device *dev,
        else {
                fresh_info = true;
 
-               mpath = mesh_path_lookup(ta, dev);
+               mpath = mesh_path_lookup(ta, sdata);
                if (mpath) {
                        spin_lock_bh(&mpath->state_lock);
                        if ((mpath->flags & MESH_PATH_FIXED) ||
@@ -365,8 +365,8 @@ static u32 hwmp_route_info_get(struct net_device *dev,
                                        (last_hop_metric > mpath->metric)))
                                fresh_info = false;
                } else {
-                       mesh_path_add(ta, dev);
-                       mpath = mesh_path_lookup(ta, dev);
+                       mesh_path_add(ta, sdata);
+                       mpath = mesh_path_lookup(ta, sdata);
                        if (!mpath) {
                                rcu_read_unlock();
                                return 0;
@@ -392,10 +392,9 @@ static u32 hwmp_route_info_get(struct net_device *dev,
        return process ? new_metric : 0;
 }
 
-static void hwmp_preq_frame_process(struct net_device *dev,
+static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
                                    struct ieee80211_mgmt *mgmt,
                                    u8 *preq_elem, u32 metric) {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_if_sta *ifsta = &sdata->u.sta;
        struct mesh_path *mpath;
        u8 *dst_addr, *orig_addr;
@@ -411,7 +410,7 @@ static void hwmp_preq_frame_process(struct net_device *dev,
        orig_dsn = PREQ_IE_ORIG_DSN(preq_elem);
        dst_flags = PREQ_IE_DST_F(preq_elem);
 
-       if (memcmp(dst_addr, dev->dev_addr, ETH_ALEN) == 0) {
+       if (memcmp(dst_addr, sdata->dev->dev_addr, ETH_ALEN) == 0) {
                forward = false;
                reply = true;
                metric = 0;
@@ -423,7 +422,7 @@ static void hwmp_preq_frame_process(struct net_device *dev,
                }
        } else {
                rcu_read_lock();
-               mpath = mesh_path_lookup(dst_addr, dev);
+               mpath = mesh_path_lookup(dst_addr, sdata);
                if (mpath) {
                        if ((!(mpath->flags & MESH_PATH_DSN_VALID)) ||
                                        DSN_LT(mpath->dsn, dst_dsn)) {
@@ -451,7 +450,7 @@ static void hwmp_preq_frame_process(struct net_device *dev,
                                cpu_to_le32(dst_dsn), 0, orig_addr,
                                cpu_to_le32(orig_dsn), mgmt->sa, 0, ttl,
                                cpu_to_le32(lifetime), cpu_to_le32(metric),
-                               0, dev);
+                               0, sdata);
                else
                        ifsta->mshstats.dropped_frames_ttl++;
        }
@@ -472,20 +471,19 @@ static void hwmp_preq_frame_process(struct net_device *dev,
                hopcount = PREQ_IE_HOPCOUNT(preq_elem) + 1;
                mesh_path_sel_frame_tx(MPATH_PREQ, flags, orig_addr,
                                cpu_to_le32(orig_dsn), dst_flags, dst_addr,
-                               cpu_to_le32(dst_dsn), dev->broadcast,
+                               cpu_to_le32(dst_dsn), sdata->dev->broadcast,
                                hopcount, ttl, cpu_to_le32(lifetime),
                                cpu_to_le32(metric), cpu_to_le32(preq_id),
-                               dev);
+                               sdata);
                ifsta->mshstats.fwded_frames++;
        }
 }
 
 
-static void hwmp_prep_frame_process(struct net_device *dev,
+static void hwmp_prep_frame_process(struct ieee80211_sub_if_data *sdata,
                                    struct ieee80211_mgmt *mgmt,
                                    u8 *prep_elem, u32 metric)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct mesh_path *mpath;
        u8 *dst_addr, *orig_addr;
        u8 ttl, hopcount, flags;
@@ -499,7 +497,7 @@ static void hwmp_prep_frame_process(struct net_device *dev,
         * replies
         */
        dst_addr = PREP_IE_DST_ADDR(prep_elem);
-       if (memcmp(dst_addr, dev->dev_addr, ETH_ALEN) == 0)
+       if (memcmp(dst_addr, sdata->dev->dev_addr, ETH_ALEN) == 0)
                /* destination, no forwarding required */
                return;
 
@@ -510,7 +508,7 @@ static void hwmp_prep_frame_process(struct net_device *dev,
        }
 
        rcu_read_lock();
-       mpath = mesh_path_lookup(dst_addr, dev);
+       mpath = mesh_path_lookup(dst_addr, sdata);
        if (mpath)
                spin_lock_bh(&mpath->state_lock);
        else
@@ -533,7 +531,7 @@ static void hwmp_prep_frame_process(struct net_device *dev,
                cpu_to_le32(orig_dsn), 0, dst_addr,
                cpu_to_le32(dst_dsn), mpath->next_hop->addr, hopcount, ttl,
                cpu_to_le32(lifetime), cpu_to_le32(metric),
-               0, dev);
+               0, sdata);
        rcu_read_unlock();
        sdata->u.sta.mshstats.fwded_frames++;
        return;
@@ -544,7 +542,7 @@ fail:
        return;
 }
 
-static void hwmp_perr_frame_process(struct net_device *dev,
+static void hwmp_perr_frame_process(struct ieee80211_sub_if_data *sdata,
                             struct ieee80211_mgmt *mgmt, u8 *perr_elem)
 {
        struct mesh_path *mpath;
@@ -555,7 +553,7 @@ static void hwmp_perr_frame_process(struct net_device *dev,
        dst_addr = PERR_IE_DST_ADDR(perr_elem);
        dst_dsn = PERR_IE_DST_DSN(perr_elem);
        rcu_read_lock();
-       mpath = mesh_path_lookup(dst_addr, dev);
+       mpath = mesh_path_lookup(dst_addr, sdata);
        if (mpath) {
                spin_lock_bh(&mpath->state_lock);
                if (mpath->flags & MESH_PATH_ACTIVE &&
@@ -566,7 +564,7 @@ static void hwmp_perr_frame_process(struct net_device *dev,
                        mpath->dsn = dst_dsn;
                        spin_unlock_bh(&mpath->state_lock);
                        mesh_path_error_tx(dst_addr, cpu_to_le32(dst_dsn),
-                                          dev->broadcast, dev);
+                                          sdata->dev->broadcast, sdata);
                } else
                        spin_unlock_bh(&mpath->state_lock);
        }
@@ -575,7 +573,7 @@ static void hwmp_perr_frame_process(struct net_device *dev,
 
 
 
-void mesh_rx_path_sel_frame(struct net_device *dev,
+void mesh_rx_path_sel_frame(struct ieee80211_sub_if_data *sdata,
                            struct ieee80211_mgmt *mgmt,
                            size_t len)
 {
@@ -592,25 +590,25 @@ void mesh_rx_path_sel_frame(struct net_device *dev,
                if (!elems.preq || elems.preq_len != 37)
                        /* Right now we support just 1 destination and no AE */
                        return;
-               last_hop_metric = hwmp_route_info_get(dev, mgmt, elems.preq);
+               last_hop_metric = hwmp_route_info_get(sdata, mgmt, elems.preq);
                if (!last_hop_metric)
                        return;
-               hwmp_preq_frame_process(dev, mgmt, elems.preq, last_hop_metric);
+               hwmp_preq_frame_process(sdata, mgmt, elems.preq, last_hop_metric);
                break;
        case MPATH_PREP:
                if (!elems.prep || elems.prep_len != 31)
                        /* Right now we support no AE */
                        return;
-               last_hop_metric = hwmp_route_info_get(dev, mgmt, elems.prep);
+               last_hop_metric = hwmp_route_info_get(sdata, mgmt, elems.prep);
                if (!last_hop_metric)
                        return;
-               hwmp_prep_frame_process(dev, mgmt, elems.prep, last_hop_metric);
+               hwmp_prep_frame_process(sdata, mgmt, elems.prep, last_hop_metric);
                break;
        case MPATH_PERR:
                if (!elems.perr || elems.perr_len != 12)
                        /* Right now we support only one destination per PERR */
                        return;
-               hwmp_perr_frame_process(dev, mgmt, elems.perr);
+               hwmp_perr_frame_process(sdata, mgmt, elems.perr);
        default:
                return;
        }
@@ -628,8 +626,7 @@ void mesh_rx_path_sel_frame(struct net_device *dev,
  */
 static void mesh_queue_preq(struct mesh_path *mpath, u8 flags)
 {
-       struct ieee80211_sub_if_data *sdata =
-               IEEE80211_DEV_TO_SUB_IF(mpath->dev);
+       struct ieee80211_sub_if_data *sdata = mpath->sdata;
        struct ieee80211_if_sta *ifsta = &sdata->u.sta;
        struct mesh_preq_queue *preq_node;
 
@@ -672,12 +669,10 @@ static void mesh_queue_preq(struct mesh_path *mpath, u8 flags)
 /**
  * mesh_path_start_discovery - launch a path discovery from the PREQ queue
  *
- * @dev: local mesh interface
+ * @sdata: local mesh subif
  */
-void mesh_path_start_discovery(struct net_device *dev)
+void mesh_path_start_discovery(struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_sub_if_data *sdata =
-               IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_if_sta *ifsta = &sdata->u.sta;
        struct mesh_preq_queue *preq_node;
        struct mesh_path *mpath;
@@ -699,7 +694,7 @@ void mesh_path_start_discovery(struct net_device *dev)
        spin_unlock(&ifsta->mesh_preq_queue_lock);
 
        rcu_read_lock();
-       mpath = mesh_path_lookup(preq_node->dst, dev);
+       mpath = mesh_path_lookup(preq_node->dst, sdata);
        if (!mpath)
                goto enddiscovery;
 
@@ -743,11 +738,11 @@ void mesh_path_start_discovery(struct net_device *dev)
                dst_flags = MP_F_RF;
 
        spin_unlock_bh(&mpath->state_lock);
-       mesh_path_sel_frame_tx(MPATH_PREQ, 0, dev->dev_addr,
+       mesh_path_sel_frame_tx(MPATH_PREQ, 0, sdata->dev->dev_addr,
                        cpu_to_le32(ifsta->dsn), dst_flags, mpath->dst,
-                       cpu_to_le32(mpath->dsn), dev->broadcast, 0,
+                       cpu_to_le32(mpath->dsn), sdata->dev->broadcast, 0,
                        ttl, cpu_to_le32(lifetime), 0,
-                       cpu_to_le32(ifsta->preq_id++), dev);
+                       cpu_to_le32(ifsta->preq_id++), sdata);
        mod_timer(&mpath->timer, jiffies + mpath->discovery_timeout);
 
 enddiscovery:
@@ -759,7 +754,7 @@ enddiscovery:
  * ieee80211s_lookup_nexthop - put the appropriate next hop on a mesh frame
  *
  * @skb: 802.11 frame to be sent
- * @dev: network device the frame will be sent through
+ * @sdata: network subif the frame will be sent through
  * @fwd_frame: true if this frame was originally from a different host
  *
  * Returns: 0 if the next hop was found. Nonzero otherwise. If no next hop is
@@ -767,9 +762,9 @@ enddiscovery:
  * sent when the path is resolved. This means the caller must not free the skb
  * in this case.
  */
-int mesh_nexthop_lookup(struct sk_buff *skb, struct net_device *dev)
+int mesh_nexthop_lookup(struct sk_buff *skb,
+                       struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct sk_buff *skb_to_free = NULL;
        struct mesh_path *mpath;
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
@@ -777,11 +772,11 @@ int mesh_nexthop_lookup(struct sk_buff *skb, struct net_device *dev)
        int err = 0;
 
        rcu_read_lock();
-       mpath = mesh_path_lookup(dst_addr, dev);
+       mpath = mesh_path_lookup(dst_addr, sdata);
 
        if (!mpath) {
-               mesh_path_add(dst_addr, dev);
-               mpath = mesh_path_lookup(dst_addr, dev);
+               mesh_path_add(dst_addr, sdata);
+               mpath = mesh_path_lookup(dst_addr, sdata);
                if (!mpath) {
                        dev_kfree_skb(skb);
                        sdata->u.sta.mshstats.dropped_frames_no_route++;
@@ -793,7 +788,8 @@ int mesh_nexthop_lookup(struct sk_buff *skb, struct net_device *dev)
        if (mpath->flags & MESH_PATH_ACTIVE) {
                if (time_after(jiffies, mpath->exp_time -
                        msecs_to_jiffies(sdata->u.sta.mshcfg.path_refresh_time))
-                               && !memcmp(dev->dev_addr, hdr->addr4, ETH_ALEN)
+                               && !memcmp(sdata->dev->dev_addr, hdr->addr4,
+                                          ETH_ALEN)
                                && !(mpath->flags & MESH_PATH_RESOLVING)
                                && !(mpath->flags & MESH_PATH_FIXED)) {
                        mesh_queue_preq(mpath,
@@ -815,7 +811,7 @@ int mesh_nexthop_lookup(struct sk_buff *skb, struct net_device *dev)
 
                skb_queue_tail(&mpath->frame_queue, skb);
                if (skb_to_free)
-                       mesh_path_discard_frame(skb_to_free, dev);
+                       mesh_path_discard_frame(skb_to_free, sdata);
                err = -ENOENT;
        }
 
@@ -835,7 +831,7 @@ void mesh_path_timer(unsigned long data)
        if (!mpath)
                goto endmpathtimer;
        spin_lock_bh(&mpath->state_lock);
-       sdata = IEEE80211_DEV_TO_SUB_IF(mpath->dev);
+       sdata = mpath->sdata;
        if (mpath->flags & MESH_PATH_RESOLVED ||
                        (!(mpath->flags & MESH_PATH_RESOLVING)))
                mpath->flags &= ~(MESH_PATH_RESOLVING | MESH_PATH_RESOLVED);
index 838ee60492ad4d84780692aff2861d015e52886a..0a60f55f32abc81644dfd1179b4ee291982aeaf3 100644 (file)
@@ -9,7 +9,6 @@
 
 #include <linux/etherdevice.h>
 #include <linux/list.h>
-#include <linux/netdevice.h>
 #include <linux/random.h>
 #include <linux/spinlock.h>
 #include <linux/string.h>
@@ -62,13 +61,13 @@ void mesh_path_assign_nexthop(struct mesh_path *mpath, struct sta_info *sta)
 /**
  * mesh_path_lookup - look up a path in the mesh path table
  * @dst: hardware address (ETH_ALEN length) of destination
- * @dev: local interface
+ * @sdata: local subif
  *
  * Returns: pointer to the mesh path structure, or NULL if not found
  *
  * Locking: must be called within a read rcu section.
  */
-struct mesh_path *mesh_path_lookup(u8 *dst, struct net_device *dev)
+struct mesh_path *mesh_path_lookup(u8 *dst, struct ieee80211_sub_if_data *sdata)
 {
        struct mesh_path *mpath;
        struct hlist_node *n;
@@ -78,10 +77,10 @@ struct mesh_path *mesh_path_lookup(u8 *dst, struct net_device *dev)
 
        tbl = rcu_dereference(mesh_paths);
 
-       bucket = &tbl->hash_buckets[mesh_table_hash(dst, dev, tbl)];
+       bucket = &tbl->hash_buckets[mesh_table_hash(dst, sdata, tbl)];
        hlist_for_each_entry_rcu(node, n, bucket, list) {
                mpath = node->mpath;
-               if (mpath->dev == dev &&
+               if (mpath->sdata == sdata &&
                                memcmp(dst, mpath->dst, ETH_ALEN) == 0) {
                        if (MPATH_EXPIRED(mpath)) {
                                spin_lock_bh(&mpath->state_lock);
@@ -98,13 +97,13 @@ struct mesh_path *mesh_path_lookup(u8 *dst, struct net_device *dev)
 /**
  * mesh_path_lookup_by_idx - look up a path in the mesh path table by its index
  * @idx: index
- * @dev: local interface, or NULL for all entries
+ * @sdata: local subif, or NULL for all entries
  *
  * Returns: pointer to the mesh path structure, or NULL if not found.
  *
  * Locking: must be called within a read rcu section.
  */
-struct mesh_path *mesh_path_lookup_by_idx(int idx, struct net_device *dev)
+struct mesh_path *mesh_path_lookup_by_idx(int idx, struct ieee80211_sub_if_data *sdata)
 {
        struct mpath_node *node;
        struct hlist_node *p;
@@ -112,7 +111,7 @@ struct mesh_path *mesh_path_lookup_by_idx(int idx, struct net_device *dev)
        int j = 0;
 
        for_each_mesh_entry(mesh_paths, p, node, i) {
-               if (dev && node->mpath->dev != dev)
+               if (sdata && node->mpath->sdata != sdata)
                        continue;
                if (j++ == idx) {
                        if (MPATH_EXPIRED(node->mpath)) {
@@ -131,15 +130,14 @@ struct mesh_path *mesh_path_lookup_by_idx(int idx, struct net_device *dev)
 /**
  * mesh_path_add - allocate and add a new path to the mesh path table
  * @addr: destination address of the path (ETH_ALEN length)
- * @dev: local interface
+ * @sdata: local subif
  *
  * Returns: 0 on sucess
  *
  * State: the initial state of the new path is set to 0
  */
-int mesh_path_add(u8 *dst, struct net_device *dev)
+int mesh_path_add(u8 *dst, struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct mesh_path *mpath, *new_mpath;
        struct mpath_node *node, *new_node;
        struct hlist_head *bucket;
@@ -148,7 +146,7 @@ int mesh_path_add(u8 *dst, struct net_device *dev)
        int err = 0;
        u32 hash_idx;
 
-       if (memcmp(dst, dev->dev_addr, ETH_ALEN) == 0)
+       if (memcmp(dst, sdata->dev->dev_addr, ETH_ALEN) == 0)
                /* never add ourselves as neighbours */
                return -ENOTSUPP;
 
@@ -169,7 +167,7 @@ int mesh_path_add(u8 *dst, struct net_device *dev)
 
        read_lock(&pathtbl_resize_lock);
        memcpy(new_mpath->dst, dst, ETH_ALEN);
-       new_mpath->dev = dev;
+       new_mpath->sdata = sdata;
        new_mpath->flags = 0;
        skb_queue_head_init(&new_mpath->frame_queue);
        new_node->mpath = new_mpath;
@@ -179,7 +177,7 @@ int mesh_path_add(u8 *dst, struct net_device *dev)
        spin_lock_init(&new_mpath->state_lock);
        init_timer(&new_mpath->timer);
 
-       hash_idx = mesh_table_hash(dst, dev, mesh_paths);
+       hash_idx = mesh_table_hash(dst, sdata, mesh_paths);
        bucket = &mesh_paths->hash_buckets[hash_idx];
 
        spin_lock(&mesh_paths->hashwlock[hash_idx]);
@@ -187,7 +185,7 @@ int mesh_path_add(u8 *dst, struct net_device *dev)
        err = -EEXIST;
        hlist_for_each_entry(node, n, bucket, list) {
                mpath = node->mpath;
-               if (mpath->dev == dev && memcmp(dst, mpath->dst, ETH_ALEN) == 0)
+               if (mpath->sdata == sdata && memcmp(dst, mpath->dst, ETH_ALEN) == 0)
                        goto err_exists;
        }
 
@@ -241,7 +239,7 @@ void mesh_plink_broken(struct sta_info *sta)
        struct mesh_path *mpath;
        struct mpath_node *node;
        struct hlist_node *p;
-       struct net_device *dev = sta->sdata->dev;
+       struct ieee80211_sub_if_data *sdata = sta->sdata;
        int i;
 
        rcu_read_lock();
@@ -256,7 +254,7 @@ void mesh_plink_broken(struct sta_info *sta)
                        spin_unlock_bh(&mpath->state_lock);
                        mesh_path_error_tx(mpath->dst,
                                        cpu_to_le32(mpath->dsn),
-                                       dev->broadcast, dev);
+                                       sdata->dev->broadcast, sdata);
                } else
                spin_unlock_bh(&mpath->state_lock);
        }
@@ -284,11 +282,11 @@ void mesh_path_flush_by_nexthop(struct sta_info *sta)
        for_each_mesh_entry(mesh_paths, p, node, i) {
                mpath = node->mpath;
                if (mpath->next_hop == sta)
-                       mesh_path_del(mpath->dst, mpath->dev);
+                       mesh_path_del(mpath->dst, mpath->sdata);
        }
 }
 
-void mesh_path_flush(struct net_device *dev)
+void mesh_path_flush(struct ieee80211_sub_if_data *sdata)
 {
        struct mesh_path *mpath;
        struct mpath_node *node;
@@ -297,16 +295,15 @@ void mesh_path_flush(struct net_device *dev)
 
        for_each_mesh_entry(mesh_paths, p, node, i) {
                mpath = node->mpath;
-               if (mpath->dev == dev)
-                       mesh_path_del(mpath->dst, mpath->dev);
+               if (mpath->sdata == sdata)
+                       mesh_path_del(mpath->dst, mpath->sdata);
        }
 }
 
 static void mesh_path_node_reclaim(struct rcu_head *rp)
 {
        struct mpath_node *node = container_of(rp, struct mpath_node, rcu);
-       struct ieee80211_sub_if_data *sdata =
-               IEEE80211_DEV_TO_SUB_IF(node->mpath->dev);
+       struct ieee80211_sub_if_data *sdata = node->mpath->sdata;
 
        del_timer_sync(&node->mpath->timer);
        atomic_dec(&sdata->u.sta.mpaths);
@@ -318,11 +315,11 @@ static void mesh_path_node_reclaim(struct rcu_head *rp)
  * mesh_path_del - delete a mesh path from the table
  *
  * @addr: dst address (ETH_ALEN length)
- * @dev: local interface
+ * @sdata: local subif
  *
  * Returns: 0 if succesful
  */
-int mesh_path_del(u8 *addr, struct net_device *dev)
+int mesh_path_del(u8 *addr, struct ieee80211_sub_if_data *sdata)
 {
        struct mesh_path *mpath;
        struct mpath_node *node;
@@ -332,13 +329,13 @@ int mesh_path_del(u8 *addr, struct net_device *dev)
        int err = 0;
 
        read_lock(&pathtbl_resize_lock);
-       hash_idx = mesh_table_hash(addr, dev, mesh_paths);
+       hash_idx = mesh_table_hash(addr, sdata, mesh_paths);
        bucket = &mesh_paths->hash_buckets[hash_idx];
 
        spin_lock(&mesh_paths->hashwlock[hash_idx]);
        hlist_for_each_entry(node, n, bucket, list) {
                mpath = node->mpath;
-               if (mpath->dev == dev &&
+               if (mpath->sdata == sdata &&
                                memcmp(addr, mpath->dst, ETH_ALEN) == 0) {
                        spin_lock_bh(&mpath->state_lock);
                        mpath->flags |= MESH_PATH_RESOLVING;
@@ -378,29 +375,29 @@ void mesh_path_tx_pending(struct mesh_path *mpath)
  * mesh_path_discard_frame - discard a frame whose path could not be resolved
  *
  * @skb: frame to discard
- * @dev: network device the frame was to be sent through
+ * @sdata: network subif the frame was to be sent through
  *
  * If the frame was beign forwarded from another MP, a PERR frame will be sent
  * to the precursor.
  *
  * Locking: the function must me called within a rcu_read_lock region
  */
-void mesh_path_discard_frame(struct sk_buff *skb, struct net_device *dev)
+void mesh_path_discard_frame(struct sk_buff *skb,
+                            struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
        struct mesh_path *mpath;
        u32 dsn = 0;
 
-       if (memcmp(hdr->addr4, dev->dev_addr, ETH_ALEN) != 0) {
+       if (memcmp(hdr->addr4, sdata->dev->dev_addr, ETH_ALEN) != 0) {
                u8 *ra, *da;
 
                da = hdr->addr3;
                ra = hdr->addr2;
-               mpath = mesh_path_lookup(da, dev);
+               mpath = mesh_path_lookup(da, sdata);
                if (mpath)
                        dsn = ++mpath->dsn;
-               mesh_path_error_tx(skb->data, cpu_to_le32(dsn), ra, dev);
+               mesh_path_error_tx(skb->data, cpu_to_le32(dsn), ra, sdata);
        }
 
        kfree_skb(skb);
@@ -416,14 +413,11 @@ void mesh_path_discard_frame(struct sk_buff *skb, struct net_device *dev)
  */
 void mesh_path_flush_pending(struct mesh_path *mpath)
 {
-       struct ieee80211_sub_if_data *sdata;
        struct sk_buff *skb;
 
-       sdata = IEEE80211_DEV_TO_SUB_IF(mpath->dev);
-
        while ((skb = skb_dequeue(&mpath->frame_queue)) &&
                        (mpath->flags & MESH_PATH_ACTIVE))
-               mesh_path_discard_frame(skb, mpath->dev);
+               mesh_path_discard_frame(skb, mpath->sdata);
 }
 
 /**
@@ -472,7 +466,7 @@ static int mesh_path_node_copy(struct hlist_node *p, struct mesh_table *newtbl)
        node = hlist_entry(p, struct mpath_node, list);
        mpath = node->mpath;
        new_node->mpath = mpath;
-       hash_idx = mesh_table_hash(mpath->dst, mpath->dev, newtbl);
+       hash_idx = mesh_table_hash(mpath->dst, mpath->sdata, newtbl);
        hlist_add_head(&new_node->list,
                        &newtbl->hash_buckets[hash_idx]);
        return 0;
@@ -489,7 +483,7 @@ int mesh_pathtbl_init(void)
        return 0;
 }
 
-void mesh_path_expire(struct net_device *dev)
+void mesh_path_expire(struct ieee80211_sub_if_data *sdata)
 {
        struct mesh_path *mpath;
        struct mpath_node *node;
@@ -498,7 +492,7 @@ void mesh_path_expire(struct net_device *dev)
 
        read_lock(&pathtbl_resize_lock);
        for_each_mesh_entry(mesh_paths, p, node, i) {
-               if (node->mpath->dev != dev)
+               if (node->mpath->sdata != sdata)
                        continue;
                mpath = node->mpath;
                spin_lock_bh(&mpath->state_lock);
@@ -507,7 +501,7 @@ void mesh_path_expire(struct net_device *dev)
                        time_after(jiffies,
                         mpath->exp_time + MESH_PATH_EXPIRE)) {
                        spin_unlock_bh(&mpath->state_lock);
-                       mesh_path_del(mpath->dst, mpath->dev);
+                       mesh_path_del(mpath->dst, mpath->sdata);
                } else
                        spin_unlock_bh(&mpath->state_lock);
        }
index 9efeb1f07025f32270a8eff239fb1f043c115656..7714b0e6e4d767dc7c3b0d7d805fcbe10404559c 100644 (file)
@@ -144,10 +144,10 @@ void mesh_plink_deactivate(struct sta_info *sta)
        spin_unlock_bh(&sta->lock);
 }
 
-static int mesh_plink_frame_tx(struct net_device *dev,
+static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
                enum plink_frame_type action, u8 *da, __le16 llid, __le16 plid,
                __le16 reason) {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400);
        struct ieee80211_mgmt *mgmt;
        bool include_plid = false;
@@ -163,10 +163,10 @@ static int mesh_plink_frame_tx(struct net_device *dev,
        mgmt = (struct ieee80211_mgmt *)
                skb_put(skb, 25 + sizeof(mgmt->u.action.u.plink_action));
        memset(mgmt, 0, 25 + sizeof(mgmt->u.action.u.plink_action));
-       mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                          IEEE80211_STYPE_ACTION);
+       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                         IEEE80211_STYPE_ACTION);
        memcpy(mgmt->da, da, ETH_ALEN);
-       memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+       memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
        /* BSSID is left zeroed, wildcard value */
        mgmt->u.action.category = PLINK_CATEGORY;
        mgmt->u.action.u.plink_action.action_code = action;
@@ -180,7 +180,7 @@ static int mesh_plink_frame_tx(struct net_device *dev,
                        /* two-byte status code followed by two-byte AID */
                        memset(pos, 0, 4);
                }
-               mesh_mgmt_ies_add(skb, dev);
+               mesh_mgmt_ies_add(skb, sdata);
        }
 
        /* Add Peer Link Management element */
@@ -217,15 +217,14 @@ static int mesh_plink_frame_tx(struct net_device *dev,
                memcpy(pos, &reason, 2);
        }
 
-       ieee80211_sta_tx(dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
        return 0;
 }
 
-void mesh_neighbour_update(u8 *hw_addr, u64 rates, struct net_device *dev,
+void mesh_neighbour_update(u8 *hw_addr, u64 rates, struct ieee80211_sub_if_data *sdata,
                           bool peer_accepting_plinks)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sta_info *sta;
 
        rcu_read_lock();
@@ -257,7 +256,6 @@ static void mesh_plink_timer(unsigned long data)
 {
        struct sta_info *sta;
        __le16 llid, plid, reason;
-       struct net_device *dev = NULL;
        struct ieee80211_sub_if_data *sdata;
 #ifdef CONFIG_MAC80211_VERBOSE_MPL_DEBUG
        DECLARE_MAC_BUF(mac);
@@ -282,7 +280,6 @@ static void mesh_plink_timer(unsigned long data)
        llid = sta->llid;
        plid = sta->plid;
        sdata = sta->sdata;
-       dev = sdata->dev;
 
        switch (sta->plink_state) {
        case PLINK_OPN_RCVD:
@@ -299,7 +296,7 @@ static void mesh_plink_timer(unsigned long data)
                        ++sta->plink_retries;
                        mod_plink_timer(sta, sta->plink_timeout);
                        spin_unlock_bh(&sta->lock);
-                       mesh_plink_frame_tx(dev, PLINK_OPEN, sta->addr, llid,
+                       mesh_plink_frame_tx(sdata, PLINK_OPEN, sta->addr, llid,
                                            0, 0);
                        break;
                }
@@ -312,7 +309,7 @@ static void mesh_plink_timer(unsigned long data)
                sta->plink_state = PLINK_HOLDING;
                mod_plink_timer(sta, dot11MeshHoldingTimeout(sdata));
                spin_unlock_bh(&sta->lock);
-               mesh_plink_frame_tx(dev, PLINK_CLOSE, sta->addr, llid, plid,
+               mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->addr, llid, plid,
                                    reason);
                break;
        case PLINK_HOLDING:
@@ -357,7 +354,7 @@ int mesh_plink_open(struct sta_info *sta)
        mpl_dbg("Mesh plink: starting establishment with %s\n",
                print_mac(mac, sta->addr));
 
-       return mesh_plink_frame_tx(sdata->dev, PLINK_OPEN,
+       return mesh_plink_frame_tx(sdata, PLINK_OPEN,
                                   sta->addr, llid, 0, 0);
 }
 
@@ -403,15 +400,14 @@ int mesh_plink_close(struct sta_info *sta)
        llid = sta->llid;
        plid = sta->plid;
        spin_unlock_bh(&sta->lock);
-       mesh_plink_frame_tx(sta->sdata->dev, PLINK_CLOSE, sta->addr, llid,
+       mesh_plink_frame_tx(sta->sdata, PLINK_CLOSE, sta->addr, llid,
                            plid, reason);
        return 0;
 }
 
-void mesh_rx_plink_frame(struct net_device *dev, struct ieee80211_mgmt *mgmt,
+void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_mgmt *mgmt,
                         size_t len, struct ieee80211_rx_status *rx_status)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_local *local = sdata->local;
        struct ieee802_11_elems elems;
        struct sta_info *sta;
@@ -478,7 +474,7 @@ void mesh_rx_plink_frame(struct net_device *dev, struct ieee80211_mgmt *mgmt,
 
        /* Now we will figure out the appropriate event... */
        event = PLINK_UNDEFINED;
-       if (ftype != PLINK_CLOSE && (!mesh_matches_local(&elems, dev))) {
+       if (ftype != PLINK_CLOSE && (!mesh_matches_local(&elems, sdata))) {
                switch (ftype) {
                case PLINK_OPEN:
                        event = OPN_RJCT;
@@ -577,9 +573,9 @@ void mesh_rx_plink_frame(struct net_device *dev, struct ieee80211_mgmt *mgmt,
                        sta->llid = llid;
                        mesh_plink_timer_set(sta, dot11MeshRetryTimeout(sdata));
                        spin_unlock_bh(&sta->lock);
-                       mesh_plink_frame_tx(dev, PLINK_OPEN, sta->addr, llid,
+                       mesh_plink_frame_tx(sdata, PLINK_OPEN, sta->addr, llid,
                                            0, 0);
-                       mesh_plink_frame_tx(dev, PLINK_CONFIRM, sta->addr,
+                       mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->addr,
                                            llid, plid, 0);
                        break;
                default:
@@ -604,7 +600,7 @@ void mesh_rx_plink_frame(struct net_device *dev, struct ieee80211_mgmt *mgmt,
 
                        llid = sta->llid;
                        spin_unlock_bh(&sta->lock);
-                       mesh_plink_frame_tx(dev, PLINK_CLOSE, sta->addr, llid,
+                       mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->addr, llid,
                                            plid, reason);
                        break;
                case OPN_ACPT:
@@ -613,7 +609,7 @@ void mesh_rx_plink_frame(struct net_device *dev, struct ieee80211_mgmt *mgmt,
                        sta->plid = plid;
                        llid = sta->llid;
                        spin_unlock_bh(&sta->lock);
-                       mesh_plink_frame_tx(dev, PLINK_CONFIRM, sta->addr, llid,
+                       mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->addr, llid,
                                            plid, 0);
                        break;
                case CNF_ACPT:
@@ -646,13 +642,13 @@ void mesh_rx_plink_frame(struct net_device *dev, struct ieee80211_mgmt *mgmt,
 
                        llid = sta->llid;
                        spin_unlock_bh(&sta->lock);
-                       mesh_plink_frame_tx(dev, PLINK_CLOSE, sta->addr, llid,
+                       mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->addr, llid,
                                            plid, reason);
                        break;
                case OPN_ACPT:
                        llid = sta->llid;
                        spin_unlock_bh(&sta->lock);
-                       mesh_plink_frame_tx(dev, PLINK_CONFIRM, sta->addr, llid,
+                       mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->addr, llid,
                                            plid, 0);
                        break;
                case CNF_ACPT:
@@ -685,7 +681,7 @@ void mesh_rx_plink_frame(struct net_device *dev, struct ieee80211_mgmt *mgmt,
 
                        llid = sta->llid;
                        spin_unlock_bh(&sta->lock);
-                       mesh_plink_frame_tx(dev, PLINK_CLOSE, sta->addr, llid,
+                       mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->addr, llid,
                                            plid, reason);
                        break;
                case OPN_ACPT:
@@ -695,7 +691,7 @@ void mesh_rx_plink_frame(struct net_device *dev, struct ieee80211_mgmt *mgmt,
                        spin_unlock_bh(&sta->lock);
                        mpl_dbg("Mesh plink with %s ESTABLISHED\n",
                                        print_mac(mac, sta->addr));
-                       mesh_plink_frame_tx(dev, PLINK_CONFIRM, sta->addr, llid,
+                       mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->addr, llid,
                                            plid, 0);
                        break;
                default:
@@ -714,13 +710,13 @@ void mesh_rx_plink_frame(struct net_device *dev, struct ieee80211_mgmt *mgmt,
                        llid = sta->llid;
                        mod_plink_timer(sta, dot11MeshHoldingTimeout(sdata));
                        spin_unlock_bh(&sta->lock);
-                       mesh_plink_frame_tx(dev, PLINK_CLOSE, sta->addr, llid,
+                       mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->addr, llid,
                                            plid, reason);
                        break;
                case OPN_ACPT:
                        llid = sta->llid;
                        spin_unlock_bh(&sta->lock);
-                       mesh_plink_frame_tx(dev, PLINK_CONFIRM, sta->addr, llid,
+                       mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->addr, llid,
                                            plid, 0);
                        break;
                default:
@@ -743,7 +739,7 @@ void mesh_rx_plink_frame(struct net_device *dev, struct ieee80211_mgmt *mgmt,
                        llid = sta->llid;
                        reason = sta->reason;
                        spin_unlock_bh(&sta->lock);
-                       mesh_plink_frame_tx(dev, PLINK_CLOSE, sta->addr, llid,
+                       mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->addr, llid,
                                            plid, reason);
                        break;
                default:
index 1e97fb9fb34bde3f88988e42cd546b43d95a5b6e..84999791a332207ec127900568044d217e89bdc7 100644 (file)
@@ -34,6 +34,7 @@
 #include "led.h"
 #include "mesh.h"
 
+#define IEEE80211_ASSOC_SCANS_MAX_TRIES 2
 #define IEEE80211_AUTH_TIMEOUT (HZ / 5)
 #define IEEE80211_AUTH_MAX_TRIES 3
 #define IEEE80211_ASSOC_TIMEOUT (HZ / 5)
 #define IEEE80211_MIN_AMPDU_BUF 0x8
 #define IEEE80211_MAX_AMPDU_BUF 0x40
 
-static void ieee80211_send_probe_req(struct net_device *dev, u8 *dst,
+static void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
                                     u8 *ssid, size_t ssid_len);
 static struct ieee80211_sta_bss *
-ieee80211_rx_bss_get(struct net_device *dev, u8 *bssid, int freq,
+ieee80211_rx_bss_get(struct ieee80211_local *local, u8 *bssid, int freq,
                     u8 *ssid, u8 ssid_len);
 static void ieee80211_rx_bss_put(struct ieee80211_local *local,
                                 struct ieee80211_sta_bss *bss);
-static int ieee80211_sta_find_ibss(struct net_device *dev,
+static int ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata,
                                   struct ieee80211_if_sta *ifsta);
-static int ieee80211_sta_wep_configured(struct net_device *dev);
-static int ieee80211_sta_start_scan(struct net_device *dev,
+static int ieee80211_sta_wep_configured(struct ieee80211_sub_if_data *sdata);
+static int ieee80211_sta_start_scan(struct ieee80211_sub_if_data *sdata,
                                    u8 *ssid, size_t ssid_len);
-static int ieee80211_sta_config_auth(struct net_device *dev,
+static int ieee80211_sta_config_auth(struct ieee80211_sub_if_data *sdata,
                                     struct ieee80211_if_sta *ifsta);
 static void sta_rx_agg_session_timer_expired(unsigned long data);
 
@@ -239,11 +240,10 @@ static int ecw2cw(int ecw)
 }
 
 
-static void ieee80211_sta_def_wmm_params(struct net_device *dev,
+static void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata,
                                         struct ieee80211_sta_bss *bss,
                                         int ibss)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_local *local = sdata->local;
        int i, have_higher_than_11mbit = 0;
 
@@ -281,11 +281,10 @@ static void ieee80211_sta_def_wmm_params(struct net_device *dev,
        }
 }
 
-static void ieee80211_sta_wmm_params(struct net_device *dev,
+static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
                                     struct ieee80211_if_sta *ifsta,
                                     u8 *wmm_param, size_t wmm_param_len)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
        struct ieee80211_tx_queue_params params;
        size_t left;
        int count;
@@ -349,14 +348,14 @@ static void ieee80211_sta_wmm_params(struct net_device *dev,
 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
                printk(KERN_DEBUG "%s: WMM queue=%d aci=%d acm=%d aifs=%d "
                       "cWmin=%d cWmax=%d txop=%d\n",
-                      dev->name, queue, aci, acm, params.aifs, params.cw_min,
+                      local->mdev->name, queue, aci, acm, params.aifs, params.cw_min,
                       params.cw_max, params.txop);
 #endif
                /* TODO: handle ACM (block TX, fallback to next lowest allowed
                 * AC for now) */
                if (local->ops->conf_tx(local_to_hw(local), queue, &params)) {
                        printk(KERN_DEBUG "%s: failed to set TX queue "
-                              "parameters for queue %d\n", dev->name, queue);
+                              "parameters for queue %d\n", local->mdev->name, queue);
                }
        }
 }
@@ -475,7 +474,7 @@ int ieee80211_ht_addt_info_ie_to_ht_bss_info(
        return 0;
 }
 
-static void ieee80211_sta_send_associnfo(struct net_device *dev,
+static void ieee80211_sta_send_associnfo(struct ieee80211_sub_if_data *sdata,
                                         struct ieee80211_if_sta *ifsta)
 {
        char *buf;
@@ -520,17 +519,16 @@ static void ieee80211_sta_send_associnfo(struct net_device *dev,
 
        memset(&wrqu, 0, sizeof(wrqu));
        wrqu.data.length = len;
-       wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
+       wireless_send_event(sdata->dev, IWEVCUSTOM, &wrqu, buf);
 
        kfree(buf);
 }
 
 
-static void ieee80211_set_associated(struct net_device *dev,
+static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
                                     struct ieee80211_if_sta *ifsta,
                                     bool assoc)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_conf *conf = &local_to_hw(local)->conf;
        union iwreq_data wrqu;
@@ -544,7 +542,7 @@ static void ieee80211_set_associated(struct net_device *dev,
                if (sdata->vif.type != IEEE80211_IF_TYPE_STA)
                        return;
 
-               bss = ieee80211_rx_bss_get(dev, ifsta->bssid,
+               bss = ieee80211_rx_bss_get(local, ifsta->bssid,
                                           conf->channel->center_freq,
                                           ifsta->ssid, ifsta->ssid_len);
                if (bss) {
@@ -568,12 +566,12 @@ static void ieee80211_set_associated(struct net_device *dev,
                ifsta->flags |= IEEE80211_STA_PREV_BSSID_SET;
                memcpy(ifsta->prev_bssid, sdata->u.sta.bssid, ETH_ALEN);
                memcpy(wrqu.ap_addr.sa_data, sdata->u.sta.bssid, ETH_ALEN);
-               ieee80211_sta_send_associnfo(dev, ifsta);
+               ieee80211_sta_send_associnfo(sdata, ifsta);
        } else {
-               netif_carrier_off(dev);
-               ieee80211_sta_tear_down_BA_sessions(dev, ifsta->bssid);
+               netif_carrier_off(sdata->dev);
+               ieee80211_sta_tear_down_BA_sessions(sdata, ifsta->bssid);
                ifsta->flags &= ~IEEE80211_STA_ASSOCIATED;
-               changed |= ieee80211_reset_erp_info(dev);
+               changed |= ieee80211_reset_erp_info(sdata);
 
                sdata->bss_conf.assoc_ht = 0;
                sdata->bss_conf.ht_conf = NULL;
@@ -588,27 +586,27 @@ static void ieee80211_set_associated(struct net_device *dev,
        ieee80211_bss_info_change_notify(sdata, changed);
 
        if (assoc)
-               netif_carrier_on(dev);
+               netif_carrier_on(sdata->dev);
 
        wrqu.ap_addr.sa_family = ARPHRD_ETHER;
-       wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
+       wireless_send_event(sdata->dev, SIOCGIWAP, &wrqu, NULL);
 }
 
-static void ieee80211_set_disassoc(struct net_device *dev,
+static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
                                   struct ieee80211_if_sta *ifsta, int deauth)
 {
-       if (deauth)
+       if (deauth) {
+               ifsta->direct_probe_tries = 0;
                ifsta->auth_tries = 0;
+       }
+       ifsta->assoc_scan_tries = 0;
        ifsta->assoc_tries = 0;
-       ieee80211_set_associated(dev, ifsta, 0);
+       ieee80211_set_associated(sdata, ifsta, 0);
 }
 
-void ieee80211_sta_tx(struct net_device *dev, struct sk_buff *skb,
+void ieee80211_sta_tx(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb,
                      int encrypt)
 {
-       struct ieee80211_sub_if_data *sdata;
-
-       sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        skb->dev = sdata->local->mdev;
        skb_set_mac_header(skb, 0);
        skb_set_network_header(skb, 0);
@@ -621,12 +619,12 @@ void ieee80211_sta_tx(struct net_device *dev, struct sk_buff *skb,
 }
 
 
-static void ieee80211_send_auth(struct net_device *dev,
+static void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
                                struct ieee80211_if_sta *ifsta,
                                int transaction, u8 *extra, size_t extra_len,
                                int encrypt)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb;
        struct ieee80211_mgmt *mgmt;
 
@@ -634,19 +632,19 @@ static void ieee80211_send_auth(struct net_device *dev,
                            sizeof(*mgmt) + 6 + extra_len);
        if (!skb) {
                printk(KERN_DEBUG "%s: failed to allocate buffer for auth "
-                      "frame\n", dev->name);
+                      "frame\n", sdata->dev->name);
                return;
        }
        skb_reserve(skb, local->hw.extra_tx_headroom);
 
        mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24 + 6);
        memset(mgmt, 0, 24 + 6);
-       mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                          IEEE80211_STYPE_AUTH);
+       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                         IEEE80211_STYPE_AUTH);
        if (encrypt)
                mgmt->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
        memcpy(mgmt->da, ifsta->bssid, ETH_ALEN);
-       memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+       memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
        memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
        mgmt->u.auth.auth_alg = cpu_to_le16(ifsta->auth_alg);
        mgmt->u.auth.auth_transaction = cpu_to_le16(transaction);
@@ -655,11 +653,41 @@ static void ieee80211_send_auth(struct net_device *dev,
        if (extra)
                memcpy(skb_put(skb, extra_len), extra, extra_len);
 
-       ieee80211_sta_tx(dev, skb, encrypt);
+       ieee80211_sta_tx(sdata, skb, encrypt);
+}
+
+static void ieee80211_direct_probe(struct ieee80211_sub_if_data *sdata,
+                                  struct ieee80211_if_sta *ifsta)
+{
+       DECLARE_MAC_BUF(mac);
+
+       ifsta->direct_probe_tries++;
+       if (ifsta->direct_probe_tries > IEEE80211_AUTH_MAX_TRIES) {
+               printk(KERN_DEBUG "%s: direct probe to AP %s timed out\n",
+                      sdata->dev->name, print_mac(mac, ifsta->bssid));
+               ifsta->state = IEEE80211_STA_MLME_DISABLED;
+               return;
+       }
+
+       printk(KERN_DEBUG "%s: direct probe to AP %s try %d\n",
+                       sdata->dev->name, print_mac(mac, ifsta->bssid),
+                       ifsta->direct_probe_tries);
+
+       ifsta->state = IEEE80211_STA_MLME_DIRECT_PROBE;
+
+       set_bit(IEEE80211_STA_REQ_DIRECT_PROBE, &ifsta->request);
+
+       /* Direct probe is sent to broadcast address as some APs
+        * will not answer to direct packet in unassociated state.
+        */
+       ieee80211_send_probe_req(sdata, NULL,
+                                ifsta->ssid, ifsta->ssid_len);
+
+       mod_timer(&ifsta->timer, jiffies + IEEE80211_AUTH_TIMEOUT);
 }
 
 
-static void ieee80211_authenticate(struct net_device *dev,
+static void ieee80211_authenticate(struct ieee80211_sub_if_data *sdata,
                                   struct ieee80211_if_sta *ifsta)
 {
        DECLARE_MAC_BUF(mac);
@@ -668,16 +696,16 @@ static void ieee80211_authenticate(struct net_device *dev,
        if (ifsta->auth_tries > IEEE80211_AUTH_MAX_TRIES) {
                printk(KERN_DEBUG "%s: authentication with AP %s"
                       " timed out\n",
-                      dev->name, print_mac(mac, ifsta->bssid));
-               ifsta->state = IEEE80211_DISABLED;
+                      sdata->dev->name, print_mac(mac, ifsta->bssid));
+               ifsta->state = IEEE80211_STA_MLME_DISABLED;
                return;
        }
 
-       ifsta->state = IEEE80211_AUTHENTICATE;
+       ifsta->state = IEEE80211_STA_MLME_AUTHENTICATE;
        printk(KERN_DEBUG "%s: authenticate with AP %s\n",
-              dev->name, print_mac(mac, ifsta->bssid));
+              sdata->dev->name, print_mac(mac, ifsta->bssid));
 
-       ieee80211_send_auth(dev, ifsta, 1, NULL, 0, 0);
+       ieee80211_send_auth(sdata, ifsta, 1, NULL, 0, 0);
 
        mod_timer(&ifsta->timer, jiffies + IEEE80211_AUTH_TIMEOUT);
 }
@@ -703,10 +731,10 @@ static int ieee80211_compatible_rates(struct ieee80211_sta_bss *bss,
        return count;
 }
 
-static void ieee80211_send_assoc(struct net_device *dev,
+static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata,
                                 struct ieee80211_if_sta *ifsta)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb;
        struct ieee80211_mgmt *mgmt;
        u8 *pos, *ies;
@@ -722,7 +750,7 @@ static void ieee80211_send_assoc(struct net_device *dev,
                            ifsta->ssid_len);
        if (!skb) {
                printk(KERN_DEBUG "%s: failed to allocate buffer for assoc "
-                      "frame\n", dev->name);
+                      "frame\n", sdata->dev->name);
                return;
        }
        skb_reserve(skb, local->hw.extra_tx_headroom);
@@ -738,7 +766,7 @@ static void ieee80211_send_assoc(struct net_device *dev,
                        capab |= WLAN_CAPABILITY_SHORT_PREAMBLE;
        }
 
-       bss = ieee80211_rx_bss_get(dev, ifsta->bssid,
+       bss = ieee80211_rx_bss_get(local, ifsta->bssid,
                                   local->hw.conf.channel->center_freq,
                                   ifsta->ssid, ifsta->ssid_len);
        if (bss) {
@@ -766,13 +794,13 @@ static void ieee80211_send_assoc(struct net_device *dev,
        mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
        memset(mgmt, 0, 24);
        memcpy(mgmt->da, ifsta->bssid, ETH_ALEN);
-       memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+       memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
        memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
 
        if (ifsta->flags & IEEE80211_STA_PREV_BSSID_SET) {
                skb_put(skb, 10);
-               mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                                  IEEE80211_STYPE_REASSOC_REQ);
+               mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                                 IEEE80211_STYPE_REASSOC_REQ);
                mgmt->u.reassoc_req.capab_info = cpu_to_le16(capab);
                mgmt->u.reassoc_req.listen_interval =
                                cpu_to_le16(local->hw.conf.listen_interval);
@@ -780,8 +808,8 @@ static void ieee80211_send_assoc(struct net_device *dev,
                       ETH_ALEN);
        } else {
                skb_put(skb, 4);
-               mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                                  IEEE80211_STYPE_ASSOC_REQ);
+               mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                                 IEEE80211_STYPE_ASSOC_REQ);
                mgmt->u.assoc_req.capab_info = cpu_to_le16(capab);
                mgmt->u.reassoc_req.listen_interval =
                                cpu_to_le16(local->hw.conf.listen_interval);
@@ -907,21 +935,21 @@ static void ieee80211_send_assoc(struct net_device *dev,
        if (ifsta->assocreq_ies)
                memcpy(ifsta->assocreq_ies, ies, ifsta->assocreq_ies_len);
 
-       ieee80211_sta_tx(dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
 }
 
 
-static void ieee80211_send_deauth(struct net_device *dev,
+static void ieee80211_send_deauth(struct ieee80211_sub_if_data *sdata,
                                  struct ieee80211_if_sta *ifsta, u16 reason)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb;
        struct ieee80211_mgmt *mgmt;
 
        skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*mgmt));
        if (!skb) {
                printk(KERN_DEBUG "%s: failed to allocate buffer for deauth "
-                      "frame\n", dev->name);
+                      "frame\n", sdata->dev->name);
                return;
        }
        skb_reserve(skb, local->hw.extra_tx_headroom);
@@ -929,28 +957,28 @@ static void ieee80211_send_deauth(struct net_device *dev,
        mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
        memset(mgmt, 0, 24);
        memcpy(mgmt->da, ifsta->bssid, ETH_ALEN);
-       memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+       memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
        memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
-       mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                          IEEE80211_STYPE_DEAUTH);
+       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                         IEEE80211_STYPE_DEAUTH);
        skb_put(skb, 2);
        mgmt->u.deauth.reason_code = cpu_to_le16(reason);
 
-       ieee80211_sta_tx(dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
 }
 
 
-static void ieee80211_send_disassoc(struct net_device *dev,
+static void ieee80211_send_disassoc(struct ieee80211_sub_if_data *sdata,
                                    struct ieee80211_if_sta *ifsta, u16 reason)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb;
        struct ieee80211_mgmt *mgmt;
 
        skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*mgmt));
        if (!skb) {
                printk(KERN_DEBUG "%s: failed to allocate buffer for disassoc "
-                      "frame\n", dev->name);
+                      "frame\n", sdata->dev->name);
                return;
        }
        skb_reserve(skb, local->hw.extra_tx_headroom);
@@ -958,21 +986,21 @@ static void ieee80211_send_disassoc(struct net_device *dev,
        mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
        memset(mgmt, 0, 24);
        memcpy(mgmt->da, ifsta->bssid, ETH_ALEN);
-       memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+       memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
        memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
-       mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                          IEEE80211_STYPE_DISASSOC);
+       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                         IEEE80211_STYPE_DISASSOC);
        skb_put(skb, 2);
        mgmt->u.disassoc.reason_code = cpu_to_le16(reason);
 
-       ieee80211_sta_tx(dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
 }
 
 
-static int ieee80211_privacy_mismatch(struct net_device *dev,
+static int ieee80211_privacy_mismatch(struct ieee80211_sub_if_data *sdata,
                                      struct ieee80211_if_sta *ifsta)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_sta_bss *bss;
        int bss_privacy;
        int wep_privacy;
@@ -981,14 +1009,14 @@ static int ieee80211_privacy_mismatch(struct net_device *dev,
        if (!ifsta || (ifsta->flags & IEEE80211_STA_MIXED_CELL))
                return 0;
 
-       bss = ieee80211_rx_bss_get(dev, ifsta->bssid,
+       bss = ieee80211_rx_bss_get(local, ifsta->bssid,
                                   local->hw.conf.channel->center_freq,
                                   ifsta->ssid, ifsta->ssid_len);
        if (!bss)
                return 0;
 
        bss_privacy = !!(bss->capability & WLAN_CAPABILITY_PRIVACY);
-       wep_privacy = !!ieee80211_sta_wep_configured(dev);
+       wep_privacy = !!ieee80211_sta_wep_configured(sdata);
        privacy_invoked = !!(ifsta->flags & IEEE80211_STA_PRIVACY_INVOKED);
 
        ieee80211_rx_bss_put(local, bss);
@@ -1000,7 +1028,7 @@ static int ieee80211_privacy_mismatch(struct net_device *dev,
 }
 
 
-static void ieee80211_associate(struct net_device *dev,
+static void ieee80211_associate(struct ieee80211_sub_if_data *sdata,
                                struct ieee80211_if_sta *ifsta)
 {
        DECLARE_MAC_BUF(mac);
@@ -1009,31 +1037,31 @@ static void ieee80211_associate(struct net_device *dev,
        if (ifsta->assoc_tries > IEEE80211_ASSOC_MAX_TRIES) {
                printk(KERN_DEBUG "%s: association with AP %s"
                       " timed out\n",
-                      dev->name, print_mac(mac, ifsta->bssid));
-               ifsta->state = IEEE80211_DISABLED;
+                      sdata->dev->name, print_mac(mac, ifsta->bssid));
+               ifsta->state = IEEE80211_STA_MLME_DISABLED;
                return;
        }
 
-       ifsta->state = IEEE80211_ASSOCIATE;
+       ifsta->state = IEEE80211_STA_MLME_ASSOCIATE;
        printk(KERN_DEBUG "%s: associate with AP %s\n",
-              dev->name, print_mac(mac, ifsta->bssid));
-       if (ieee80211_privacy_mismatch(dev, ifsta)) {
+              sdata->dev->name, print_mac(mac, ifsta->bssid));
+       if (ieee80211_privacy_mismatch(sdata, ifsta)) {
                printk(KERN_DEBUG "%s: mismatch in privacy configuration and "
-                      "mixed-cell disabled - abort association\n", dev->name);
-               ifsta->state = IEEE80211_DISABLED;
+                      "mixed-cell disabled - abort association\n", sdata->dev->name);
+               ifsta->state = IEEE80211_STA_MLME_DISABLED;
                return;
        }
 
-       ieee80211_send_assoc(dev, ifsta);
+       ieee80211_send_assoc(sdata, ifsta);
 
        mod_timer(&ifsta->timer, jiffies + IEEE80211_ASSOC_TIMEOUT);
 }
 
 
-static void ieee80211_associated(struct net_device *dev,
+static void ieee80211_associated(struct ieee80211_sub_if_data *sdata,
                                 struct ieee80211_if_sta *ifsta)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sta_info *sta;
        int disassoc;
        DECLARE_MAC_BUF(mac);
@@ -1043,14 +1071,14 @@ static void ieee80211_associated(struct net_device *dev,
         * for better APs. */
        /* TODO: remove expired BSSes */
 
-       ifsta->state = IEEE80211_ASSOCIATED;
+       ifsta->state = IEEE80211_STA_MLME_ASSOCIATED;
 
        rcu_read_lock();
 
        sta = sta_info_get(local, ifsta->bssid);
        if (!sta) {
                printk(KERN_DEBUG "%s: No STA entry for own AP %s\n",
-                      dev->name, print_mac(mac, ifsta->bssid));
+                      sdata->dev->name, print_mac(mac, ifsta->bssid));
                disassoc = 1;
        } else {
                disassoc = 0;
@@ -1060,11 +1088,11 @@ static void ieee80211_associated(struct net_device *dev,
                                printk(KERN_DEBUG "%s: No ProbeResp from "
                                       "current AP %s - assume out of "
                                       "range\n",
-                                      dev->name, print_mac(mac, ifsta->bssid));
+                                      sdata->dev->name, print_mac(mac, ifsta->bssid));
                                disassoc = 1;
                                sta_info_unlink(&sta);
                        } else
-                               ieee80211_send_probe_req(dev, ifsta->bssid,
+                               ieee80211_send_probe_req(sdata, ifsta->bssid,
                                                         local->scan_ssid,
                                                         local->scan_ssid_len);
                        ifsta->flags ^= IEEE80211_STA_PROBEREQ_POLL;
@@ -1073,7 +1101,7 @@ static void ieee80211_associated(struct net_device *dev,
                        if (time_after(jiffies, ifsta->last_probe +
                                       IEEE80211_PROBE_INTERVAL)) {
                                ifsta->last_probe = jiffies;
-                               ieee80211_send_probe_req(dev, ifsta->bssid,
+                               ieee80211_send_probe_req(sdata, ifsta->bssid,
                                                         ifsta->ssid,
                                                         ifsta->ssid_len);
                        }
@@ -1086,8 +1114,8 @@ static void ieee80211_associated(struct net_device *dev,
                sta_info_destroy(sta);
 
        if (disassoc) {
-               ifsta->state = IEEE80211_DISABLED;
-               ieee80211_set_associated(dev, ifsta, 0);
+               ifsta->state = IEEE80211_STA_MLME_DISABLED;
+               ieee80211_set_associated(sdata, ifsta, 0);
        } else {
                mod_timer(&ifsta->timer, jiffies +
                                      IEEE80211_MONITORING_INTERVAL);
@@ -1095,10 +1123,10 @@ static void ieee80211_associated(struct net_device *dev,
 }
 
 
-static void ieee80211_send_probe_req(struct net_device *dev, u8 *dst,
+static void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
                                     u8 *ssid, size_t ssid_len)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_supported_band *sband;
        struct sk_buff *skb;
        struct ieee80211_mgmt *mgmt;
@@ -1108,16 +1136,16 @@ static void ieee80211_send_probe_req(struct net_device *dev, u8 *dst,
        skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*mgmt) + 200);
        if (!skb) {
                printk(KERN_DEBUG "%s: failed to allocate buffer for probe "
-                      "request\n", dev->name);
+                      "request\n", sdata->dev->name);
                return;
        }
        skb_reserve(skb, local->hw.extra_tx_headroom);
 
        mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
        memset(mgmt, 0, 24);
-       mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                          IEEE80211_STYPE_PROBE_REQ);
-       memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                         IEEE80211_STYPE_PROBE_REQ);
+       memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
        if (dst) {
                memcpy(mgmt->da, dst, ETH_ALEN);
                memcpy(mgmt->bssid, dst, ETH_ALEN);
@@ -1152,13 +1180,12 @@ static void ieee80211_send_probe_req(struct net_device *dev, u8 *dst,
                *pos = rate->bitrate / 5;
        }
 
-       ieee80211_sta_tx(dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
 }
 
 
-static int ieee80211_sta_wep_configured(struct net_device *dev)
+static int ieee80211_sta_wep_configured(struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        if (!sdata || !sdata->default_key ||
            sdata->default_key->conf.alg != ALG_WEP)
                return 0;
@@ -1166,16 +1193,16 @@ static int ieee80211_sta_wep_configured(struct net_device *dev)
 }
 
 
-static void ieee80211_auth_completed(struct net_device *dev,
+static void ieee80211_auth_completed(struct ieee80211_sub_if_data *sdata,
                                     struct ieee80211_if_sta *ifsta)
 {
-       printk(KERN_DEBUG "%s: authenticated\n", dev->name);
+       printk(KERN_DEBUG "%s: authenticated\n", sdata->dev->name);
        ifsta->flags |= IEEE80211_STA_AUTHENTICATED;
-       ieee80211_associate(dev, ifsta);
+       ieee80211_associate(sdata, ifsta);
 }
 
 
-static void ieee80211_auth_challenge(struct net_device *dev,
+static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata,
                                     struct ieee80211_if_sta *ifsta,
                                     struct ieee80211_mgmt *mgmt,
                                     size_t len)
@@ -1187,17 +1214,16 @@ static void ieee80211_auth_challenge(struct net_device *dev,
        ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
        if (!elems.challenge)
                return;
-       ieee80211_send_auth(dev, ifsta, 3, elems.challenge - 2,
+       ieee80211_send_auth(sdata, ifsta, 3, elems.challenge - 2,
                            elems.challenge_len + 2, 1);
 }
 
-static void ieee80211_send_addba_resp(struct net_device *dev, u8 *da, u16 tid,
+static void ieee80211_send_addba_resp(struct ieee80211_sub_if_data *sdata, u8 *da, u16 tid,
                                        u8 dialog_token, u16 status, u16 policy,
                                        u16 buf_size, u16 timeout)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_if_sta *ifsta = &sdata->u.sta;
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb;
        struct ieee80211_mgmt *mgmt;
        u16 capab;
@@ -1206,7 +1232,7 @@ static void ieee80211_send_addba_resp(struct net_device *dev, u8 *da, u16 tid,
 
        if (!skb) {
                printk(KERN_DEBUG "%s: failed to allocate buffer "
-                      "for addba resp frame\n", dev->name);
+                      "for addba resp frame\n", sdata->dev->name);
                return;
        }
 
@@ -1214,13 +1240,13 @@ static void ieee80211_send_addba_resp(struct net_device *dev, u8 *da, u16 tid,
        mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
        memset(mgmt, 0, 24);
        memcpy(mgmt->da, da, ETH_ALEN);
-       memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+       memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
        if (sdata->vif.type == IEEE80211_IF_TYPE_AP)
-               memcpy(mgmt->bssid, dev->dev_addr, ETH_ALEN);
+               memcpy(mgmt->bssid, sdata->dev->dev_addr, ETH_ALEN);
        else
                memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
-       mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                          IEEE80211_STYPE_ACTION);
+       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                         IEEE80211_STYPE_ACTION);
 
        skb_put(skb, 1 + sizeof(mgmt->u.action.u.addba_resp));
        mgmt->u.action.category = WLAN_CATEGORY_BACK;
@@ -1235,17 +1261,16 @@ static void ieee80211_send_addba_resp(struct net_device *dev, u8 *da, u16 tid,
        mgmt->u.action.u.addba_resp.timeout = cpu_to_le16(timeout);
        mgmt->u.action.u.addba_resp.status = cpu_to_le16(status);
 
-       ieee80211_sta_tx(dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
 
        return;
 }
 
-void ieee80211_send_addba_request(struct net_device *dev, const u8 *da,
+void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata, const u8 *da,
                                u16 tid, u8 dialog_token, u16 start_seq_num,
                                u16 agg_size, u16 timeout)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_if_sta *ifsta = &sdata->u.sta;
        struct sk_buff *skb;
        struct ieee80211_mgmt *mgmt;
@@ -1255,21 +1280,21 @@ void ieee80211_send_addba_request(struct net_device *dev, const u8 *da,
 
        if (!skb) {
                printk(KERN_ERR "%s: failed to allocate buffer "
-                               "for addba request frame\n", dev->name);
+                               "for addba request frame\n", sdata->dev->name);
                return;
        }
        skb_reserve(skb, local->hw.extra_tx_headroom);
        mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
        memset(mgmt, 0, 24);
        memcpy(mgmt->da, da, ETH_ALEN);
-       memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+       memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
        if (sdata->vif.type == IEEE80211_IF_TYPE_AP)
-               memcpy(mgmt->bssid, dev->dev_addr, ETH_ALEN);
+               memcpy(mgmt->bssid, sdata->dev->dev_addr, ETH_ALEN);
        else
                memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
 
-       mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                       IEEE80211_STYPE_ACTION);
+       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                         IEEE80211_STYPE_ACTION);
 
        skb_put(skb, 1 + sizeof(mgmt->u.action.u.addba_req));
 
@@ -1287,14 +1312,13 @@ void ieee80211_send_addba_request(struct net_device *dev, const u8 *da,
        mgmt->u.action.u.addba_req.start_seq_num =
                                        cpu_to_le16(start_seq_num << 4);
 
-       ieee80211_sta_tx(dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
 }
 
-static void ieee80211_sta_process_addba_request(struct net_device *dev,
+static void ieee80211_sta_process_addba_request(struct ieee80211_local *local,
                                                struct ieee80211_mgmt *mgmt,
                                                size_t len)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
        struct ieee80211_hw *hw = &local->hw;
        struct ieee80211_conf *conf = &hw->conf;
        struct sta_info *sta;
@@ -1426,16 +1450,15 @@ end:
        spin_unlock_bh(&sta->lock);
 
 end_no_lock:
-       ieee80211_send_addba_resp(sta->sdata->dev, sta->addr, tid,
+       ieee80211_send_addba_resp(sta->sdata, sta->addr, tid,
                                  dialog_token, status, 1, buf_size, timeout);
        rcu_read_unlock();
 }
 
-static void ieee80211_sta_process_addba_resp(struct net_device *dev,
+static void ieee80211_sta_process_addba_resp(struct ieee80211_local *local,
                                             struct ieee80211_mgmt *mgmt,
                                             size_t len)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
        struct ieee80211_hw *hw = &local->hw;
        struct sta_info *sta;
        u16 capab;
@@ -1497,11 +1520,10 @@ addba_resp_exit:
        rcu_read_unlock();
 }
 
-void ieee80211_send_delba(struct net_device *dev, const u8 *da, u16 tid,
+void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata, const u8 *da, u16 tid,
                          u16 initiator, u16 reason_code)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_if_sta *ifsta = &sdata->u.sta;
        struct sk_buff *skb;
        struct ieee80211_mgmt *mgmt;
@@ -1511,7 +1533,7 @@ void ieee80211_send_delba(struct net_device *dev, const u8 *da, u16 tid,
 
        if (!skb) {
                printk(KERN_ERR "%s: failed to allocate buffer "
-                                       "for delba frame\n", dev->name);
+                                       "for delba frame\n", sdata->dev->name);
                return;
        }
 
@@ -1519,13 +1541,13 @@ void ieee80211_send_delba(struct net_device *dev, const u8 *da, u16 tid,
        mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
        memset(mgmt, 0, 24);
        memcpy(mgmt->da, da, ETH_ALEN);
-       memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+       memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
        if (sdata->vif.type == IEEE80211_IF_TYPE_AP)
-               memcpy(mgmt->bssid, dev->dev_addr, ETH_ALEN);
+               memcpy(mgmt->bssid, sdata->dev->dev_addr, ETH_ALEN);
        else
                memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
-       mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                       IEEE80211_STYPE_ACTION);
+       mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                         IEEE80211_STYPE_ACTION);
 
        skb_put(skb, 1 + sizeof(mgmt->u.action.u.delba));
 
@@ -1537,12 +1559,12 @@ void ieee80211_send_delba(struct net_device *dev, const u8 *da, u16 tid,
        mgmt->u.action.u.delba.params = cpu_to_le16(params);
        mgmt->u.action.u.delba.reason_code = cpu_to_le16(reason_code);
 
-       ieee80211_sta_tx(dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
 }
 
-void ieee80211_send_bar(struct net_device *dev, u8 *ra, u16 tid, u16 ssn)
+void ieee80211_send_bar(struct ieee80211_sub_if_data *sdata, u8 *ra, u16 tid, u16 ssn)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb;
        struct ieee80211_bar *bar;
        u16 bar_control = 0;
@@ -1550,29 +1572,29 @@ void ieee80211_send_bar(struct net_device *dev, u8 *ra, u16 tid, u16 ssn)
        skb = dev_alloc_skb(sizeof(*bar) + local->hw.extra_tx_headroom);
        if (!skb) {
                printk(KERN_ERR "%s: failed to allocate buffer for "
-                       "bar frame\n", dev->name);
+                       "bar frame\n", sdata->dev->name);
                return;
        }
        skb_reserve(skb, local->hw.extra_tx_headroom);
        bar = (struct ieee80211_bar *)skb_put(skb, sizeof(*bar));
        memset(bar, 0, sizeof(*bar));
-       bar->frame_control = IEEE80211_FC(IEEE80211_FTYPE_CTL,
-                                       IEEE80211_STYPE_BACK_REQ);
+       bar->frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL |
+                                        IEEE80211_STYPE_BACK_REQ);
        memcpy(bar->ra, ra, ETH_ALEN);
-       memcpy(bar->ta, dev->dev_addr, ETH_ALEN);
+       memcpy(bar->ta, sdata->dev->dev_addr, ETH_ALEN);
        bar_control |= (u16)IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL;
        bar_control |= (u16)IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA;
        bar_control |= (u16)(tid << 12);
        bar->control = cpu_to_le16(bar_control);
        bar->start_seq_num = cpu_to_le16(ssn);
 
-       ieee80211_sta_tx(dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
 }
 
-void ieee80211_sta_stop_rx_ba_session(struct net_device *dev, u8 *ra, u16 tid,
+void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *ra, u16 tid,
                                        u16 initiator, u16 reason)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_hw *hw = &local->hw;
        struct sta_info *sta;
        int ret, i;
@@ -1620,7 +1642,7 @@ void ieee80211_sta_stop_rx_ba_session(struct net_device *dev, u8 *ra, u16 tid,
 
        /* check if this is a self generated aggregation halt */
        if (initiator == WLAN_BACK_RECIPIENT || initiator == WLAN_BACK_TIMER)
-               ieee80211_send_delba(dev, ra, tid, 0, reason);
+               ieee80211_send_delba(sdata, ra, tid, 0, reason);
 
        /* free the reordering buffer */
        for (i = 0; i < sta->ampdu_mlme.tid_rx[tid]->buf_size; i++) {
@@ -1641,10 +1663,10 @@ void ieee80211_sta_stop_rx_ba_session(struct net_device *dev, u8 *ra, u16 tid,
 }
 
 
-static void ieee80211_sta_process_delba(struct net_device *dev,
+static void ieee80211_sta_process_delba(struct ieee80211_sub_if_data *sdata,
                        struct ieee80211_mgmt *mgmt, size_t len)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sta_info *sta;
        u16 tid, params;
        u16 initiator;
@@ -1671,7 +1693,7 @@ static void ieee80211_sta_process_delba(struct net_device *dev,
 #endif /* CONFIG_MAC80211_HT_DEBUG */
 
        if (initiator == WLAN_BACK_INITIATOR)
-               ieee80211_sta_stop_rx_ba_session(dev, sta->addr, tid,
+               ieee80211_sta_stop_rx_ba_session(sdata, sta->addr, tid,
                                                 WLAN_BACK_INITIATOR, 0);
        else { /* WLAN_BACK_RECIPIENT */
                spin_lock_bh(&sta->lock);
@@ -1758,31 +1780,31 @@ static void sta_rx_agg_session_timer_expired(unsigned long data)
 #ifdef CONFIG_MAC80211_HT_DEBUG
        printk(KERN_DEBUG "rx session timer expired on tid %d\n", (u16)*ptid);
 #endif
-       ieee80211_sta_stop_rx_ba_session(sta->sdata->dev, sta->addr,
+       ieee80211_sta_stop_rx_ba_session(sta->sdata, sta->addr,
                                         (u16)*ptid, WLAN_BACK_TIMER,
                                         WLAN_REASON_QSTA_TIMEOUT);
 }
 
-void ieee80211_sta_tear_down_BA_sessions(struct net_device *dev, u8 *addr)
+void ieee80211_sta_tear_down_BA_sessions(struct ieee80211_sub_if_data *sdata, u8 *addr)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        int i;
 
        for (i = 0; i <  STA_TID_NUM; i++) {
                ieee80211_stop_tx_ba_session(&local->hw, addr, i,
                                             WLAN_BACK_INITIATOR);
-               ieee80211_sta_stop_rx_ba_session(dev, addr, i,
+               ieee80211_sta_stop_rx_ba_session(sdata, addr, i,
                                                 WLAN_BACK_RECIPIENT,
                                                 WLAN_REASON_QSTA_LEAVE_QBSS);
        }
 }
 
-static void ieee80211_send_refuse_measurement_request(struct net_device *dev,
+static void ieee80211_send_refuse_measurement_request(struct ieee80211_sub_if_data *sdata,
                                        struct ieee80211_msrment_ie *request_ie,
                                        const u8 *da, const u8 *bssid,
                                        u8 dialog_token)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb;
        struct ieee80211_mgmt *msr_report;
 
@@ -1791,7 +1813,7 @@ static void ieee80211_send_refuse_measurement_request(struct net_device *dev,
 
        if (!skb) {
                printk(KERN_ERR "%s: failed to allocate buffer for "
-                               "measurement report frame\n", dev->name);
+                               "measurement report frame\n", sdata->dev->name);
                return;
        }
 
@@ -1799,9 +1821,9 @@ static void ieee80211_send_refuse_measurement_request(struct net_device *dev,
        msr_report = (struct ieee80211_mgmt *)skb_put(skb, 24);
        memset(msr_report, 0, 24);
        memcpy(msr_report->da, da, ETH_ALEN);
-       memcpy(msr_report->sa, dev->dev_addr, ETH_ALEN);
+       memcpy(msr_report->sa, sdata->dev->dev_addr, ETH_ALEN);
        memcpy(msr_report->bssid, bssid, ETH_ALEN);
-       msr_report->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
+       msr_report->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
                                                IEEE80211_STYPE_ACTION);
 
        skb_put(skb, 1 + sizeof(msr_report->u.action.u.measurement));
@@ -1821,10 +1843,10 @@ static void ieee80211_send_refuse_measurement_request(struct net_device *dev,
                        IEEE80211_SPCT_MSR_RPRT_MODE_REFUSED;
        msr_report->u.action.u.measurement.msr_elem.type = request_ie->type;
 
-       ieee80211_sta_tx(dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
 }
 
-static void ieee80211_sta_process_measurement_req(struct net_device *dev,
+static void ieee80211_sta_process_measurement_req(struct ieee80211_sub_if_data *sdata,
                                                struct ieee80211_mgmt *mgmt,
                                                size_t len)
 {
@@ -1835,23 +1857,22 @@ static void ieee80211_sta_process_measurement_req(struct net_device *dev,
         * For now just refuse
         * TODO: Answer basic measurement as unmeasured
         */
-       ieee80211_send_refuse_measurement_request(dev,
+       ieee80211_send_refuse_measurement_request(sdata,
                        &mgmt->u.action.u.measurement.msr_elem,
                        mgmt->sa, mgmt->bssid,
                        mgmt->u.action.u.measurement.dialog_token);
 }
 
 
-static void ieee80211_rx_mgmt_auth(struct net_device *dev,
+static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
                                   struct ieee80211_if_sta *ifsta,
                                   struct ieee80211_mgmt *mgmt,
                                   size_t len)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        u16 auth_alg, auth_transaction, status_code;
        DECLARE_MAC_BUF(mac);
 
-       if (ifsta->state != IEEE80211_AUTHENTICATE &&
+       if (ifsta->state != IEEE80211_STA_MLME_AUTHENTICATE &&
            sdata->vif.type != IEEE80211_IF_TYPE_IBSS)
                return;
 
@@ -1879,7 +1900,7 @@ static void ieee80211_rx_mgmt_auth(struct net_device *dev,
                 */
                if (auth_alg != WLAN_AUTH_OPEN || auth_transaction != 1)
                        return;
-               ieee80211_send_auth(dev, ifsta, 2, NULL, 0, 0);
+               ieee80211_send_auth(sdata, ifsta, 2, NULL, 0, 0);
        }
 
        if (auth_alg != ifsta->auth_alg ||
@@ -1912,7 +1933,7 @@ static void ieee80211_rx_mgmt_auth(struct net_device *dev,
                                    algs[pos] == 0xff)
                                        continue;
                                if (algs[pos] == WLAN_AUTH_SHARED_KEY &&
-                                   !ieee80211_sta_wep_configured(dev))
+                                   !ieee80211_sta_wep_configured(sdata))
                                        continue;
                                ifsta->auth_alg = algs[pos];
                                break;
@@ -1924,19 +1945,19 @@ static void ieee80211_rx_mgmt_auth(struct net_device *dev,
        switch (ifsta->auth_alg) {
        case WLAN_AUTH_OPEN:
        case WLAN_AUTH_LEAP:
-               ieee80211_auth_completed(dev, ifsta);
+               ieee80211_auth_completed(sdata, ifsta);
                break;
        case WLAN_AUTH_SHARED_KEY:
                if (ifsta->auth_transaction == 4)
-                       ieee80211_auth_completed(dev, ifsta);
+                       ieee80211_auth_completed(sdata, ifsta);
                else
-                       ieee80211_auth_challenge(dev, ifsta, mgmt, len);
+                       ieee80211_auth_challenge(sdata, ifsta, mgmt, len);
                break;
        }
 }
 
 
-static void ieee80211_rx_mgmt_deauth(struct net_device *dev,
+static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
                                     struct ieee80211_if_sta *ifsta,
                                     struct ieee80211_mgmt *mgmt,
                                     size_t len)
@@ -1953,22 +1974,22 @@ static void ieee80211_rx_mgmt_deauth(struct net_device *dev,
        reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
 
        if (ifsta->flags & IEEE80211_STA_AUTHENTICATED)
-               printk(KERN_DEBUG "%s: deauthenticated\n", dev->name);
+               printk(KERN_DEBUG "%s: deauthenticated\n", sdata->dev->name);
 
-       if (ifsta->state == IEEE80211_AUTHENTICATE ||
-           ifsta->state == IEEE80211_ASSOCIATE ||
-           ifsta->state == IEEE80211_ASSOCIATED) {
-               ifsta->state = IEEE80211_AUTHENTICATE;
+       if (ifsta->state == IEEE80211_STA_MLME_AUTHENTICATE ||
+           ifsta->state == IEEE80211_STA_MLME_ASSOCIATE ||
+           ifsta->state == IEEE80211_STA_MLME_ASSOCIATED) {
+               ifsta->state = IEEE80211_STA_MLME_DIRECT_PROBE;
                mod_timer(&ifsta->timer, jiffies +
                                      IEEE80211_RETRY_AUTH_INTERVAL);
        }
 
-       ieee80211_set_disassoc(dev, ifsta, 1);
+       ieee80211_set_disassoc(sdata, ifsta, 1);
        ifsta->flags &= ~IEEE80211_STA_AUTHENTICATED;
 }
 
 
-static void ieee80211_rx_mgmt_disassoc(struct net_device *dev,
+static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata,
                                       struct ieee80211_if_sta *ifsta,
                                       struct ieee80211_mgmt *mgmt,
                                       size_t len)
@@ -1985,15 +2006,15 @@ static void ieee80211_rx_mgmt_disassoc(struct net_device *dev,
        reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
 
        if (ifsta->flags & IEEE80211_STA_ASSOCIATED)
-               printk(KERN_DEBUG "%s: disassociated\n", dev->name);
+               printk(KERN_DEBUG "%s: disassociated\n", sdata->dev->name);
 
-       if (ifsta->state == IEEE80211_ASSOCIATED) {
-               ifsta->state = IEEE80211_ASSOCIATE;
+       if (ifsta->state == IEEE80211_STA_MLME_ASSOCIATED) {
+               ifsta->state = IEEE80211_STA_MLME_ASSOCIATE;
                mod_timer(&ifsta->timer, jiffies +
                                      IEEE80211_RETRY_AUTH_INTERVAL);
        }
 
-       ieee80211_set_disassoc(dev, ifsta, 0);
+       ieee80211_set_disassoc(sdata, ifsta, 0);
 }
 
 
@@ -2004,7 +2025,6 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
                                         int reassoc)
 {
        struct ieee80211_local *local = sdata->local;
-       struct net_device *dev = sdata->dev;
        struct ieee80211_supported_band *sband;
        struct sta_info *sta;
        u64 rates, basic_rates;
@@ -2019,7 +2039,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
        /* AssocResp and ReassocResp have identical structure, so process both
         * of them in this function. */
 
-       if (ifsta->state != IEEE80211_ASSOCIATE)
+       if (ifsta->state != IEEE80211_STA_MLME_ASSOCIATE)
                return;
 
        if (len < 24 + 6)
@@ -2034,12 +2054,12 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
 
        printk(KERN_DEBUG "%s: RX %sssocResp from %s (capab=0x%x "
               "status=%d aid=%d)\n",
-              dev->name, reassoc ? "Rea" : "A", print_mac(mac, mgmt->sa),
+              sdata->dev->name, reassoc ? "Rea" : "A", print_mac(mac, mgmt->sa),
               capab_info, status_code, (u16)(aid & ~(BIT(15) | BIT(14))));
 
        if (status_code != WLAN_STATUS_SUCCESS) {
                printk(KERN_DEBUG "%s: AP denied association (code=%d)\n",
-                      dev->name, status_code);
+                      sdata->dev->name, status_code);
                /* if this was a reassociation, ensure we try a "full"
                 * association next time. This works around some broken APs
                 * which do not correctly reject reassociation requests. */
@@ -2049,7 +2069,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
 
        if ((aid & (BIT(15) | BIT(14))) != (BIT(15) | BIT(14)))
                printk(KERN_DEBUG "%s: invalid aid value %d; bits 15:14 not "
-                      "set\n", dev->name, aid);
+                      "set\n", sdata->dev->name, aid);
        aid &= ~(BIT(15) | BIT(14));
 
        pos = mgmt->u.assoc_resp.variable;
@@ -2057,11 +2077,11 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
 
        if (!elems.supp_rates) {
                printk(KERN_DEBUG "%s: no SuppRates element in AssocResp\n",
-                      dev->name);
+                      sdata->dev->name);
                return;
        }
 
-       printk(KERN_DEBUG "%s: associated\n", dev->name);
+       printk(KERN_DEBUG "%s: associated\n", sdata->dev->name);
        ifsta->aid = aid;
        ifsta->ap_capab = capab_info;
 
@@ -2082,11 +2102,11 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
                sta = sta_info_alloc(sdata, ifsta->bssid, GFP_ATOMIC);
                if (!sta) {
                        printk(KERN_DEBUG "%s: failed to alloc STA entry for"
-                              " the AP\n", dev->name);
+                              " the AP\n", sdata->dev->name);
                        rcu_read_unlock();
                        return;
                }
-               bss = ieee80211_rx_bss_get(dev, ifsta->bssid,
+               bss = ieee80211_rx_bss_get(local, ifsta->bssid,
                                           local->hw.conf.channel->center_freq,
                                           ifsta->ssid, ifsta->ssid_len);
                if (bss) {
@@ -2099,7 +2119,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
                err = sta_info_insert(sta);
                if (err) {
                        printk(KERN_DEBUG "%s: failed to insert STA entry for"
-                              " the AP (error %d)\n", dev->name, err);
+                              " the AP (error %d)\n", sdata->dev->name, err);
                        rcu_read_unlock();
                        return;
                }
@@ -2179,7 +2199,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
        if (elems.wmm_param) {
                set_sta_flags(sta, WLAN_STA_WME);
                rcu_read_unlock();
-               ieee80211_sta_wmm_params(dev, ifsta, elems.wmm_param,
+               ieee80211_sta_wmm_params(local, ifsta, elems.wmm_param,
                                         elems.wmm_param_len);
        } else
                rcu_read_unlock();
@@ -2188,17 +2208,16 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
         * ieee80211_set_associated() will tell the driver */
        bss_conf->aid = aid;
        bss_conf->assoc_capability = capab_info;
-       ieee80211_set_associated(dev, ifsta, 1);
+       ieee80211_set_associated(sdata, ifsta, 1);
 
-       ieee80211_associated(dev, ifsta);
+       ieee80211_associated(sdata, ifsta);
 }
 
 
 /* Caller must hold local->sta_bss_lock */
-static void __ieee80211_rx_bss_hash_add(struct net_device *dev,
+static void __ieee80211_rx_bss_hash_add(struct ieee80211_local *local,
                                        struct ieee80211_sta_bss *bss)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
        u8 hash_idx;
 
        if (bss_mesh_cfg(bss))
@@ -2234,10 +2253,10 @@ static void __ieee80211_rx_bss_hash_del(struct ieee80211_local *local,
 
 
 static struct ieee80211_sta_bss *
-ieee80211_rx_bss_add(struct net_device *dev, u8 *bssid, int freq,
+ieee80211_rx_bss_add(struct ieee80211_sub_if_data *sdata, u8 *bssid, int freq,
                     u8 *ssid, u8 ssid_len)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_sta_bss *bss;
 
        bss = kzalloc(sizeof(*bss), GFP_ATOMIC);
@@ -2255,16 +2274,15 @@ ieee80211_rx_bss_add(struct net_device *dev, u8 *bssid, int freq,
        spin_lock_bh(&local->sta_bss_lock);
        /* TODO: order by RSSI? */
        list_add_tail(&bss->list, &local->sta_bss_list);
-       __ieee80211_rx_bss_hash_add(dev, bss);
+       __ieee80211_rx_bss_hash_add(local, bss);
        spin_unlock_bh(&local->sta_bss_lock);
        return bss;
 }
 
 static struct ieee80211_sta_bss *
-ieee80211_rx_bss_get(struct net_device *dev, u8 *bssid, int freq,
+ieee80211_rx_bss_get(struct ieee80211_local *local, u8 *bssid, int freq,
                     u8 *ssid, u8 ssid_len)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
        struct ieee80211_sta_bss *bss;
 
        spin_lock_bh(&local->sta_bss_lock);
@@ -2286,10 +2304,9 @@ ieee80211_rx_bss_get(struct net_device *dev, u8 *bssid, int freq,
 
 #ifdef CONFIG_MAC80211_MESH
 static struct ieee80211_sta_bss *
-ieee80211_rx_mesh_bss_get(struct net_device *dev, u8 *mesh_id, int mesh_id_len,
+ieee80211_rx_mesh_bss_get(struct ieee80211_local *local, u8 *mesh_id, int mesh_id_len,
                          u8 *mesh_cfg, int freq)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
        struct ieee80211_sta_bss *bss;
 
        spin_lock_bh(&local->sta_bss_lock);
@@ -2311,10 +2328,9 @@ ieee80211_rx_mesh_bss_get(struct net_device *dev, u8 *mesh_id, int mesh_id_len,
 }
 
 static struct ieee80211_sta_bss *
-ieee80211_rx_mesh_bss_add(struct net_device *dev, u8 *mesh_id, int mesh_id_len,
+ieee80211_rx_mesh_bss_add(struct ieee80211_local *local, u8 *mesh_id, int mesh_id_len,
                          u8 *mesh_cfg, int mesh_config_len, int freq)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
        struct ieee80211_sta_bss *bss;
 
        if (mesh_config_len != MESH_CFG_LEN)
@@ -2348,7 +2364,7 @@ ieee80211_rx_mesh_bss_add(struct net_device *dev, u8 *mesh_id, int mesh_id_len,
        spin_lock_bh(&local->sta_bss_lock);
        /* TODO: order by RSSI? */
        list_add_tail(&bss->list, &local->sta_bss_list);
-       __ieee80211_rx_bss_hash_add(dev, bss);
+       __ieee80211_rx_bss_hash_add(local, bss);
        spin_unlock_bh(&local->sta_bss_lock);
        return bss;
 }
@@ -2399,23 +2415,20 @@ void ieee80211_rx_bss_list_deinit(struct ieee80211_local *local)
 }
 
 
-static int ieee80211_sta_join_ibss(struct net_device *dev,
+static int ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
                                   struct ieee80211_if_sta *ifsta,
                                   struct ieee80211_sta_bss *bss)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        int res, rates, i, j;
        struct sk_buff *skb;
        struct ieee80211_mgmt *mgmt;
        u8 *pos;
-       struct ieee80211_sub_if_data *sdata;
        struct ieee80211_supported_band *sband;
        union iwreq_data wrqu;
 
        sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
 
-       sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-
        /* Remove possible STA entries from other IBSS networks. */
        sta_info_flush_delayed(sdata);
 
@@ -2433,7 +2446,7 @@ static int ieee80211_sta_join_ibss(struct net_device *dev,
        sdata->drop_unencrypted = bss->capability &
                WLAN_CAPABILITY_PRIVACY ? 1 : 0;
 
-       res = ieee80211_set_freq(dev, bss->freq);
+       res = ieee80211_set_freq(sdata, bss->freq);
 
        if (res)
                return res;
@@ -2446,10 +2459,10 @@ static int ieee80211_sta_join_ibss(struct net_device *dev,
                mgmt = (struct ieee80211_mgmt *)
                        skb_put(skb, 24 + sizeof(mgmt->u.beacon));
                memset(mgmt, 0, 24 + sizeof(mgmt->u.beacon));
-               mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                                  IEEE80211_STYPE_PROBE_RESP);
+               mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                                 IEEE80211_STYPE_PROBE_RESP);
                memset(mgmt->da, 0xff, ETH_ALEN);
-               memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
+               memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
                memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
                mgmt->u.beacon.beacon_int =
                        cpu_to_le16(local->hw.conf.beacon_int);
@@ -2506,14 +2519,14 @@ static int ieee80211_sta_join_ibss(struct net_device *dev,
        }
        ifsta->supp_rates_bits[local->hw.conf.channel->band] = rates;
 
-       ieee80211_sta_def_wmm_params(dev, bss, 1);
+       ieee80211_sta_def_wmm_params(sdata, bss, 1);
 
-       ifsta->state = IEEE80211_IBSS_JOINED;
+       ifsta->state = IEEE80211_STA_MLME_IBSS_JOINED;
        mod_timer(&ifsta->timer, jiffies + IEEE80211_IBSS_MERGE_INTERVAL);
 
        memset(&wrqu, 0, sizeof(wrqu));
        memcpy(wrqu.ap_addr.sa_data, bss->bssid, ETH_ALEN);
-       wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
+       wireless_send_event(sdata->dev, SIOCGIWAP, &wrqu, NULL);
 
        return res;
 }
@@ -2555,35 +2568,31 @@ u64 ieee80211_sta_get_rates(struct ieee80211_local *local,
 }
 
 
-static void ieee80211_rx_bss_info(struct net_device *dev,
+static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
                                  struct ieee80211_mgmt *mgmt,
                                  size_t len,
                                  struct ieee80211_rx_status *rx_status,
-                                 struct ieee802_11_elems *elems,
-                                 int beacon)
+                                 struct ieee802_11_elems *elems)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        int freq, clen;
        struct ieee80211_sta_bss *bss;
        struct sta_info *sta;
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        u64 beacon_timestamp, rx_timestamp;
        struct ieee80211_channel *channel;
+       bool beacon = ieee80211_is_beacon(mgmt->frame_control);
        DECLARE_MAC_BUF(mac);
        DECLARE_MAC_BUF(mac2);
 
-       if (!beacon && memcmp(mgmt->da, dev->dev_addr, ETH_ALEN))
-               return; /* ignore ProbeResp to foreign address */
-
        beacon_timestamp = le64_to_cpu(mgmt->u.beacon.timestamp);
 
        if (ieee80211_vif_is_mesh(&sdata->vif) && elems->mesh_id &&
-           elems->mesh_config && mesh_matches_local(elems, dev)) {
+           elems->mesh_config && mesh_matches_local(elems, sdata)) {
                u64 rates = ieee80211_sta_get_rates(local, elems,
                                                rx_status->band);
 
-               mesh_neighbour_update(mgmt->sa, rates, dev,
-                                     mesh_peer_accepts_plinks(elems, dev));
+               mesh_neighbour_update(mgmt->sa, rates, sdata,
+                                     mesh_peer_accepts_plinks(elems));
        }
 
        rcu_read_lock();
@@ -2620,21 +2629,21 @@ static void ieee80211_rx_bss_info(struct net_device *dev,
 
 #ifdef CONFIG_MAC80211_MESH
        if (elems->mesh_config)
-               bss = ieee80211_rx_mesh_bss_get(dev, elems->mesh_id,
+               bss = ieee80211_rx_mesh_bss_get(local, elems->mesh_id,
                                elems->mesh_id_len, elems->mesh_config, freq);
        else
 #endif
-               bss = ieee80211_rx_bss_get(dev, mgmt->bssid, freq,
+               bss = ieee80211_rx_bss_get(local, mgmt->bssid, freq,
                                           elems->ssid, elems->ssid_len);
        if (!bss) {
 #ifdef CONFIG_MAC80211_MESH
                if (elems->mesh_config)
-                       bss = ieee80211_rx_mesh_bss_add(dev, elems->mesh_id,
+                       bss = ieee80211_rx_mesh_bss_add(local, elems->mesh_id,
                                elems->mesh_id_len, elems->mesh_config,
                                elems->mesh_config_len, freq);
                else
 #endif
-                       bss = ieee80211_rx_bss_add(dev, mgmt->bssid, freq,
+                       bss = ieee80211_rx_bss_add(sdata, mgmt->bssid, freq,
                                                  elems->ssid, elems->ssid_len);
                if (!bss)
                        return;
@@ -2728,15 +2737,14 @@ static void ieee80211_rx_bss_info(struct net_device *dev,
        bss->signal = rx_status->signal;
        bss->noise = rx_status->noise;
        bss->qual = rx_status->qual;
-       if (!beacon && !bss->probe_resp)
-               bss->probe_resp = true;
-
+       if (!beacon)
+               bss->last_probe_resp = jiffies;
        /*
         * In STA mode, the remaining parameters should not be overridden
         * by beacons because they're not necessarily accurate there.
         */
        if (sdata->vif.type != IEEE80211_IF_TYPE_IBSS &&
-           bss->probe_resp && beacon) {
+           bss->last_probe_resp && beacon) {
                ieee80211_rx_bss_put(local, bss);
                return;
        }
@@ -2871,10 +2879,10 @@ static void ieee80211_rx_bss_info(struct net_device *dev,
 #ifndef CONFIG_MAC80211_IBSS_DEBUG
                        printk(KERN_DEBUG "%s: beacon TSF higher than "
                               "local TSF - IBSS merge with BSSID %s\n",
-                              dev->name, print_mac(mac, mgmt->bssid));
+                              sdata->dev->name, print_mac(mac, mgmt->bssid));
 #endif
-                       ieee80211_sta_join_ibss(dev, &sdata->u.sta, bss);
-                       ieee80211_ibss_add_sta(dev, NULL,
+                       ieee80211_sta_join_ibss(sdata, &sdata->u.sta, bss);
+                       ieee80211_ibss_add_sta(sdata, NULL,
                                               mgmt->bssid, mgmt->sa,
                                               BIT(rx_status->rate_idx));
                }
@@ -2884,13 +2892,17 @@ static void ieee80211_rx_bss_info(struct net_device *dev,
 }
 
 
-static void ieee80211_rx_mgmt_probe_resp(struct net_device *dev,
+static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
                                         struct ieee80211_mgmt *mgmt,
                                         size_t len,
                                         struct ieee80211_rx_status *rx_status)
 {
        size_t baselen;
        struct ieee802_11_elems elems;
+       struct ieee80211_if_sta *ifsta = &sdata->u.sta;
+
+       if (memcmp(mgmt->da, sdata->dev->dev_addr, ETH_ALEN))
+               return; /* ignore ProbeResp to foreign address */
 
        baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
        if (baselen > len)
@@ -2899,20 +2911,27 @@ static void ieee80211_rx_mgmt_probe_resp(struct net_device *dev,
        ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
                                &elems);
 
-       ieee80211_rx_bss_info(dev, mgmt, len, rx_status, &elems, 0);
+       ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems);
+
+       /* direct probe may be part of the association flow */
+       if (test_and_clear_bit(IEEE80211_STA_REQ_DIRECT_PROBE,
+                                                       &ifsta->request)) {
+               printk(KERN_DEBUG "%s direct probe responded\n",
+                      sdata->dev->name);
+               ieee80211_authenticate(sdata, ifsta);
+       }
 }
 
 
-static void ieee80211_rx_mgmt_beacon(struct net_device *dev,
+static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
                                     struct ieee80211_mgmt *mgmt,
                                     size_t len,
                                     struct ieee80211_rx_status *rx_status)
 {
-       struct ieee80211_sub_if_data *sdata;
        struct ieee80211_if_sta *ifsta;
        size_t baselen;
        struct ieee802_11_elems elems;
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_conf *conf = &local->hw.conf;
        u32 changed = 0;
 
@@ -2923,9 +2942,8 @@ static void ieee80211_rx_mgmt_beacon(struct net_device *dev,
 
        ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen, &elems);
 
-       ieee80211_rx_bss_info(dev, mgmt, len, rx_status, &elems, 1);
+       ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems);
 
-       sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        if (sdata->vif.type != IEEE80211_IF_TYPE_STA)
                return;
        ifsta = &sdata->u.sta;
@@ -2934,7 +2952,7 @@ static void ieee80211_rx_mgmt_beacon(struct net_device *dev,
            memcmp(ifsta->bssid, mgmt->bssid, ETH_ALEN) != 0)
                return;
 
-       ieee80211_sta_wmm_params(dev, ifsta, elems.wmm_param,
+       ieee80211_sta_wmm_params(local, ifsta, elems.wmm_param,
                                 elems.wmm_param_len);
 
        /* Do not send changes to driver if we are scanning. This removes
@@ -2966,14 +2984,13 @@ static void ieee80211_rx_mgmt_beacon(struct net_device *dev,
 }
 
 
-static void ieee80211_rx_mgmt_probe_req(struct net_device *dev,
+static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,
                                        struct ieee80211_if_sta *ifsta,
                                        struct ieee80211_mgmt *mgmt,
                                        size_t len,
                                        struct ieee80211_rx_status *rx_status)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+       struct ieee80211_local *local = sdata->local;
        int tx_last_beacon;
        struct sk_buff *skb;
        struct ieee80211_mgmt *resp;
@@ -2985,7 +3002,7 @@ static void ieee80211_rx_mgmt_probe_req(struct net_device *dev,
 #endif
 
        if (sdata->vif.type != IEEE80211_IF_TYPE_IBSS ||
-           ifsta->state != IEEE80211_IBSS_JOINED ||
+           ifsta->state != IEEE80211_STA_MLME_IBSS_JOINED ||
            len < 24 + 2 || !ifsta->probe_resp)
                return;
 
@@ -2997,7 +3014,7 @@ static void ieee80211_rx_mgmt_probe_req(struct net_device *dev,
 #ifdef CONFIG_MAC80211_IBSS_DEBUG
        printk(KERN_DEBUG "%s: RX ProbeReq SA=%s DA=%s BSSID="
               "%s (tx_last_beacon=%d)\n",
-              dev->name, print_mac(mac, mgmt->sa), print_mac(mac2, mgmt->da),
+              sdata->dev->name, print_mac(mac, mgmt->sa), print_mac(mac2, mgmt->da),
               print_mac(mac3, mgmt->bssid), tx_last_beacon);
 #endif /* CONFIG_MAC80211_IBSS_DEBUG */
 
@@ -3015,7 +3032,7 @@ static void ieee80211_rx_mgmt_probe_req(struct net_device *dev,
 #ifdef CONFIG_MAC80211_IBSS_DEBUG
                printk(KERN_DEBUG "%s: Invalid SSID IE in ProbeReq "
                       "from %s\n",
-                      dev->name, print_mac(mac, mgmt->sa));
+                      sdata->dev->name, print_mac(mac, mgmt->sa));
 #endif
                return;
        }
@@ -3035,19 +3052,18 @@ static void ieee80211_rx_mgmt_probe_req(struct net_device *dev,
        memcpy(resp->da, mgmt->sa, ETH_ALEN);
 #ifdef CONFIG_MAC80211_IBSS_DEBUG
        printk(KERN_DEBUG "%s: Sending ProbeResp to %s\n",
-              dev->name, print_mac(mac, resp->da));
+              sdata->dev->name, print_mac(mac, resp->da));
 #endif /* CONFIG_MAC80211_IBSS_DEBUG */
-       ieee80211_sta_tx(dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
 }
 
-static void ieee80211_rx_mgmt_action(struct net_device *dev,
+static void ieee80211_rx_mgmt_action(struct ieee80211_sub_if_data *sdata,
                                     struct ieee80211_if_sta *ifsta,
                                     struct ieee80211_mgmt *mgmt,
                                     size_t len,
                                     struct ieee80211_rx_status *rx_status)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
 
        if (len < IEEE80211_MIN_ACTION_SIZE)
                return;
@@ -3061,7 +3077,7 @@ static void ieee80211_rx_mgmt_action(struct net_device *dev,
                        if (len < (IEEE80211_MIN_ACTION_SIZE +
                                   sizeof(mgmt->u.action.u.measurement)))
                                break;
-                       ieee80211_sta_process_measurement_req(dev, mgmt, len);
+                       ieee80211_sta_process_measurement_req(sdata, mgmt, len);
                        break;
                }
                break;
@@ -3071,38 +3087,37 @@ static void ieee80211_rx_mgmt_action(struct net_device *dev,
                        if (len < (IEEE80211_MIN_ACTION_SIZE +
                                   sizeof(mgmt->u.action.u.addba_req)))
                                break;
-                       ieee80211_sta_process_addba_request(dev, mgmt, len);
+                       ieee80211_sta_process_addba_request(local, mgmt, len);
                        break;
                case WLAN_ACTION_ADDBA_RESP:
                        if (len < (IEEE80211_MIN_ACTION_SIZE +
                                   sizeof(mgmt->u.action.u.addba_resp)))
                                break;
-                       ieee80211_sta_process_addba_resp(dev, mgmt, len);
+                       ieee80211_sta_process_addba_resp(local, mgmt, len);
                        break;
                case WLAN_ACTION_DELBA:
                        if (len < (IEEE80211_MIN_ACTION_SIZE +
                                   sizeof(mgmt->u.action.u.delba)))
                                break;
-                       ieee80211_sta_process_delba(dev, mgmt, len);
+                       ieee80211_sta_process_delba(sdata, mgmt, len);
                        break;
                }
                break;
        case PLINK_CATEGORY:
                if (ieee80211_vif_is_mesh(&sdata->vif))
-                       mesh_rx_plink_frame(dev, mgmt, len, rx_status);
+                       mesh_rx_plink_frame(sdata, mgmt, len, rx_status);
                break;
        case MESH_PATH_SEL_CATEGORY:
                if (ieee80211_vif_is_mesh(&sdata->vif))
-                       mesh_rx_path_sel_frame(dev, mgmt, len);
+                       mesh_rx_path_sel_frame(sdata, mgmt, len);
                break;
        }
 }
 
-void ieee80211_sta_rx_mgmt(struct net_device *dev, struct sk_buff *skb,
+void ieee80211_sta_rx_mgmt(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb,
                           struct ieee80211_rx_status *rx_status)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
-       struct ieee80211_sub_if_data *sdata;
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_if_sta *ifsta;
        struct ieee80211_mgmt *mgmt;
        u16 fc;
@@ -3110,7 +3125,6 @@ void ieee80211_sta_rx_mgmt(struct net_device *dev, struct sk_buff *skb,
        if (skb->len < 24)
                goto fail;
 
-       sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        ifsta = &sdata->u.sta;
 
        mgmt = (struct ieee80211_mgmt *) skb->data;
@@ -3137,16 +3151,14 @@ void ieee80211_sta_rx_mgmt(struct net_device *dev, struct sk_buff *skb,
 }
 
 
-static void ieee80211_sta_rx_queued_mgmt(struct net_device *dev,
+static void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
                                         struct sk_buff *skb)
 {
        struct ieee80211_rx_status *rx_status;
-       struct ieee80211_sub_if_data *sdata;
        struct ieee80211_if_sta *ifsta;
        struct ieee80211_mgmt *mgmt;
        u16 fc;
 
-       sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        ifsta = &sdata->u.sta;
 
        rx_status = (struct ieee80211_rx_status *) skb->cb;
@@ -3155,17 +3167,17 @@ static void ieee80211_sta_rx_queued_mgmt(struct net_device *dev,
 
        switch (fc & IEEE80211_FCTL_STYPE) {
        case IEEE80211_STYPE_PROBE_REQ:
-               ieee80211_rx_mgmt_probe_req(dev, ifsta, mgmt, skb->len,
+               ieee80211_rx_mgmt_probe_req(sdata, ifsta, mgmt, skb->len,
                                            rx_status);
                break;
        case IEEE80211_STYPE_PROBE_RESP:
-               ieee80211_rx_mgmt_probe_resp(dev, mgmt, skb->len, rx_status);
+               ieee80211_rx_mgmt_probe_resp(sdata, mgmt, skb->len, rx_status);
                break;
        case IEEE80211_STYPE_BEACON:
-               ieee80211_rx_mgmt_beacon(dev, mgmt, skb->len, rx_status);
+               ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len, rx_status);
                break;
        case IEEE80211_STYPE_AUTH:
-               ieee80211_rx_mgmt_auth(dev, ifsta, mgmt, skb->len);
+               ieee80211_rx_mgmt_auth(sdata, ifsta, mgmt, skb->len);
                break;
        case IEEE80211_STYPE_ASSOC_RESP:
                ieee80211_rx_mgmt_assoc_resp(sdata, ifsta, mgmt, skb->len, 0);
@@ -3174,13 +3186,13 @@ static void ieee80211_sta_rx_queued_mgmt(struct net_device *dev,
                ieee80211_rx_mgmt_assoc_resp(sdata, ifsta, mgmt, skb->len, 1);
                break;
        case IEEE80211_STYPE_DEAUTH:
-               ieee80211_rx_mgmt_deauth(dev, ifsta, mgmt, skb->len);
+               ieee80211_rx_mgmt_deauth(sdata, ifsta, mgmt, skb->len);
                break;
        case IEEE80211_STYPE_DISASSOC:
-               ieee80211_rx_mgmt_disassoc(dev, ifsta, mgmt, skb->len);
+               ieee80211_rx_mgmt_disassoc(sdata, ifsta, mgmt, skb->len);
                break;
        case IEEE80211_STYPE_ACTION:
-               ieee80211_rx_mgmt_action(dev, ifsta, mgmt, skb->len, rx_status);
+               ieee80211_rx_mgmt_action(sdata, ifsta, mgmt, skb->len, rx_status);
                break;
        }
 
@@ -3189,7 +3201,7 @@ static void ieee80211_sta_rx_queued_mgmt(struct net_device *dev,
 
 
 ieee80211_rx_result
-ieee80211_sta_rx_scan(struct net_device *dev, struct sk_buff *skb,
+ieee80211_sta_rx_scan(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb,
                      struct ieee80211_rx_status *rx_status)
 {
        struct ieee80211_mgmt *mgmt;
@@ -3208,13 +3220,13 @@ ieee80211_sta_rx_scan(struct net_device *dev, struct sk_buff *skb,
                return RX_DROP_MONITOR;
 
        if (ieee80211_is_probe_resp(fc)) {
-               ieee80211_rx_mgmt_probe_resp(dev, mgmt, skb->len, rx_status);
+               ieee80211_rx_mgmt_probe_resp(sdata, mgmt, skb->len, rx_status);
                dev_kfree_skb(skb);
                return RX_QUEUED;
        }
 
        if (ieee80211_is_beacon(fc)) {
-               ieee80211_rx_mgmt_beacon(dev, mgmt, skb->len, rx_status);
+               ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len, rx_status);
                dev_kfree_skb(skb);
                return RX_QUEUED;
        }
@@ -3223,12 +3235,11 @@ ieee80211_sta_rx_scan(struct net_device *dev, struct sk_buff *skb,
 }
 
 
-static int ieee80211_sta_active_ibss(struct net_device *dev)
+static int ieee80211_sta_active_ibss(struct ieee80211_sub_if_data *sdata)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        int active = 0;
        struct sta_info *sta;
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
        rcu_read_lock();
 
@@ -3247,9 +3258,9 @@ static int ieee80211_sta_active_ibss(struct net_device *dev)
 }
 
 
-static void ieee80211_sta_expire(struct net_device *dev, unsigned long exp_time)
+static void ieee80211_sta_expire(struct ieee80211_sub_if_data *sdata, unsigned long exp_time)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sta_info *sta, *tmp;
        LIST_HEAD(tmp_list);
        DECLARE_MAC_BUF(mac);
@@ -3260,7 +3271,7 @@ static void ieee80211_sta_expire(struct net_device *dev, unsigned long exp_time)
                if (time_after(jiffies, sta->last_rx + exp_time)) {
 #ifdef CONFIG_MAC80211_IBSS_DEBUG
                        printk(KERN_DEBUG "%s: expiring inactive STA %s\n",
-                              dev->name, print_mac(mac, sta->addr));
+                              sdata->dev->name, print_mac(mac, sta->addr));
 #endif
                        __sta_info_unlink(&sta);
                        if (sta)
@@ -3273,30 +3284,29 @@ static void ieee80211_sta_expire(struct net_device *dev, unsigned long exp_time)
 }
 
 
-static void ieee80211_sta_merge_ibss(struct net_device *dev,
+static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata,
                                     struct ieee80211_if_sta *ifsta)
 {
        mod_timer(&ifsta->timer, jiffies + IEEE80211_IBSS_MERGE_INTERVAL);
 
-       ieee80211_sta_expire(dev, IEEE80211_IBSS_INACTIVITY_LIMIT);
-       if (ieee80211_sta_active_ibss(dev))
+       ieee80211_sta_expire(sdata, IEEE80211_IBSS_INACTIVITY_LIMIT);
+       if (ieee80211_sta_active_ibss(sdata))
                return;
 
        printk(KERN_DEBUG "%s: No active IBSS STAs - trying to scan for other "
-              "IBSS networks with same SSID (merge)\n", dev->name);
-       ieee80211_sta_req_scan(dev, ifsta->ssid, ifsta->ssid_len);
+              "IBSS networks with same SSID (merge)\n", sdata->dev->name);
+       ieee80211_sta_req_scan(sdata, ifsta->ssid, ifsta->ssid_len);
 }
 
 
 #ifdef CONFIG_MAC80211_MESH
-static void ieee80211_mesh_housekeeping(struct net_device *dev,
+static void ieee80211_mesh_housekeeping(struct ieee80211_sub_if_data *sdata,
                           struct ieee80211_if_sta *ifsta)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        bool free_plinks;
 
-       ieee80211_sta_expire(dev, IEEE80211_MESH_PEER_INACTIVITY_LIMIT);
-       mesh_path_expire(dev);
+       ieee80211_sta_expire(sdata, IEEE80211_MESH_PEER_INACTIVITY_LIMIT);
+       mesh_path_expire(sdata);
 
        free_plinks = mesh_plink_availables(sdata);
        if (free_plinks != sdata->u.sta.accepting_plinks)
@@ -3307,12 +3317,11 @@ static void ieee80211_mesh_housekeeping(struct net_device *dev,
 }
 
 
-void ieee80211_start_mesh(struct net_device *dev)
+void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata)
 {
        struct ieee80211_if_sta *ifsta;
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        ifsta = &sdata->u.sta;
-       ifsta->state = IEEE80211_MESH_UP;
+       ifsta->state = IEEE80211_STA_MLME_MESH_UP;
        ieee80211_sta_timer((unsigned long)sdata);
        ieee80211_if_config(sdata, IEEE80211_IFCC_BEACON);
 }
@@ -3324,7 +3333,7 @@ void ieee80211_sta_timer(unsigned long data)
        struct ieee80211_sub_if_data *sdata =
                (struct ieee80211_sub_if_data *) data;
        struct ieee80211_if_sta *ifsta = &sdata->u.sta;
-       struct ieee80211_local *local = wdev_priv(&sdata->wdev);
+       struct ieee80211_local *local = sdata->local;
 
        set_bit(IEEE80211_STA_REQ_RUN, &ifsta->request);
        queue_work(local->hw.workqueue, &ifsta->work);
@@ -3334,12 +3343,11 @@ void ieee80211_sta_work(struct work_struct *work)
 {
        struct ieee80211_sub_if_data *sdata =
                container_of(work, struct ieee80211_sub_if_data, u.sta.work);
-       struct net_device *dev = sdata->dev;
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_if_sta *ifsta;
        struct sk_buff *skb;
 
-       if (!netif_running(dev))
+       if (!netif_running(sdata->dev))
                return;
 
        if (local->sta_sw_scanning || local->sta_hw_scanning)
@@ -3352,53 +3360,57 @@ void ieee80211_sta_work(struct work_struct *work)
        ifsta = &sdata->u.sta;
 
        while ((skb = skb_dequeue(&ifsta->skb_queue)))
-               ieee80211_sta_rx_queued_mgmt(dev, skb);
+               ieee80211_sta_rx_queued_mgmt(sdata, skb);
 
 #ifdef CONFIG_MAC80211_MESH
        if (ifsta->preq_queue_len &&
            time_after(jiffies,
                       ifsta->last_preq + msecs_to_jiffies(ifsta->mshcfg.dot11MeshHWMPpreqMinInterval)))
-               mesh_path_start_discovery(dev);
+               mesh_path_start_discovery(sdata);
 #endif
 
-       if (ifsta->state != IEEE80211_AUTHENTICATE &&
-           ifsta->state != IEEE80211_ASSOCIATE &&
+       if (ifsta->state != IEEE80211_STA_MLME_DIRECT_PROBE &&
+           ifsta->state != IEEE80211_STA_MLME_AUTHENTICATE &&
+           ifsta->state != IEEE80211_STA_MLME_ASSOCIATE &&
            test_and_clear_bit(IEEE80211_STA_REQ_SCAN, &ifsta->request)) {
                if (ifsta->scan_ssid_len)
-                       ieee80211_sta_start_scan(dev, ifsta->scan_ssid, ifsta->scan_ssid_len);
+                       ieee80211_sta_start_scan(sdata, ifsta->scan_ssid, ifsta->scan_ssid_len);
                else
-                       ieee80211_sta_start_scan(dev, NULL, 0);
+                       ieee80211_sta_start_scan(sdata, NULL, 0);
                return;
        }
 
        if (test_and_clear_bit(IEEE80211_STA_REQ_AUTH, &ifsta->request)) {
-               if (ieee80211_sta_config_auth(dev, ifsta))
+               if (ieee80211_sta_config_auth(sdata, ifsta))
                        return;
                clear_bit(IEEE80211_STA_REQ_RUN, &ifsta->request);
        } else if (!test_and_clear_bit(IEEE80211_STA_REQ_RUN, &ifsta->request))
                return;
 
        switch (ifsta->state) {
-       case IEEE80211_DISABLED:
+       case IEEE80211_STA_MLME_DISABLED:
+               break;
+       case IEEE80211_STA_MLME_DIRECT_PROBE:
+               ieee80211_direct_probe(sdata, ifsta);
                break;
-       case IEEE80211_AUTHENTICATE:
-               ieee80211_authenticate(dev, ifsta);
+       case IEEE80211_STA_MLME_AUTHENTICATE:
+               ieee80211_authenticate(sdata, ifsta);
                break;
-       case IEEE80211_ASSOCIATE:
-               ieee80211_associate(dev, ifsta);
+       case IEEE80211_STA_MLME_ASSOCIATE:
+               ieee80211_associate(sdata, ifsta);
                break;
-       case IEEE80211_ASSOCIATED:
-               ieee80211_associated(dev, ifsta);
+       case IEEE80211_STA_MLME_ASSOCIATED:
+               ieee80211_associated(sdata, ifsta);
                break;
-       case IEEE80211_IBSS_SEARCH:
-               ieee80211_sta_find_ibss(dev, ifsta);
+       case IEEE80211_STA_MLME_IBSS_SEARCH:
+               ieee80211_sta_find_ibss(sdata, ifsta);
                break;
-       case IEEE80211_IBSS_JOINED:
-               ieee80211_sta_merge_ibss(dev, ifsta);
+       case IEEE80211_STA_MLME_IBSS_JOINED:
+               ieee80211_sta_merge_ibss(sdata, ifsta);
                break;
 #ifdef CONFIG_MAC80211_MESH
-       case IEEE80211_MESH_UP:
-               ieee80211_mesh_housekeeping(dev, ifsta);
+       case IEEE80211_STA_MLME_MESH_UP:
+               ieee80211_mesh_housekeeping(sdata, ifsta);
                break;
 #endif
        default:
@@ -3406,20 +3418,20 @@ void ieee80211_sta_work(struct work_struct *work)
                break;
        }
 
-       if (ieee80211_privacy_mismatch(dev, ifsta)) {
+       if (ieee80211_privacy_mismatch(sdata, ifsta)) {
                printk(KERN_DEBUG "%s: privacy configuration mismatch and "
-                      "mixed-cell disabled - disassociate\n", dev->name);
+                      "mixed-cell disabled - disassociate\n", sdata->dev->name);
 
-               ieee80211_send_disassoc(dev, ifsta, WLAN_REASON_UNSPECIFIED);
-               ieee80211_set_disassoc(dev, ifsta, 0);
+               ieee80211_send_disassoc(sdata, ifsta, WLAN_REASON_UNSPECIFIED);
+               ieee80211_set_disassoc(sdata, ifsta, 0);
        }
 }
 
 
-static void ieee80211_sta_reset_auth(struct net_device *dev,
+static void ieee80211_sta_reset_auth(struct ieee80211_sub_if_data *sdata,
                                     struct ieee80211_if_sta *ifsta)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
 
        if (local->ops->reset_tsf) {
                /* Reset own TSF to allow time synchronization work. */
@@ -3439,16 +3451,18 @@ static void ieee80211_sta_reset_auth(struct net_device *dev,
                ifsta->auth_alg = WLAN_AUTH_OPEN;
        ifsta->auth_transaction = -1;
        ifsta->flags &= ~IEEE80211_STA_ASSOCIATED;
-       ifsta->auth_tries = ifsta->assoc_tries = 0;
-       netif_carrier_off(dev);
+       ifsta->assoc_scan_tries = 0;
+       ifsta->direct_probe_tries = 0;
+       ifsta->auth_tries = 0;
+       ifsta->assoc_tries = 0;
+       netif_carrier_off(sdata->dev);
 }
 
 
-void ieee80211_sta_req_auth(struct net_device *dev,
+void ieee80211_sta_req_auth(struct ieee80211_sub_if_data *sdata,
                            struct ieee80211_if_sta *ifsta)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+       struct ieee80211_local *local = sdata->local;
 
        if (sdata->vif.type != IEEE80211_IF_TYPE_STA)
                return;
@@ -3492,11 +3506,10 @@ static int ieee80211_sta_match_ssid(struct ieee80211_if_sta *ifsta,
        return 0;
 }
 
-static int ieee80211_sta_config_auth(struct net_device *dev,
+static int ieee80211_sta_config_auth(struct ieee80211_sub_if_data *sdata,
                                     struct ieee80211_if_sta *ifsta)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_sta_bss *bss, *selected = NULL;
        int top_rssi = 0, freq;
 
@@ -3535,38 +3548,48 @@ static int ieee80211_sta_config_auth(struct net_device *dev,
        spin_unlock_bh(&local->sta_bss_lock);
 
        if (selected) {
-               ieee80211_set_freq(dev, selected->freq);
+               ieee80211_set_freq(sdata, selected->freq);
                if (!(ifsta->flags & IEEE80211_STA_SSID_SET))
-                       ieee80211_sta_set_ssid(dev, selected->ssid,
+                       ieee80211_sta_set_ssid(sdata, selected->ssid,
                                               selected->ssid_len);
-               ieee80211_sta_set_bssid(dev, selected->bssid);
-               ieee80211_sta_def_wmm_params(dev, selected, 0);
+               ieee80211_sta_set_bssid(sdata, selected->bssid);
+               ieee80211_sta_def_wmm_params(sdata, selected, 0);
+
+               /* Send out direct probe if no probe resp was received or
+                * the one we have is outdated
+                */
+               if (!selected->last_probe_resp ||
+                   time_after(jiffies, selected->last_probe_resp
+                                       + IEEE80211_SCAN_RESULT_EXPIRE))
+                       ifsta->state = IEEE80211_STA_MLME_DIRECT_PROBE;
+               else
+                       ifsta->state = IEEE80211_STA_MLME_AUTHENTICATE;
+
                ieee80211_rx_bss_put(local, selected);
-               ifsta->state = IEEE80211_AUTHENTICATE;
-               ieee80211_sta_reset_auth(dev, ifsta);
+               ieee80211_sta_reset_auth(sdata, ifsta);
                return 0;
        } else {
-               if (ifsta->state != IEEE80211_AUTHENTICATE) {
+               if (ifsta->assoc_scan_tries < IEEE80211_ASSOC_SCANS_MAX_TRIES) {
+                       ifsta->assoc_scan_tries++;
                        if (ifsta->flags & IEEE80211_STA_AUTO_SSID_SEL)
-                               ieee80211_sta_start_scan(dev, NULL, 0);
+                               ieee80211_sta_start_scan(sdata, NULL, 0);
                        else
-                               ieee80211_sta_start_scan(dev, ifsta->ssid,
+                               ieee80211_sta_start_scan(sdata, ifsta->ssid,
                                                         ifsta->ssid_len);
-                       ifsta->state = IEEE80211_AUTHENTICATE;
+                       ifsta->state = IEEE80211_STA_MLME_AUTHENTICATE;
                        set_bit(IEEE80211_STA_REQ_AUTH, &ifsta->request);
                } else
-                       ifsta->state = IEEE80211_DISABLED;
+                       ifsta->state = IEEE80211_STA_MLME_DISABLED;
        }
        return -1;
 }
 
 
-static int ieee80211_sta_create_ibss(struct net_device *dev,
+static int ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata,
                                     struct ieee80211_if_sta *ifsta)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_sta_bss *bss;
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_supported_band *sband;
        u8 bssid[ETH_ALEN], *pos;
        int i;
@@ -3582,15 +3605,15 @@ static int ieee80211_sta_create_ibss(struct net_device *dev,
         * random number generator get different BSSID. */
        get_random_bytes(bssid, ETH_ALEN);
        for (i = 0; i < ETH_ALEN; i++)
-               bssid[i] ^= dev->dev_addr[i];
+               bssid[i] ^= sdata->dev->dev_addr[i];
        bssid[0] &= ~0x01;
        bssid[0] |= 0x02;
 #endif
 
        printk(KERN_DEBUG "%s: Creating new IBSS network, BSSID %s\n",
-              dev->name, print_mac(mac, bssid));
+              sdata->dev->name, print_mac(mac, bssid));
 
-       bss = ieee80211_rx_bss_add(dev, bssid,
+       bss = ieee80211_rx_bss_add(sdata, bssid,
                                   local->hw.conf.channel->center_freq,
                                   sdata->u.sta.ssid, sdata->u.sta.ssid_len);
        if (!bss)
@@ -3617,16 +3640,16 @@ static int ieee80211_sta_create_ibss(struct net_device *dev,
                *pos++ = (u8) (rate / 5);
        }
 
-       ret = ieee80211_sta_join_ibss(dev, ifsta, bss);
+       ret = ieee80211_sta_join_ibss(sdata, ifsta, bss);
        ieee80211_rx_bss_put(local, bss);
        return ret;
 }
 
 
-static int ieee80211_sta_find_ibss(struct net_device *dev,
+static int ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata,
                                   struct ieee80211_if_sta *ifsta)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct ieee80211_sta_bss *bss;
        int found = 0;
        u8 bssid[ETH_ALEN];
@@ -3637,10 +3660,10 @@ static int ieee80211_sta_find_ibss(struct net_device *dev,
        if (ifsta->ssid_len == 0)
                return -EINVAL;
 
-       active_ibss = ieee80211_sta_active_ibss(dev);
+       active_ibss = ieee80211_sta_active_ibss(sdata);
 #ifdef CONFIG_MAC80211_IBSS_DEBUG
        printk(KERN_DEBUG "%s: sta_find_ibss (active_ibss=%d)\n",
-              dev->name, active_ibss);
+              sdata->dev->name, active_ibss);
 #endif /* CONFIG_MAC80211_IBSS_DEBUG */
        spin_lock_bh(&local->sta_bss_lock);
        list_for_each_entry(bss, &local->sta_bss_list, list) {
@@ -3675,15 +3698,15 @@ static int ieee80211_sta_find_ibss(struct net_device *dev,
                else
                        search_freq = local->hw.conf.channel->center_freq;
 
-               bss = ieee80211_rx_bss_get(dev, bssid, search_freq,
+               bss = ieee80211_rx_bss_get(local, bssid, search_freq,
                                           ifsta->ssid, ifsta->ssid_len);
                if (!bss)
                        goto dont_join;
 
                printk(KERN_DEBUG "%s: Selected IBSS BSSID %s"
                       " based on configured SSID\n",
-                      dev->name, print_mac(mac, bssid));
-               ret = ieee80211_sta_join_ibss(dev, ifsta, bss);
+                      sdata->dev->name, print_mac(mac, bssid));
+               ret = ieee80211_sta_join_ibss(sdata, ifsta, bss);
                ieee80211_rx_bss_put(local, bss);
                return ret;
        }
@@ -3694,17 +3717,17 @@ dont_join:
 #endif /* CONFIG_MAC80211_IBSS_DEBUG */
 
        /* Selected IBSS not found in current scan results - try to scan */
-       if (ifsta->state == IEEE80211_IBSS_JOINED &&
-           !ieee80211_sta_active_ibss(dev)) {
+       if (ifsta->state == IEEE80211_STA_MLME_IBSS_JOINED &&
+           !ieee80211_sta_active_ibss(sdata)) {
                mod_timer(&ifsta->timer, jiffies +
                                      IEEE80211_IBSS_MERGE_INTERVAL);
        } else if (time_after(jiffies, local->last_scan_completed +
                              IEEE80211_SCAN_INTERVAL)) {
                printk(KERN_DEBUG "%s: Trigger new scan to find an IBSS to "
-                      "join\n", dev->name);
-               return ieee80211_sta_req_scan(dev, ifsta->ssid,
+                      "join\n", sdata->dev->name);
+               return ieee80211_sta_req_scan(sdata, ifsta->ssid,
                                              ifsta->ssid_len);
-       } else if (ifsta->state != IEEE80211_IBSS_JOINED) {
+       } else if (ifsta->state != IEEE80211_STA_MLME_IBSS_JOINED) {
                int interval = IEEE80211_SCAN_INTERVAL;
 
                if (time_after(jiffies, ifsta->ibss_join_req +
@@ -3712,10 +3735,10 @@ dont_join:
                        if ((ifsta->flags & IEEE80211_STA_CREATE_IBSS) &&
                            (!(local->oper_channel->flags &
                                        IEEE80211_CHAN_NO_IBSS)))
-                               return ieee80211_sta_create_ibss(dev, ifsta);
+                               return ieee80211_sta_create_ibss(sdata, ifsta);
                        if (ifsta->flags & IEEE80211_STA_CREATE_IBSS) {
                                printk(KERN_DEBUG "%s: IBSS not allowed on"
-                                      " %d MHz\n", dev->name,
+                                      " %d MHz\n", sdata->dev->name,
                                       local->hw.conf.channel->center_freq);
                        }
 
@@ -3724,7 +3747,7 @@ dont_join:
                        interval = IEEE80211_SCAN_INTERVAL_SLOW;
                }
 
-               ifsta->state = IEEE80211_IBSS_SEARCH;
+               ifsta->state = IEEE80211_STA_MLME_IBSS_SEARCH;
                mod_timer(&ifsta->timer, jiffies + interval);
                return 0;
        }
@@ -3733,9 +3756,8 @@ dont_join:
 }
 
 
-int ieee80211_sta_set_ssid(struct net_device *dev, char *ssid, size_t len)
+int ieee80211_sta_set_ssid(struct ieee80211_sub_if_data *sdata, char *ssid, size_t len)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_if_sta *ifsta;
        int res;
 
@@ -3759,7 +3781,7 @@ int ieee80211_sta_set_ssid(struct net_device *dev, char *ssid, size_t len)
                        res = ieee80211_if_config(sdata, IEEE80211_IFCC_SSID);
                if (res) {
                        printk(KERN_DEBUG "%s: Failed to config new SSID to "
-                              "the low-level driver\n", dev->name);
+                              "the low-level driver\n", sdata->dev->name);
                        return res;
                }
        }
@@ -3772,17 +3794,16 @@ int ieee80211_sta_set_ssid(struct net_device *dev, char *ssid, size_t len)
        if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS &&
            !(ifsta->flags & IEEE80211_STA_BSSID_SET)) {
                ifsta->ibss_join_req = jiffies;
-               ifsta->state = IEEE80211_IBSS_SEARCH;
-               return ieee80211_sta_find_ibss(dev, ifsta);
+               ifsta->state = IEEE80211_STA_MLME_IBSS_SEARCH;
+               return ieee80211_sta_find_ibss(sdata, ifsta);
        }
 
        return 0;
 }
 
 
-int ieee80211_sta_get_ssid(struct net_device *dev, char *ssid, size_t *len)
+int ieee80211_sta_get_ssid(struct ieee80211_sub_if_data *sdata, char *ssid, size_t *len)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_if_sta *ifsta = &sdata->u.sta;
        memcpy(ssid, ifsta->ssid, ifsta->ssid_len);
        *len = ifsta->ssid_len;
@@ -3790,13 +3811,11 @@ int ieee80211_sta_get_ssid(struct net_device *dev, char *ssid, size_t *len)
 }
 
 
-int ieee80211_sta_set_bssid(struct net_device *dev, u8 *bssid)
+int ieee80211_sta_set_bssid(struct ieee80211_sub_if_data *sdata, u8 *bssid)
 {
-       struct ieee80211_sub_if_data *sdata;
        struct ieee80211_if_sta *ifsta;
        int res;
 
-       sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        ifsta = &sdata->u.sta;
 
        if (memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0) {
@@ -3809,7 +3828,7 @@ int ieee80211_sta_set_bssid(struct net_device *dev, u8 *bssid)
                        res = ieee80211_if_config(sdata, IEEE80211_IFCC_BSSID);
                if (res) {
                        printk(KERN_DEBUG "%s: Failed to config new BSSID to "
-                              "the low-level driver\n", dev->name);
+                              "the low-level driver\n", sdata->dev->name);
                        return res;
                }
        }
@@ -3850,7 +3869,7 @@ static void ieee80211_send_nullfunc(struct ieee80211_local *local,
        memcpy(nullfunc->addr2, sdata->dev->dev_addr, ETH_ALEN);
        memcpy(nullfunc->addr3, sdata->u.sta.bssid, ETH_ALEN);
 
-       ieee80211_sta_tx(sdata->dev, skb, 0);
+       ieee80211_sta_tx(sdata, skb, 0);
 }
 
 
@@ -3922,9 +3941,9 @@ done:
        if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS) {
                struct ieee80211_if_sta *ifsta = &sdata->u.sta;
                if (!(ifsta->flags & IEEE80211_STA_BSSID_SET) ||
-                   (!(ifsta->state == IEEE80211_IBSS_JOINED) &&
-                   !ieee80211_sta_active_ibss(dev)))
-                       ieee80211_sta_find_ibss(dev, ifsta);
+                   (!(ifsta->state == IEEE80211_STA_MLME_IBSS_JOINED) &&
+                   !ieee80211_sta_active_ibss(sdata)))
+                       ieee80211_sta_find_ibss(sdata, ifsta);
        }
 }
 EXPORT_SYMBOL(ieee80211_scan_completed);
@@ -4013,7 +4032,7 @@ void ieee80211_sta_scan_work(struct work_struct *work)
 
                if (local->scan_channel->flags & IEEE80211_CHAN_PASSIVE_SCAN)
                        break;
-               ieee80211_send_probe_req(dev, NULL, local->scan_ssid,
+               ieee80211_send_probe_req(sdata, NULL, local->scan_ssid,
                                         local->scan_ssid_len);
                next_delay = IEEE80211_CHANNEL_TIME;
                break;
@@ -4025,10 +4044,10 @@ void ieee80211_sta_scan_work(struct work_struct *work)
 }
 
 
-static int ieee80211_sta_start_scan(struct net_device *dev,
+static int ieee80211_sta_start_scan(struct ieee80211_sub_if_data *scan_sdata,
                                    u8 *ssid, size_t ssid_len)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = scan_sdata->local;
        struct ieee80211_sub_if_data *sdata;
 
        if (ssid_len > IEEE80211_MAX_SSID_LEN)
@@ -4052,7 +4071,7 @@ static int ieee80211_sta_start_scan(struct net_device *dev,
         */
 
        if (local->sta_sw_scanning || local->sta_hw_scanning) {
-               if (local->scan_dev == dev)
+               if (local->scan_dev == scan_sdata->dev)
                        return 0;
                return -EBUSY;
        }
@@ -4062,7 +4081,7 @@ static int ieee80211_sta_start_scan(struct net_device *dev,
                                             ssid, ssid_len);
                if (!rc) {
                        local->sta_hw_scanning = 1;
-                       local->scan_dev = dev;
+                       local->scan_dev = scan_sdata->dev;
                }
                return rc;
        }
@@ -4086,7 +4105,7 @@ static int ieee80211_sta_start_scan(struct net_device *dev,
        local->scan_state = SCAN_SET_CHANNEL;
        local->scan_channel_idx = 0;
        local->scan_band = IEEE80211_BAND_2GHZ;
-       local->scan_dev = dev;
+       local->scan_dev = scan_sdata->dev;
 
        netif_addr_lock_bh(local->mdev);
        local->filter_flags |= FIF_BCN_PRBRESP_PROMISC;
@@ -4105,17 +4124,16 @@ static int ieee80211_sta_start_scan(struct net_device *dev,
 }
 
 
-int ieee80211_sta_req_scan(struct net_device *dev, u8 *ssid, size_t ssid_len)
+int ieee80211_sta_req_scan(struct ieee80211_sub_if_data *sdata, u8 *ssid, size_t ssid_len)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_if_sta *ifsta = &sdata->u.sta;
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
 
        if (sdata->vif.type != IEEE80211_IF_TYPE_STA)
-               return ieee80211_sta_start_scan(dev, ssid, ssid_len);
+               return ieee80211_sta_start_scan(sdata, ssid, ssid_len);
 
        if (local->sta_sw_scanning || local->sta_hw_scanning) {
-               if (local->scan_dev == dev)
+               if (local->scan_dev == sdata->dev)
                        return 0;
                return -EBUSY;
        }
@@ -4129,12 +4147,11 @@ int ieee80211_sta_req_scan(struct net_device *dev, u8 *ssid, size_t ssid_len)
 }
 
 static char *
-ieee80211_sta_scan_result(struct net_device *dev,
+ieee80211_sta_scan_result(struct ieee80211_local *local,
                          struct iw_request_info *info,
                          struct ieee80211_sta_bss *bss,
                          char *current_ev, char *end_buf)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
        struct iw_event iwe;
 
        if (time_after(jiffies,
@@ -4321,11 +4338,10 @@ ieee80211_sta_scan_result(struct net_device *dev,
 }
 
 
-int ieee80211_sta_scan_results(struct net_device *dev,
+int ieee80211_sta_scan_results(struct ieee80211_local *local,
                               struct iw_request_info *info,
                               char *buf, size_t len)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
        char *current_ev = buf;
        char *end_buf = buf + len;
        struct ieee80211_sta_bss *bss;
@@ -4336,7 +4352,7 @@ int ieee80211_sta_scan_results(struct net_device *dev,
                        spin_unlock_bh(&local->sta_bss_lock);
                        return -E2BIG;
                }
-               current_ev = ieee80211_sta_scan_result(dev, info, bss,
+               current_ev = ieee80211_sta_scan_result(local, info, bss,
                                                       current_ev, end_buf);
        }
        spin_unlock_bh(&local->sta_bss_lock);
@@ -4344,9 +4360,8 @@ int ieee80211_sta_scan_results(struct net_device *dev,
 }
 
 
-int ieee80211_sta_set_extra_ie(struct net_device *dev, char *ie, size_t len)
+int ieee80211_sta_set_extra_ie(struct ieee80211_sub_if_data *sdata, char *ie, size_t len)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_if_sta *ifsta = &sdata->u.sta;
 
        kfree(ifsta->extra_ie);
@@ -4366,13 +4381,12 @@ int ieee80211_sta_set_extra_ie(struct net_device *dev, char *ie, size_t len)
 }
 
 
-struct sta_info *ieee80211_ibss_add_sta(struct net_device *dev,
+struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
                                        struct sk_buff *skb, u8 *bssid,
                                        u8 *addr, u64 supp_rates)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sta_info *sta;
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        DECLARE_MAC_BUF(mac);
        int band = local->hw.conf.channel->band;
 
@@ -4381,7 +4395,7 @@ struct sta_info *ieee80211_ibss_add_sta(struct net_device *dev,
        if (local->num_sta >= IEEE80211_IBSS_MAX_STA_ENTRIES) {
                if (net_ratelimit()) {
                        printk(KERN_DEBUG "%s: No room for a new IBSS STA "
-                              "entry %s\n", dev->name, print_mac(mac, addr));
+                              "entry %s\n", sdata->dev->name, print_mac(mac, addr));
                }
                return NULL;
        }
@@ -4391,7 +4405,7 @@ struct sta_info *ieee80211_ibss_add_sta(struct net_device *dev,
 
 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
        printk(KERN_DEBUG "%s: Adding new IBSS station %s (dev=%s)\n",
-              wiphy_name(local->hw.wiphy), print_mac(mac, addr), dev->name);
+              wiphy_name(local->hw.wiphy), print_mac(mac, addr), sdata->dev->name);
 #endif
 
        sta = sta_info_alloc(sdata, addr, GFP_ATOMIC);
@@ -4414,31 +4428,29 @@ struct sta_info *ieee80211_ibss_add_sta(struct net_device *dev,
 }
 
 
-int ieee80211_sta_deauthenticate(struct net_device *dev, u16 reason)
+int ieee80211_sta_deauthenticate(struct ieee80211_sub_if_data *sdata, u16 reason)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_if_sta *ifsta = &sdata->u.sta;
 
        printk(KERN_DEBUG "%s: deauthenticating by local choice (reason=%d)\n",
-              dev->name, reason);
+              sdata->dev->name, reason);
 
        if (sdata->vif.type != IEEE80211_IF_TYPE_STA &&
            sdata->vif.type != IEEE80211_IF_TYPE_IBSS)
                return -EINVAL;
 
-       ieee80211_send_deauth(dev, ifsta, reason);
-       ieee80211_set_disassoc(dev, ifsta, 1);
+       ieee80211_send_deauth(sdata, ifsta, reason);
+       ieee80211_set_disassoc(sdata, ifsta, 1);
        return 0;
 }
 
 
-int ieee80211_sta_disassociate(struct net_device *dev, u16 reason)
+int ieee80211_sta_disassociate(struct ieee80211_sub_if_data *sdata, u16 reason)
 {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_if_sta *ifsta = &sdata->u.sta;
 
        printk(KERN_DEBUG "%s: disassociating by local choice (reason=%d)\n",
-              dev->name, reason);
+              sdata->dev->name, reason);
 
        if (sdata->vif.type != IEEE80211_IF_TYPE_STA)
                return -EINVAL;
@@ -4446,8 +4458,8 @@ int ieee80211_sta_disassociate(struct net_device *dev, u16 reason)
        if (!(ifsta->flags & IEEE80211_STA_ASSOCIATED))
                return -1;
 
-       ieee80211_send_disassoc(dev, ifsta, reason);
-       ieee80211_set_disassoc(dev, ifsta, 0);
+       ieee80211_send_disassoc(sdata, ifsta, reason);
+       ieee80211_set_disassoc(sdata, ifsta, 0);
        return 0;
 }
 
@@ -4464,7 +4476,7 @@ void ieee80211_notify_mac(struct ieee80211_hw *hw,
                        if (sdata->vif.type != IEEE80211_IF_TYPE_STA)
                                continue;
 
-                       ieee80211_sta_req_auth(sdata->dev, &sdata->u.sta);
+                       ieee80211_sta_req_auth(sdata, &sdata->u.sta);
                }
                rcu_read_unlock();
                break;
index 6db854505193ec178d60a657fa14534e8e5b25f5..fd83ef760a3748a974f2b1fdbaf9be4274a68b4b 100644 (file)
@@ -143,6 +143,8 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
        /* IEEE80211_RADIOTAP_FLAGS */
        if (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS)
                *pos |= IEEE80211_RADIOTAP_F_FCS;
+       if (status->flag & RX_FLAG_SHORTPRE)
+               *pos |= IEEE80211_RADIOTAP_F_SHORTPRE;
        pos++;
 
        /* IEEE80211_RADIOTAP_RATE */
@@ -155,8 +157,11 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
        if (status->band == IEEE80211_BAND_5GHZ)
                *(__le16 *)pos = cpu_to_le16(IEEE80211_CHAN_OFDM |
                                             IEEE80211_CHAN_5GHZ);
+       else if (rate->flags & IEEE80211_RATE_ERP_G)
+               *(__le16 *)pos = cpu_to_le16(IEEE80211_CHAN_OFDM |
+                                            IEEE80211_CHAN_2GHZ);
        else
-               *(__le16 *)pos = cpu_to_le16(IEEE80211_CHAN_DYN |
+               *(__le16 *)pos = cpu_to_le16(IEEE80211_CHAN_CCK |
                                             IEEE80211_CHAN_2GHZ);
        pos += 2;
 
@@ -399,11 +404,11 @@ ieee80211_rx_h_passive_scan(struct ieee80211_rx_data *rx)
        struct sk_buff *skb = rx->skb;
 
        if (unlikely(local->sta_hw_scanning))
-               return ieee80211_sta_rx_scan(rx->dev, skb, rx->status);
+               return ieee80211_sta_rx_scan(rx->sdata, skb, rx->status);
 
        if (unlikely(local->sta_sw_scanning)) {
                /* drop all the other packets during a software scan anyway */
-               if (ieee80211_sta_rx_scan(rx->dev, skb, rx->status)
+               if (ieee80211_sta_rx_scan(rx->sdata, skb, rx->status)
                    != RX_QUEUED)
                        dev_kfree_skb(skb);
                return RX_QUEUED;
@@ -461,7 +466,7 @@ ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx)
 
        if (ieee80211_is_data(hdr->frame_control) &&
            is_multicast_ether_addr(hdr->addr1) &&
-           mesh_rmc_check(hdr->addr4, msh_h_get(hdr, hdrlen), rx->dev))
+           mesh_rmc_check(hdr->addr4, msh_h_get(hdr, hdrlen), rx->sdata))
                return RX_DROP_MONITOR;
 #undef msh_h_get
 
@@ -816,7 +821,7 @@ ieee80211_reassemble_add(struct ieee80211_sub_if_data *sdata,
 
 static inline struct ieee80211_fragment_entry *
 ieee80211_reassemble_find(struct ieee80211_sub_if_data *sdata,
-                         u16 fc, unsigned int frag, unsigned int seq,
+                         unsigned int frag, unsigned int seq,
                          int rx_queue, struct ieee80211_hdr *hdr)
 {
        struct ieee80211_fragment_entry *entry;
@@ -825,7 +830,6 @@ ieee80211_reassemble_find(struct ieee80211_sub_if_data *sdata,
        idx = sdata->fragment_next;
        for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++) {
                struct ieee80211_hdr *f_hdr;
-               u16 f_fc;
 
                idx--;
                if (idx < 0)
@@ -837,10 +841,13 @@ ieee80211_reassemble_find(struct ieee80211_sub_if_data *sdata,
                    entry->last_frag + 1 != frag)
                        continue;
 
-               f_hdr = (struct ieee80211_hdr *) entry->skb_list.next->data;
-               f_fc = le16_to_cpu(f_hdr->frame_control);
+               f_hdr = (struct ieee80211_hdr *)entry->skb_list.next->data;
 
-               if ((fc & IEEE80211_FCTL_FTYPE) != (f_fc & IEEE80211_FCTL_FTYPE) ||
+               /*
+                * Check ftype and addresses are equal, else check next fragment
+                */
+               if (((hdr->frame_control ^ f_hdr->frame_control) &
+                    cpu_to_le16(IEEE80211_FCTL_FTYPE)) ||
                    compare_ether_addr(hdr->addr1, f_hdr->addr1) != 0 ||
                    compare_ether_addr(hdr->addr2, f_hdr->addr2) != 0)
                        continue;
@@ -860,16 +867,18 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 {
        struct ieee80211_hdr *hdr;
        u16 sc;
+       __le16 fc;
        unsigned int frag, seq;
        struct ieee80211_fragment_entry *entry;
        struct sk_buff *skb;
        DECLARE_MAC_BUF(mac);
 
-       hdr = (struct ieee80211_hdr *) rx->skb->data;
+       hdr = (struct ieee80211_hdr *)rx->skb->data;
+       fc = hdr->frame_control;
        sc = le16_to_cpu(hdr->seq_ctrl);
        frag = sc & IEEE80211_SCTL_FRAG;
 
-       if (likely((!(rx->fc & IEEE80211_FCTL_MOREFRAGS) && frag == 0) ||
+       if (likely((!ieee80211_has_morefrags(fc) && frag == 0) ||
                   (rx->skb)->len < 24 ||
                   is_multicast_ether_addr(hdr->addr1))) {
                /* not fragmented */
@@ -884,7 +893,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
                entry = ieee80211_reassemble_add(rx->sdata, frag, seq,
                                                 rx->queue, &(rx->skb));
                if (rx->key && rx->key->conf.alg == ALG_CCMP &&
-                   (rx->fc & IEEE80211_FCTL_PROTECTED)) {
+                   ieee80211_has_protected(fc)) {
                        /* Store CCMP PN so that we can verify that the next
                         * fragment has a sequential PN value. */
                        entry->ccmp = 1;
@@ -898,8 +907,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
        /* This is a fragment for a frame that should already be pending in
         * fragment cache. Add this fragment to the end of the pending entry.
         */
-       entry = ieee80211_reassemble_find(rx->sdata, rx->fc, frag, seq,
-                                         rx->queue, hdr);
+       entry = ieee80211_reassemble_find(rx->sdata, frag, seq, rx->queue, hdr);
        if (!entry) {
                I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag);
                return RX_DROP_MONITOR;
@@ -924,11 +932,11 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
                memcpy(entry->last_pn, pn, CCMP_PN_LEN);
        }
 
-       skb_pull(rx->skb, ieee80211_get_hdrlen(rx->fc));
+       skb_pull(rx->skb, ieee80211_hdrlen(fc));
        __skb_queue_tail(&entry->skb_list, rx->skb);
        entry->last_frag = frag;
        entry->extra_len += rx->skb->len;
-       if (rx->fc & IEEE80211_FCTL_MOREFRAGS) {
+       if (ieee80211_has_morefrags(fc)) {
                rx->skb = NULL;
                return RX_QUEUED;
        }
@@ -968,10 +976,9 @@ ieee80211_rx_h_ps_poll(struct ieee80211_rx_data *rx)
        struct sk_buff *skb;
        int no_pending_pkts;
        DECLARE_MAC_BUF(mac);
+       __le16 fc = ((struct ieee80211_hdr *)rx->skb->data)->frame_control;
 
-       if (likely(!rx->sta ||
-                  (rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_CTL ||
-                  (rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_PSPOLL ||
+       if (likely(!rx->sta || !ieee80211_is_pspoll(fc) ||
                   !(rx->flags & IEEE80211_RX_RA_MATCH)))
                return RX_CONTINUE;
 
@@ -1050,7 +1057,6 @@ ieee80211_rx_h_remove_qos_control(struct ieee80211_rx_data *rx)
                ieee80211_hdrlen(hdr->frame_control) - IEEE80211_QOS_CTL_LEN);
        hdr = (struct ieee80211_hdr *)skb_pull(rx->skb, IEEE80211_QOS_CTL_LEN);
        /* change frame type to non QOS */
-       rx->fc &= ~IEEE80211_STYPE_QOS_DATA;
        hdr->frame_control &= ~cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
 
        return RX_CONTINUE;
@@ -1067,7 +1073,7 @@ ieee80211_802_1x_port_control(struct ieee80211_rx_data *rx)
 }
 
 static int
-ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx)
+ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
 {
        /*
         * Pass through unencrypted frames if the hardware has
@@ -1077,9 +1083,8 @@ ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx)
                return 0;
 
        /* Drop unencrypted frames if key is set. */
-       if (unlikely(!(rx->fc & IEEE80211_FCTL_PROTECTED) &&
-                    (rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA &&
-                    (rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_NULLFUNC &&
+       if (unlikely(!ieee80211_has_protected(fc) &&
+                    !ieee80211_is_nullfunc(fc) &&
                     (rx->key || rx->sdata->drop_unencrypted)))
                return -EACCES;
 
@@ -1091,7 +1096,7 @@ ieee80211_data_to_8023(struct ieee80211_rx_data *rx)
 {
        struct net_device *dev = rx->dev;
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
-       u16 fc, hdrlen, ethertype;
+       u16 hdrlen, ethertype;
        u8 *payload;
        u8 dst[ETH_ALEN];
        u8 src[ETH_ALEN] __aligned(2);
@@ -1102,12 +1107,10 @@ ieee80211_data_to_8023(struct ieee80211_rx_data *rx)
        DECLARE_MAC_BUF(mac3);
        DECLARE_MAC_BUF(mac4);
 
-       fc = rx->fc;
-
-       if (unlikely(!WLAN_FC_DATA_PRESENT(fc)))
+       if (unlikely(!ieee80211_is_data_present(hdr->frame_control)))
                return -1;
 
-       hdrlen = ieee80211_get_hdrlen(fc);
+       hdrlen = ieee80211_hdrlen(hdr->frame_control);
 
        if (ieee80211_vif_is_mesh(&sdata->vif))
                hdrlen += ieee80211_get_mesh_hdrlen(
@@ -1122,41 +1125,28 @@ ieee80211_data_to_8023(struct ieee80211_rx_data *rx)
         *   1     0   BSSID SA    DA    n/a
         *   1     1   RA    TA    DA    SA
         */
+       memcpy(dst, ieee80211_get_DA(hdr), ETH_ALEN);
+       memcpy(src, ieee80211_get_SA(hdr), ETH_ALEN);
 
-       switch (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) {
-       case IEEE80211_FCTL_TODS:
-               /* BSSID SA DA */
-               memcpy(dst, hdr->addr3, ETH_ALEN);
-               memcpy(src, hdr->addr2, ETH_ALEN);
-
+       switch (hdr->frame_control &
+               cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) {
+       case __constant_cpu_to_le16(IEEE80211_FCTL_TODS):
                if (unlikely(sdata->vif.type != IEEE80211_IF_TYPE_AP &&
                             sdata->vif.type != IEEE80211_IF_TYPE_VLAN))
                        return -1;
                break;
-       case (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS):
-               /* RA TA DA SA */
-               memcpy(dst, hdr->addr3, ETH_ALEN);
-               memcpy(src, hdr->addr4, ETH_ALEN);
-
-                if (unlikely(sdata->vif.type != IEEE80211_IF_TYPE_WDS &&
+       case __constant_cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS):
+               if (unlikely(sdata->vif.type != IEEE80211_IF_TYPE_WDS &&
                             sdata->vif.type != IEEE80211_IF_TYPE_MESH_POINT))
                        return -1;
                break;
-       case IEEE80211_FCTL_FROMDS:
-               /* DA BSSID SA */
-               memcpy(dst, hdr->addr1, ETH_ALEN);
-               memcpy(src, hdr->addr3, ETH_ALEN);
-
+       case __constant_cpu_to_le16(IEEE80211_FCTL_FROMDS):
                if (sdata->vif.type != IEEE80211_IF_TYPE_STA ||
                    (is_multicast_ether_addr(dst) &&
                     !compare_ether_addr(src, dev->dev_addr)))
                        return -1;
                break;
-       case 0:
-               /* DA SA BSSID */
-               memcpy(dst, hdr->addr1, ETH_ALEN);
-               memcpy(src, hdr->addr2, ETH_ALEN);
-
+       case __constant_cpu_to_le16(0):
                if (sdata->vif.type != IEEE80211_IF_TYPE_IBSS)
                        return -1;
                break;
@@ -1193,7 +1183,7 @@ ieee80211_data_to_8023(struct ieee80211_rx_data *rx)
 /*
  * requires that rx->skb is a frame with ethernet header
  */
-static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx)
+static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx, __le16 fc)
 {
        static const u8 pae_group_addr[ETH_ALEN] __aligned(2)
                = { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x03 };
@@ -1209,7 +1199,7 @@ static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx)
                return true;
 
        if (ieee80211_802_1x_port_control(rx) ||
-           ieee80211_drop_unencrypted(rx))
+           ieee80211_drop_unencrypted(rx, fc))
                return false;
 
        return true;
@@ -1279,20 +1269,21 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
 {
        struct net_device *dev = rx->dev;
        struct ieee80211_local *local = rx->local;
-       u16 fc, ethertype;
+       u16 ethertype;
        u8 *payload;
        struct sk_buff *skb = rx->skb, *frame = NULL;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+       __le16 fc = hdr->frame_control;
        const struct ethhdr *eth;
        int remaining, err;
        u8 dst[ETH_ALEN];
        u8 src[ETH_ALEN];
        DECLARE_MAC_BUF(mac);
 
-       fc = rx->fc;
-       if (unlikely((fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA))
+       if (unlikely(!ieee80211_is_data(fc)))
                return RX_CONTINUE;
 
-       if (unlikely(!WLAN_FC_DATA_PRESENT(fc)))
+       if (unlikely(!ieee80211_is_data_present(fc)))
                return RX_DROP_MONITOR;
 
        if (!(rx->flags & IEEE80211_RX_AMSDU))
@@ -1374,7 +1365,7 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
                        memcpy(skb_push(frame, ETH_ALEN), dst, ETH_ALEN);
                }
 
-               if (!ieee80211_frame_allowed(rx)) {
+               if (!ieee80211_frame_allowed(rx, fc)) {
                        if (skb == frame) /* last frame */
                                return RX_DROP_UNUSABLE;
                        dev_kfree_skb(frame);
@@ -1448,21 +1439,21 @@ static ieee80211_rx_result debug_noinline
 ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
 {
        struct net_device *dev = rx->dev;
-       u16 fc;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
+       __le16 fc = hdr->frame_control;
        int err;
 
-       fc = rx->fc;
-       if (unlikely((fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA))
+       if (unlikely(!ieee80211_is_data(hdr->frame_control)))
                return RX_CONTINUE;
 
-       if (unlikely(!WLAN_FC_DATA_PRESENT(fc)))
+       if (unlikely(!ieee80211_is_data_present(hdr->frame_control)))
                return RX_DROP_MONITOR;
 
        err = ieee80211_data_to_8023(rx);
        if (unlikely(err))
                return RX_DROP_UNUSABLE;
 
-       if (!ieee80211_frame_allowed(rx))
+       if (!ieee80211_frame_allowed(rx, fc))
                return RX_DROP_MONITOR;
 
        rx->skb->dev = dev;
@@ -1532,7 +1523,7 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx)
             sdata->vif.type == IEEE80211_IF_TYPE_IBSS ||
             sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT) &&
            !(sdata->flags & IEEE80211_SDATA_USERSPACE_MLME))
-               ieee80211_sta_rx_mgmt(rx->dev, rx->skb, rx->status);
+               ieee80211_sta_rx_mgmt(sdata, rx->skb, rx->status);
        else
                return RX_DROP_MONITOR;
 
@@ -1579,7 +1570,7 @@ static void ieee80211_rx_michael_mic_report(struct net_device *dev,
            !ieee80211_is_auth(hdr->frame_control))
                goto ignore;
 
-       mac80211_ev_michael_mic_failure(rx->dev, keyidx, hdr);
+       mac80211_ev_michael_mic_failure(rx->sdata, keyidx, hdr);
  ignore:
        dev_kfree_skb(rx->skb);
        rx->skb = NULL;
@@ -1753,7 +1744,7 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata,
                        return 0;
                if (ieee80211_is_beacon(hdr->frame_control)) {
                        if (!rx->sta)
-                               rx->sta = ieee80211_ibss_add_sta(sdata->dev,
+                               rx->sta = ieee80211_ibss_add_sta(sdata,
                                                rx->skb, bssid, hdr->addr2,
                                                BIT(rx->status->rate_idx));
                        return 1;
@@ -1769,7 +1760,7 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata,
                                return 0;
                        rx->flags &= ~IEEE80211_RX_RA_MATCH;
                } else if (!rx->sta)
-                       rx->sta = ieee80211_ibss_add_sta(sdata->dev, rx->skb,
+                       rx->sta = ieee80211_ibss_add_sta(sdata, rx->skb,
                                                bssid, hdr->addr2,
                                                BIT(rx->status->rate_idx));
                break;
@@ -1827,23 +1818,20 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
        struct ieee80211_sub_if_data *sdata;
        struct ieee80211_hdr *hdr;
        struct ieee80211_rx_data rx;
-       u16 type;
        int prepares;
        struct ieee80211_sub_if_data *prev = NULL;
        struct sk_buff *skb_new;
        u8 *bssid;
 
-       hdr = (struct ieee80211_hdr *) skb->data;
+       hdr = (struct ieee80211_hdr *)skb->data;
        memset(&rx, 0, sizeof(rx));
        rx.skb = skb;
        rx.local = local;
 
        rx.status = status;
        rx.rate = rate;
-       rx.fc = le16_to_cpu(hdr->frame_control);
-       type = rx.fc & IEEE80211_FCTL_FTYPE;
 
-       if (type == IEEE80211_FTYPE_DATA || type == IEEE80211_FTYPE_MGMT)
+       if (ieee80211_is_data(hdr->frame_control) || ieee80211_is_mgmt(hdr->frame_control))
                local->dot11ReceivedFragmentCount++;
 
        rx.sta = sta_info_get(local, hdr->addr2);
@@ -1904,14 +1892,12 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
                                       prev->dev->name);
                        continue;
                }
-               rx.fc = le16_to_cpu(hdr->frame_control);
                ieee80211_invoke_rx_handlers(prev, &rx, skb_new);
                prev = sdata;
        }
-       if (prev) {
-               rx.fc = le16_to_cpu(hdr->frame_control);
+       if (prev)
                ieee80211_invoke_rx_handlers(prev, &rx, skb);
-       else
+       else
                dev_kfree_skb(skb);
 }
 
@@ -2080,7 +2066,7 @@ static u8 ieee80211_rx_reorder_ampdu(struct ieee80211_local *local,
        /* if this mpdu is fragmented - terminate rx aggregation session */
        sc = le16_to_cpu(hdr->seq_ctrl);
        if (sc & IEEE80211_SCTL_FRAG) {
-               ieee80211_sta_stop_rx_ba_session(sta->sdata->dev, sta->addr,
+               ieee80211_sta_stop_rx_ba_session(sta->sdata, sta->addr,
                        tid, 0, WLAN_REASON_QSTA_REQUIRE_SETUP);
                ret = 1;
                goto end_reorder;
index 4788f7b91f493fa64ae664bad13e69488fddba6a..c413d4836afecb24aca8120ceec0c780c38abf0d 100644 (file)
@@ -82,6 +82,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr,
        struct ieee80211_rate *txrate;
        struct ieee80211_local *local = tx->local;
        struct ieee80211_supported_band *sband;
+       struct ieee80211_hdr *hdr;
 
        sband = local->hw.wiphy->bands[tx->channel->band];
        txrate = &sband->bitrates[tx->rate_idx];
@@ -107,8 +108,8 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr,
         *   at the highest possible rate belonging to the PHY rates in the
         *   BSSBasicRateSet
         */
-
-       if ((tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) {
+       hdr = (struct ieee80211_hdr *)tx->skb->data;
+       if (ieee80211_is_ctl(hdr->frame_control)) {
                /* TODO: These control frames are not currently sent by
                 * 80211.o, but should they be implemented, this function
                 * needs to be updated to support duration field calculation.
@@ -213,9 +214,8 @@ static int inline is_ieee80211_device(struct net_device *dev,
 static ieee80211_tx_result debug_noinline
 ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
 {
-#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
+
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
-#endif /* CONFIG_MAC80211_VERBOSE_DEBUG */
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
        u32 sta_flags;
 
@@ -223,8 +223,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
                return TX_CONTINUE;
 
        if (unlikely(tx->local->sta_sw_scanning) &&
-           ((tx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT ||
-            (tx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_PROBE_REQ))
+           !ieee80211_is_probe_req(hdr->frame_control))
                return TX_DROP;
 
        if (tx->sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT)
@@ -238,7 +237,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
        if (likely(tx->flags & IEEE80211_TX_UNICAST)) {
                if (unlikely(!(sta_flags & WLAN_STA_ASSOC) &&
                             tx->sdata->vif.type != IEEE80211_IF_TYPE_IBSS &&
-                            (tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA)) {
+                            ieee80211_is_data(hdr->frame_control))) {
 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
                        DECLARE_MAC_BUF(mac);
                        printk(KERN_DEBUG "%s: dropped data frame to not "
@@ -249,7 +248,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
                        return TX_DROP;
                }
        } else {
-               if (unlikely((tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA &&
+               if (unlikely(ieee80211_is_data(hdr->frame_control) &&
                             tx->local->num_sta == 0 &&
                             tx->sdata->vif.type != IEEE80211_IF_TYPE_IBSS)) {
                        /*
@@ -315,6 +314,7 @@ static ieee80211_tx_result
 ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)
 {
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
 
        /*
         * broadcast/multicast frame
@@ -329,7 +329,7 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)
                return TX_CONTINUE;
 
        /* no buffering for ordered frames */
-       if (tx->fc & IEEE80211_FCTL_ORDER)
+       if (ieee80211_has_order(hdr->frame_control))
                return TX_CONTINUE;
 
        /* no stations in PS mode */
@@ -367,12 +367,11 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
 {
        struct sta_info *sta = tx->sta;
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
        u32 staflags;
        DECLARE_MAC_BUF(mac);
 
-       if (unlikely(!sta ||
-                    ((tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT &&
-                     (tx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP)))
+       if (unlikely(!sta || ieee80211_is_probe_resp(hdr->frame_control)))
                return TX_CONTINUE;
 
        staflags = get_sta_flags(sta);
@@ -437,7 +436,7 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
 {
        struct ieee80211_key *key;
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
-       u16 fc = tx->fc;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
 
        if (unlikely(tx->skb->do_not_encrypt))
                tx->key = NULL;
@@ -454,22 +453,16 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
                tx->key = NULL;
 
        if (tx->key) {
-               u16 ftype, stype;
-
                tx->key->tx_rx_count++;
                /* TODO: add threshold stuff again */
 
                switch (tx->key->conf.alg) {
                case ALG_WEP:
-                       ftype = fc & IEEE80211_FCTL_FTYPE;
-                       stype = fc & IEEE80211_FCTL_STYPE;
-
-                       if (ftype == IEEE80211_FTYPE_MGMT &&
-                           stype == IEEE80211_STYPE_AUTH)
+                       if (ieee80211_is_auth(hdr->frame_control))
                                break;
                case ALG_TKIP:
                case ALG_CCMP:
-                       if (!WLAN_FC_DATA_PRESENT(fc))
+                       if (!ieee80211_is_data_present(hdr->frame_control))
                                tx->key = NULL;
                        break;
                }
@@ -1000,7 +993,6 @@ __ieee80211_tx_prepare(struct ieee80211_tx_data *tx,
        hdr = (struct ieee80211_hdr *) skb->data;
 
        tx->sta = sta_info_get(local, hdr->addr1);
-       tx->fc = le16_to_cpu(hdr->frame_control);
 
        if (is_multicast_ether_addr(hdr->addr1)) {
                tx->flags &= ~IEEE80211_TX_UNICAST;
@@ -1025,7 +1017,7 @@ __ieee80211_tx_prepare(struct ieee80211_tx_data *tx,
        else if (test_and_clear_sta_flags(tx->sta, WLAN_STA_CLEAR_PS_FILT))
                info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT;
 
-       hdrlen = ieee80211_get_hdrlen(tx->fc);
+       hdrlen = ieee80211_hdrlen(hdr->frame_control);
        if (skb->len > hdrlen + sizeof(rfc1042_header) + 2) {
                u8 *pos = &skb->data[hdrlen + sizeof(rfc1042_header)];
                tx->ethertype = (pos[0] << 8) | pos[1];
@@ -1335,7 +1327,7 @@ int ieee80211_master_start_xmit(struct sk_buff *skb,
                        if (is_multicast_ether_addr(hdr->addr3))
                                memcpy(hdr->addr1, hdr->addr3, ETH_ALEN);
                        else
-                               if (mesh_nexthop_lookup(skb, odev))
+                               if (mesh_nexthop_lookup(skb, osdata))
                                        return  0;
                        if (memcmp(odev->dev_addr, hdr->addr4, ETH_ALEN) != 0)
                                IEEE80211_IFSTA_MESH_CTR_INC(&osdata->u.sta,
@@ -1889,8 +1881,8 @@ struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw,
                        goto out;
 
                hdr = (struct ieee80211_hdr *) skb->data;
-               hdr->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
-                                                 IEEE80211_STYPE_BEACON);
+               hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                                IEEE80211_STYPE_BEACON);
 
                num_beacons = &ifsta->num_beacons;
        } else if (ieee80211_vif_is_mesh(&sdata->vif)) {
@@ -1916,7 +1908,7 @@ struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw,
                *pos++ = WLAN_EID_SSID;
                *pos++ = 0x0;
 
-               mesh_mgmt_ies_add(skb, sdata->dev);
+               mesh_mgmt_ies_add(skb, sdata);
 
                num_beacons = &sdata->u.sta.num_beacons;
        } else {
index 0d463c80c4045359a8c8f0dc6df29903eae4f8a0..f40c060341aebd3fd82e85061980702f447857cc 100644 (file)
@@ -91,45 +91,6 @@ u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len,
        return NULL;
 }
 
-int ieee80211_get_hdrlen(u16 fc)
-{
-       int hdrlen = 24;
-
-       switch (fc & IEEE80211_FCTL_FTYPE) {
-       case IEEE80211_FTYPE_DATA:
-               if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS))
-                       hdrlen = 30; /* Addr4 */
-               /*
-                * The QoS Control field is two bytes and its presence is
-                * indicated by the IEEE80211_STYPE_QOS_DATA bit. Add 2 to
-                * hdrlen if that bit is set.
-                * This works by masking out the bit and shifting it to
-                * bit position 1 so the result has the value 0 or 2.
-                */
-               hdrlen += (fc & IEEE80211_STYPE_QOS_DATA)
-                               >> (ilog2(IEEE80211_STYPE_QOS_DATA)-1);
-               break;
-       case IEEE80211_FTYPE_CTL:
-               /*
-                * ACK and CTS are 10 bytes, all others 16. To see how
-                * to get this condition consider
-                *   subtype mask:   0b0000000011110000 (0x00F0)
-                *   ACK subtype:    0b0000000011010000 (0x00D0)
-                *   CTS subtype:    0b0000000011000000 (0x00C0)
-                *   bits that matter:         ^^^      (0x00E0)
-                *   value of those: 0b0000000011000000 (0x00C0)
-                */
-               if ((fc & 0xE0) == 0xC0)
-                       hdrlen = 10;
-               else
-                       hdrlen = 16;
-               break;
-       }
-
-       return hdrlen;
-}
-EXPORT_SYMBOL(ieee80211_get_hdrlen);
-
 unsigned int ieee80211_hdrlen(__le16 fc)
 {
        unsigned int hdrlen = 24;
@@ -386,6 +347,13 @@ void ieee80211_stop_queues(struct ieee80211_hw *hw)
 }
 EXPORT_SYMBOL(ieee80211_stop_queues);
 
+int ieee80211_queue_stopped(struct ieee80211_hw *hw, int queue)
+{
+       struct ieee80211_local *local = hw_to_local(hw);
+       return __netif_subqueue_stopped(local->mdev, queue);
+}
+EXPORT_SYMBOL(ieee80211_queue_stopped);
+
 void ieee80211_wake_queues(struct ieee80211_hw *hw)
 {
        int i;
index 5c2bf0a3d4db67a7e4c7a8c55a3b4cb997b86cdb..376c84987e4fdf8f7ff0a312c843c6974d20e0b6 100644 (file)
@@ -228,11 +228,10 @@ int ieee80211_wep_decrypt(struct ieee80211_local *local, struct sk_buff *skb,
                return -1;
 
        hdrlen = ieee80211_hdrlen(hdr->frame_control);
-
-       if (skb->len < 8 + hdrlen)
+       if (skb->len < hdrlen + WEP_IV_LEN + WEP_ICV_LEN)
                return -1;
 
-       len = skb->len - hdrlen - 8;
+       len = skb->len - hdrlen - WEP_IV_LEN - WEP_ICV_LEN;
 
        keyidx = skb->data[hdrlen + 3] >> 6;
 
@@ -292,9 +291,10 @@ u8 * ieee80211_wep_is_weak_iv(struct sk_buff *skb, struct ieee80211_key *key)
 ieee80211_rx_result
 ieee80211_crypto_wep_decrypt(struct ieee80211_rx_data *rx)
 {
-       if ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA &&
-           ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT ||
-            (rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_AUTH))
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
+
+       if (!ieee80211_is_data(hdr->frame_control) &&
+           !ieee80211_is_auth(hdr->frame_control))
                return RX_CONTINUE;
 
        if (!(rx->status->flag & RX_FLAG_DECRYPTED)) {
@@ -303,7 +303,7 @@ ieee80211_crypto_wep_decrypt(struct ieee80211_rx_data *rx)
        } else if (!(rx->status->flag & RX_FLAG_IV_STRIPPED)) {
                ieee80211_wep_remove_iv(rx->local, rx->skb, rx->key);
                /* remove ICV */
-               skb_trim(rx->skb, rx->skb->len - 4);
+               skb_trim(rx->skb, rx->skb->len - WEP_ICV_LEN);
        }
 
        return RX_CONTINUE;
index 34fa8ed1e784b4ec727a5d7f651ec5b105b53bb1..beae664ab4801eff2204b75cb404367f414a33d4 100644 (file)
 #include "aes_ccm.h"
 
 
-static int ieee80211_set_encryption(struct net_device *dev, u8 *sta_addr,
+static int ieee80211_set_encryption(struct ieee80211_sub_if_data *sdata, u8 *sta_addr,
                                    int idx, int alg, int remove,
                                    int set_tx_key, const u8 *_key,
                                    size_t key_len)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_local *local = sdata->local;
        struct sta_info *sta;
        struct ieee80211_key *key;
-       struct ieee80211_sub_if_data *sdata;
        int err;
 
-       sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-
        if (idx < 0 || idx >= NUM_DEFAULT_KEYS) {
                printk(KERN_DEBUG "%s: set_encrypt - invalid idx=%d\n",
-                      dev->name, idx);
+                      sdata->dev->name, idx);
                return -EINVAL;
        }
 
@@ -127,11 +124,11 @@ static int ieee80211_ioctl_siwgenie(struct net_device *dev,
 
        if (sdata->vif.type == IEEE80211_IF_TYPE_STA ||
            sdata->vif.type == IEEE80211_IF_TYPE_IBSS) {
-               int ret = ieee80211_sta_set_extra_ie(dev, extra, data->length);
+               int ret = ieee80211_sta_set_extra_ie(sdata, extra, data->length);
                if (ret)
                        return ret;
                sdata->u.sta.flags &= ~IEEE80211_STA_AUTO_BSSID_SEL;
-               ieee80211_sta_req_auth(dev, &sdata->u.sta);
+               ieee80211_sta_req_auth(sdata, &sdata->u.sta);
                return 0;
        }
 
@@ -333,12 +330,11 @@ static int ieee80211_ioctl_giwmode(struct net_device *dev,
        return 0;
 }
 
-int ieee80211_set_freq(struct net_device *dev, int freqMHz)
+int ieee80211_set_freq(struct ieee80211_sub_if_data *sdata, int freqMHz)
 {
        int ret = -EINVAL;
        struct ieee80211_channel *chan;
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+       struct ieee80211_local *local = sdata->local;
 
        chan = ieee80211_get_channel(local->hw.wiphy, freqMHz);
 
@@ -346,7 +342,7 @@ int ieee80211_set_freq(struct net_device *dev, int freqMHz)
                if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS &&
                    chan->flags & IEEE80211_CHAN_NO_IBSS) {
                        printk(KERN_DEBUG "%s: IBSS not allowed on frequency "
-                               "%d MHz\n", dev->name, chan->center_freq);
+                               "%d MHz\n", sdata->dev->name, chan->center_freq);
                        return ret;
                }
                local->oper_channel = chan;
@@ -379,14 +375,14 @@ static int ieee80211_ioctl_siwfreq(struct net_device *dev,
                                        IEEE80211_STA_AUTO_CHANNEL_SEL;
                        return 0;
                } else
-                       return ieee80211_set_freq(dev,
+                       return ieee80211_set_freq(sdata,
                                ieee80211_channel_to_frequency(freq->m));
        } else {
                int i, div = 1000000;
                for (i = 0; i < freq->e; i++)
                        div /= 10;
                if (div > 0)
-                       return ieee80211_set_freq(dev, freq->m / div);
+                       return ieee80211_set_freq(sdata, freq->m / div);
                else
                        return -EINVAL;
        }
@@ -432,10 +428,10 @@ static int ieee80211_ioctl_siwessid(struct net_device *dev,
                        sdata->u.sta.flags &= ~IEEE80211_STA_AUTO_SSID_SEL;
                else
                        sdata->u.sta.flags |= IEEE80211_STA_AUTO_SSID_SEL;
-               ret = ieee80211_sta_set_ssid(dev, ssid, len);
+               ret = ieee80211_sta_set_ssid(sdata, ssid, len);
                if (ret)
                        return ret;
-               ieee80211_sta_req_auth(dev, &sdata->u.sta);
+               ieee80211_sta_req_auth(sdata, &sdata->u.sta);
                return 0;
        }
 
@@ -460,7 +456,7 @@ static int ieee80211_ioctl_giwessid(struct net_device *dev,
        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        if (sdata->vif.type == IEEE80211_IF_TYPE_STA ||
            sdata->vif.type == IEEE80211_IF_TYPE_IBSS) {
-               int res = ieee80211_sta_get_ssid(dev, ssid, &len);
+               int res = ieee80211_sta_get_ssid(sdata, ssid, &len);
                if (res == 0) {
                        data->length = len;
                        data->flags = 1;
@@ -504,10 +500,10 @@ static int ieee80211_ioctl_siwap(struct net_device *dev,
                        sdata->u.sta.flags |= IEEE80211_STA_AUTO_BSSID_SEL;
                else
                        sdata->u.sta.flags &= ~IEEE80211_STA_AUTO_BSSID_SEL;
-               ret = ieee80211_sta_set_bssid(dev, (u8 *) &ap_addr->sa_data);
+               ret = ieee80211_sta_set_bssid(sdata, (u8 *) &ap_addr->sa_data);
                if (ret)
                        return ret;
-               ieee80211_sta_req_auth(dev, &sdata->u.sta);
+               ieee80211_sta_req_auth(sdata, &sdata->u.sta);
                return 0;
        } else if (sdata->vif.type == IEEE80211_IF_TYPE_WDS) {
                /*
@@ -539,8 +535,8 @@ static int ieee80211_ioctl_giwap(struct net_device *dev,
        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        if (sdata->vif.type == IEEE80211_IF_TYPE_STA ||
            sdata->vif.type == IEEE80211_IF_TYPE_IBSS) {
-               if (sdata->u.sta.state == IEEE80211_ASSOCIATED ||
-                   sdata->u.sta.state == IEEE80211_IBSS_JOINED) {
+               if (sdata->u.sta.state == IEEE80211_STA_MLME_ASSOCIATED ||
+                   sdata->u.sta.state == IEEE80211_STA_MLME_IBSS_JOINED) {
                        ap_addr->sa_family = ARPHRD_ETHER;
                        memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN);
                        return 0;
@@ -584,7 +580,7 @@ static int ieee80211_ioctl_siwscan(struct net_device *dev,
                ssid_len = req->essid_len;
        }
 
-       return ieee80211_sta_req_scan(dev, ssid, ssid_len);
+       return ieee80211_sta_req_scan(sdata, ssid, ssid_len);
 }
 
 
@@ -594,11 +590,14 @@ static int ieee80211_ioctl_giwscan(struct net_device *dev,
 {
        int res;
        struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
+       struct ieee80211_sub_if_data *sdata;
+
+       sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
        if (local->sta_sw_scanning || local->sta_hw_scanning)
                return -EAGAIN;
 
-       res = ieee80211_sta_scan_results(dev, info, extra, data->length);
+       res = ieee80211_sta_scan_results(local, info, extra, data->length);
        if (res >= 0) {
                data->length = res;
                return 0;
@@ -894,10 +893,10 @@ static int ieee80211_ioctl_siwmlme(struct net_device *dev,
        switch (mlme->cmd) {
        case IW_MLME_DEAUTH:
                /* TODO: mlme->addr.sa_data */
-               return ieee80211_sta_deauthenticate(dev, mlme->reason_code);
+               return ieee80211_sta_deauthenticate(sdata, mlme->reason_code);
        case IW_MLME_DISASSOC:
                /* TODO: mlme->addr.sa_data */
-               return ieee80211_sta_disassociate(dev, mlme->reason_code);
+               return ieee80211_sta_disassociate(sdata, mlme->reason_code);
        default:
                return -EOPNOTSUPP;
        }
@@ -938,7 +937,7 @@ static int ieee80211_ioctl_siwencode(struct net_device *dev,
        }
 
        return ieee80211_set_encryption(
-               dev, bcaddr,
+               sdata, bcaddr,
                idx, alg, remove,
                !sdata->default_key,
                keybuf, erq->length);
@@ -1184,7 +1183,7 @@ static int ieee80211_ioctl_siwencodeext(struct net_device *dev,
        } else
                idx--;
 
-       return ieee80211_set_encryption(dev, ext->addr.sa_data, idx, alg,
+       return ieee80211_set_encryption(sdata, ext->addr.sa_data, idx, alg,
                                        remove,
                                        ext->ext_flags &
                                        IW_ENCODE_EXT_SET_TX_KEY,
index 04de28c071a673f23301bb482ab949700d57c80c..465e274df7c5839b13c94aca249d9cb02d8445d5 100644 (file)
@@ -14,8 +14,6 @@
 #include <linux/netdevice.h>
 #include "ieee80211_i.h"
 
-#define QOS_CONTROL_LEN 2
-
 #define QOS_CONTROL_ACK_POLICY_NORMAL 0
 #define QOS_CONTROL_ACK_POLICY_NOACK 1
 
index 2f33df0dcccfb0f3a04b993d8d134bf7dbde45a9..78021780b8853c60c0d83a7aaf7900b9389b825c 100644 (file)
@@ -127,7 +127,7 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
                if (!(rx->flags & IEEE80211_RX_RA_MATCH))
                        return RX_DROP_UNUSABLE;
 
-               mac80211_ev_michael_mic_failure(rx->dev, rx->key->conf.keyidx,
+               mac80211_ev_michael_mic_failure(rx->sdata, rx->key->conf.keyidx,
                                                (void *) skb->data);
                return RX_DROP_UNUSABLE;
        }
index f63d05045685a6d36b02bd494b6d14d96a737ac3..bbfa646157c63a1668968bf90658f81ac3f976ad 100644 (file)
@@ -13,5 +13,6 @@
 
 void rfkill_switch_all(enum rfkill_type type, enum rfkill_state state);
 void rfkill_epo(void);
+void rfkill_restore_states(void);
 
 #endif /* __RFKILL_INPUT_H */
index 35a9994e23397e70b7f099b1bd573ed28c361512..47e0b2d232e30c120121e85e10e88902f86f4e52 100644 (file)
@@ -44,7 +44,13 @@ module_param_named(default_state, rfkill_default_state, uint, 0444);
 MODULE_PARM_DESC(default_state,
                 "Default initial state for all radio types, 0 = radio off");
 
-static enum rfkill_state rfkill_states[RFKILL_TYPE_MAX];
+struct rfkill_gsw_state {
+       enum rfkill_state current_state;
+       enum rfkill_state default_state;
+};
+
+static struct rfkill_gsw_state rfkill_global_states[RFKILL_TYPE_MAX];
+static unsigned long rfkill_states_lockdflt[BITS_TO_LONGS(RFKILL_TYPE_MAX)];
 
 static BLOCKING_NOTIFIER_HEAD(rfkill_notifier_list);
 
@@ -195,6 +201,8 @@ static int rfkill_toggle_radio(struct rfkill *rfkill,
                 * BLOCK even a transmitter that is already in state
                 * RFKILL_STATE_HARD_BLOCKED */
                break;
+       default:
+               return -EINVAL;
        }
 
        if (force || state != rfkill->state) {
@@ -213,22 +221,25 @@ static int rfkill_toggle_radio(struct rfkill *rfkill,
 }
 
 /**
- * rfkill_switch_all - Toggle state of all switches of given type
+ * __rfkill_switch_all - Toggle state of all switches of given type
  * @type: type of interfaces to be affected
  * @state: the new state
  *
  * This function toggles the state of all switches of given type,
  * unless a specific switch is claimed by userspace (in which case,
  * that switch is left alone) or suspended.
+ *
+ * Caller must have acquired rfkill_mutex.
  */
-void rfkill_switch_all(enum rfkill_type type, enum rfkill_state state)
+static void __rfkill_switch_all(const enum rfkill_type type,
+                               const enum rfkill_state state)
 {
        struct rfkill *rfkill;
 
-       mutex_lock(&rfkill_mutex);
-
-       rfkill_states[type] = state;
+       if (unlikely(state >= RFKILL_STATE_MAX))
+               return;
 
+       rfkill_global_states[type].current_state = state;
        list_for_each_entry(rfkill, &rfkill_list, node) {
                if ((!rfkill->user_claim) && (rfkill->type == type)) {
                        mutex_lock(&rfkill->mutex);
@@ -236,7 +247,20 @@ void rfkill_switch_all(enum rfkill_type type, enum rfkill_state state)
                        mutex_unlock(&rfkill->mutex);
                }
        }
+}
 
+/**
+ * rfkill_switch_all - Toggle state of all switches of given type
+ * @type: type of interfaces to be affected
+ * @state: the new state
+ *
+ * Acquires rfkill_mutex and calls __rfkill_switch_all(@type, @state).
+ * Please refer to __rfkill_switch_all() for details.
+ */
+void rfkill_switch_all(enum rfkill_type type, enum rfkill_state state)
+{
+       mutex_lock(&rfkill_mutex);
+       __rfkill_switch_all(type, state);
        mutex_unlock(&rfkill_mutex);
 }
 EXPORT_SYMBOL(rfkill_switch_all);
@@ -246,10 +270,14 @@ EXPORT_SYMBOL(rfkill_switch_all);
  *
  * This kicks all non-suspended rfkill devices to RFKILL_STATE_SOFT_BLOCKED,
  * ignoring everything in its path but rfkill_mutex and rfkill->mutex.
+ *
+ * The global state before the EPO is saved and can be restored later
+ * using rfkill_restore_states().
  */
 void rfkill_epo(void)
 {
        struct rfkill *rfkill;
+       int i;
 
        mutex_lock(&rfkill_mutex);
        list_for_each_entry(rfkill, &rfkill_list, node) {
@@ -257,10 +285,34 @@ void rfkill_epo(void)
                rfkill_toggle_radio(rfkill, RFKILL_STATE_SOFT_BLOCKED, 1);
                mutex_unlock(&rfkill->mutex);
        }
+       for (i = 0; i < RFKILL_TYPE_MAX; i++) {
+               rfkill_global_states[i].default_state =
+                               rfkill_global_states[i].current_state;
+               rfkill_global_states[i].current_state =
+                               RFKILL_STATE_SOFT_BLOCKED;
+       }
        mutex_unlock(&rfkill_mutex);
 }
 EXPORT_SYMBOL_GPL(rfkill_epo);
 
+/**
+ * rfkill_restore_states - restore global states
+ *
+ * Restore (and sync switches to) the global state from the
+ * states in rfkill_default_states.  This can undo the effects of
+ * a call to rfkill_epo().
+ */
+void rfkill_restore_states(void)
+{
+       int i;
+
+       mutex_lock(&rfkill_mutex);
+       for (i = 0; i < RFKILL_TYPE_MAX; i++)
+               __rfkill_switch_all(i, rfkill_global_states[i].default_state);
+       mutex_unlock(&rfkill_mutex);
+}
+EXPORT_SYMBOL_GPL(rfkill_restore_states);
+
 /**
  * rfkill_force_state - Force the internal rfkill radio state
  * @rfkill: pointer to the rfkill class to modify.
@@ -282,9 +334,7 @@ int rfkill_force_state(struct rfkill *rfkill, enum rfkill_state state)
 {
        enum rfkill_state oldstate;
 
-       if (state != RFKILL_STATE_SOFT_BLOCKED &&
-           state != RFKILL_STATE_UNBLOCKED &&
-           state != RFKILL_STATE_HARD_BLOCKED)
+       if (unlikely(state >= RFKILL_STATE_MAX))
                return -EINVAL;
 
        mutex_lock(&rfkill->mutex);
@@ -406,8 +456,8 @@ static ssize_t rfkill_claim_store(struct device *dev,
                if (!claim) {
                        mutex_lock(&rfkill->mutex);
                        rfkill_toggle_radio(rfkill,
-                                           rfkill_states[rfkill->type],
-                                           0);
+                                       rfkill_global_states[rfkill->type].current_state,
+                                       0);
                        mutex_unlock(&rfkill->mutex);
                }
                rfkill->user_claim = claim;
@@ -525,17 +575,53 @@ static struct class rfkill_class = {
        .dev_uevent     = rfkill_dev_uevent,
 };
 
+static int rfkill_check_duplicity(const struct rfkill *rfkill)
+{
+       struct rfkill *p;
+       unsigned long seen[BITS_TO_LONGS(RFKILL_TYPE_MAX)];
+
+       memset(seen, 0, sizeof(seen));
+
+       list_for_each_entry(p, &rfkill_list, node) {
+               if (p == rfkill) {
+                       WARN_ON(1);
+                       return -EEXIST;
+               }
+               set_bit(p->type, seen);
+       }
+
+       /* 0: first switch of its kind */
+       return test_bit(rfkill->type, seen);
+}
+
 static int rfkill_add_switch(struct rfkill *rfkill)
 {
+       int error;
+
        mutex_lock(&rfkill_mutex);
 
-       rfkill_toggle_radio(rfkill, rfkill_states[rfkill->type], 0);
+       error = rfkill_check_duplicity(rfkill);
+       if (error < 0)
+               goto unlock_out;
+
+       if (!error) {
+               /* lock default after first use */
+               set_bit(rfkill->type, rfkill_states_lockdflt);
+               rfkill_global_states[rfkill->type].current_state =
+                       rfkill_global_states[rfkill->type].default_state;
+       }
+
+       rfkill_toggle_radio(rfkill,
+                           rfkill_global_states[rfkill->type].current_state,
+                           0);
 
        list_add_tail(&rfkill->node, &rfkill_list);
 
+       error = 0;
+unlock_out:
        mutex_unlock(&rfkill_mutex);
 
-       return 0;
+       return error;
 }
 
 static void rfkill_remove_switch(struct rfkill *rfkill)
@@ -562,7 +648,8 @@ static void rfkill_remove_switch(struct rfkill *rfkill)
  * NOTE: If registration fails the structure shoudl be freed by calling
  * rfkill_free() otherwise rfkill_unregister() should be used.
  */
-struct rfkill *rfkill_allocate(struct device *parent, enum rfkill_type type)
+struct rfkill * __must_check rfkill_allocate(struct device *parent,
+                                            enum rfkill_type type)
 {
        struct rfkill *rfkill;
        struct device *dev;
@@ -633,7 +720,7 @@ static void rfkill_led_trigger_unregister(struct rfkill *rfkill)
  * structure needs to be registered. Immediately from registration the
  * switch driver should be able to service calls to toggle_radio.
  */
-int rfkill_register(struct rfkill *rfkill)
+int __must_check rfkill_register(struct rfkill *rfkill)
 {
        static atomic_t rfkill_no = ATOMIC_INIT(0);
        struct device *dev = &rfkill->dev;
@@ -643,6 +730,8 @@ int rfkill_register(struct rfkill *rfkill)
                return -EINVAL;
        if (rfkill->type >= RFKILL_TYPE_MAX)
                return -EINVAL;
+       if (rfkill->state >= RFKILL_STATE_MAX)
+               return -EINVAL;
 
        snprintf(dev->bus_id, sizeof(dev->bus_id),
                 "rfkill%ld", (long)atomic_inc_return(&rfkill_no) - 1);
@@ -683,6 +772,53 @@ void rfkill_unregister(struct rfkill *rfkill)
 }
 EXPORT_SYMBOL(rfkill_unregister);
 
+/**
+ * rfkill_set_default - set initial value for a switch type
+ * @type - the type of switch to set the default state of
+ * @state - the new default state for that group of switches
+ *
+ * Sets the initial state rfkill should use for a given type.
+ * The following initial states are allowed: RFKILL_STATE_SOFT_BLOCKED
+ * and RFKILL_STATE_UNBLOCKED.
+ *
+ * This function is meant to be used by platform drivers for platforms
+ * that can save switch state across power down/reboot.
+ *
+ * The default state for each switch type can be changed exactly once.
+ * After a switch of that type is registered, the default state cannot
+ * be changed anymore.  This guards against multiple drivers it the
+ * same platform trying to set the initial switch default state, which
+ * is not allowed.
+ *
+ * Returns -EPERM if the state has already been set once or is in use,
+ * so drivers likely want to either ignore or at most printk(KERN_NOTICE)
+ * if this function returns -EPERM.
+ *
+ * Returns 0 if the new default state was set, or an error if it
+ * could not be set.
+ */
+int rfkill_set_default(enum rfkill_type type, enum rfkill_state state)
+{
+       int error;
+
+       if (type >= RFKILL_TYPE_MAX ||
+           (state != RFKILL_STATE_SOFT_BLOCKED &&
+            state != RFKILL_STATE_UNBLOCKED))
+               return -EINVAL;
+
+       mutex_lock(&rfkill_mutex);
+
+       if (!test_and_set_bit(type, rfkill_states_lockdflt)) {
+               rfkill_global_states[type].default_state = state;
+               error = 0;
+       } else
+               error = -EPERM;
+
+       mutex_unlock(&rfkill_mutex);
+       return error;
+}
+EXPORT_SYMBOL_GPL(rfkill_set_default);
+
 /*
  * Rfkill module initialization/deinitialization.
  */
@@ -696,8 +832,8 @@ static int __init rfkill_init(void)
            rfkill_default_state != RFKILL_STATE_UNBLOCKED)
                return -EINVAL;
 
-       for (i = 0; i < ARRAY_SIZE(rfkill_states); i++)
-               rfkill_states[i] = rfkill_default_state;
+       for (i = 0; i < RFKILL_TYPE_MAX; i++)
+               rfkill_global_states[i].default_state = rfkill_default_state;
 
        error = class_register(&rfkill_class);
        if (error) {
index 9372ec41ce844b6c6a5b58f89b41e21459587263..45f442d7de4703e2c398a7bafb2338a94cf39075 100644 (file)
@@ -332,7 +332,7 @@ static struct qdisc_size_table *qdisc_get_stab(struct nlattr *opt)
        if (!s || tsize != s->tsize || (!tab && tsize > 0))
                return ERR_PTR(-EINVAL);
 
-       spin_lock_bh(&qdisc_stab_lock);
+       spin_lock(&qdisc_stab_lock);
 
        list_for_each_entry(stab, &qdisc_stab_list, list) {
                if (memcmp(&stab->szopts, s, sizeof(*s)))
@@ -340,11 +340,11 @@ static struct qdisc_size_table *qdisc_get_stab(struct nlattr *opt)
                if (tsize > 0 && memcmp(stab->data, tab, tsize * sizeof(u16)))
                        continue;
                stab->refcnt++;
-               spin_unlock_bh(&qdisc_stab_lock);
+               spin_unlock(&qdisc_stab_lock);
                return stab;
        }
 
-       spin_unlock_bh(&qdisc_stab_lock);
+       spin_unlock(&qdisc_stab_lock);
 
        stab = kmalloc(sizeof(*stab) + tsize * sizeof(u16), GFP_KERNEL);
        if (!stab)
@@ -355,9 +355,9 @@ static struct qdisc_size_table *qdisc_get_stab(struct nlattr *opt)
        if (tsize > 0)
                memcpy(stab->data, tab, tsize * sizeof(u16));
 
-       spin_lock_bh(&qdisc_stab_lock);
+       spin_lock(&qdisc_stab_lock);
        list_add_tail(&stab->list, &qdisc_stab_list);
-       spin_unlock_bh(&qdisc_stab_lock);
+       spin_unlock(&qdisc_stab_lock);
 
        return stab;
 }
@@ -367,14 +367,14 @@ void qdisc_put_stab(struct qdisc_size_table *tab)
        if (!tab)
                return;
 
-       spin_lock_bh(&qdisc_stab_lock);
+       spin_lock(&qdisc_stab_lock);
 
        if (--tab->refcnt == 0) {
                list_del(&tab->list);
                kfree(tab);
        }
 
-       spin_unlock_bh(&qdisc_stab_lock);
+       spin_unlock(&qdisc_stab_lock);
 }
 EXPORT_SYMBOL(qdisc_put_stab);
 
@@ -444,6 +444,10 @@ void qdisc_watchdog_schedule(struct qdisc_watchdog *wd, psched_time_t expires)
 {
        ktime_t time;
 
+       if (test_bit(__QDISC_STATE_DEACTIVATED,
+                    &qdisc_root_sleeping(wd->qdisc)->state))
+               return;
+
        wd->qdisc->flags |= TCQ_F_THROTTLED;
        time = ktime_set(0, 0);
        time = ktime_add_ns(time, PSCHED_US2NS(expires));
index 47ef492c4ff40ad23735aa6254885b503e094e2f..8fa90d68ec6d8ab2f7ac47efcd511e31553bece6 100644 (file)
@@ -521,6 +521,10 @@ static void cbq_ovl_delay(struct cbq_class *cl)
        struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
        psched_tdiff_t delay = cl->undertime - q->now;
 
+       if (test_bit(__QDISC_STATE_DEACTIVATED,
+                    &qdisc_root_sleeping(cl->qdisc)->state))
+               return;
+
        if (!cl->delayed) {
                psched_time_t sched = q->now;
                ktime_t expires;
index e39a0cdef1841748d2957f581e7a90d76cd49359..4c8d9f45ce0999b5141f7fb92a7ee4ab1b03ef99 100644 (file)
@@ -103,6 +103,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
 
                /* Initialize the CHUNKS parameter */
                auth_chunks->param_hdr.type = SCTP_PARAM_CHUNKS;
+               auth_chunks->param_hdr.length = htons(sizeof(sctp_paramhdr_t));
 
                /* If the Add-IP functionality is enabled, we must
                 * authenticate, ASCONF and ASCONF-ACK chunks
@@ -110,8 +111,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
                if (sctp_addip_enable) {
                        auth_chunks->chunks[0] = SCTP_CID_ASCONF;
                        auth_chunks->chunks[1] = SCTP_CID_ASCONF_ACK;
-                       auth_chunks->param_hdr.length =
-                                       htons(sizeof(sctp_paramhdr_t) + 2);
+                       auth_chunks->param_hdr.length += htons(2);
                }
        }
 
index dbb79adf8f3c0bab606f7141e96ae96dd29b3e4c..bb5c9ef130467320f0687eca3fc5702f6f17a59c 100644 (file)
@@ -3055,6 +3055,9 @@ static int sctp_setsockopt_auth_chunk(struct sock *sk,
 {
        struct sctp_authchunk val;
 
+       if (!sctp_auth_enable)
+               return -EACCES;
+
        if (optlen != sizeof(struct sctp_authchunk))
                return -EINVAL;
        if (copy_from_user(&val, optval, optlen))
@@ -3085,6 +3088,9 @@ static int sctp_setsockopt_hmac_ident(struct sock *sk,
        struct sctp_hmacalgo *hmacs;
        int err;
 
+       if (!sctp_auth_enable)
+               return -EACCES;
+
        if (optlen < sizeof(struct sctp_hmacalgo))
                return -EINVAL;
 
@@ -3123,6 +3129,9 @@ static int sctp_setsockopt_auth_key(struct sock *sk,
        struct sctp_association *asoc;
        int ret;
 
+       if (!sctp_auth_enable)
+               return -EACCES;
+
        if (optlen <= sizeof(struct sctp_authkey))
                return -EINVAL;
 
@@ -3160,6 +3169,9 @@ static int sctp_setsockopt_active_key(struct sock *sk,
        struct sctp_authkeyid val;
        struct sctp_association *asoc;
 
+       if (!sctp_auth_enable)
+               return -EACCES;
+
        if (optlen != sizeof(struct sctp_authkeyid))
                return -EINVAL;
        if (copy_from_user(&val, optval, optlen))
@@ -3185,6 +3197,9 @@ static int sctp_setsockopt_del_key(struct sock *sk,
        struct sctp_authkeyid val;
        struct sctp_association *asoc;
 
+       if (!sctp_auth_enable)
+               return -EACCES;
+
        if (optlen != sizeof(struct sctp_authkeyid))
                return -EINVAL;
        if (copy_from_user(&val, optval, optlen))
@@ -5197,19 +5212,29 @@ static int sctp_getsockopt_maxburst(struct sock *sk, int len,
 static int sctp_getsockopt_hmac_ident(struct sock *sk, int len,
                                    char __user *optval, int __user *optlen)
 {
+       struct sctp_hmacalgo  __user *p = (void __user *)optval;
        struct sctp_hmac_algo_param *hmacs;
-       __u16 param_len;
+       __u16 data_len = 0;
+       u32 num_idents;
+
+       if (!sctp_auth_enable)
+               return -EACCES;
 
        hmacs = sctp_sk(sk)->ep->auth_hmacs_list;
-       param_len = ntohs(hmacs->param_hdr.length);
+       data_len = ntohs(hmacs->param_hdr.length) - sizeof(sctp_paramhdr_t);
 
-       if (len < param_len)
+       if (len < sizeof(struct sctp_hmacalgo) + data_len)
                return -EINVAL;
+
+       len = sizeof(struct sctp_hmacalgo) + data_len;
+       num_idents = data_len / sizeof(u16);
+
        if (put_user(len, optlen))
                return -EFAULT;
-       if (copy_to_user(optval, hmacs->hmac_ids, len))
+       if (put_user(num_idents, &p->shmac_num_idents))
+               return -EFAULT;
+       if (copy_to_user(p->shmac_idents, hmacs->hmac_ids, data_len))
                return -EFAULT;
-
        return 0;
 }
 
@@ -5219,6 +5244,9 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len,
        struct sctp_authkeyid val;
        struct sctp_association *asoc;
 
+       if (!sctp_auth_enable)
+               return -EACCES;
+
        if (len < sizeof(struct sctp_authkeyid))
                return -EINVAL;
        if (copy_from_user(&val, optval, sizeof(struct sctp_authkeyid)))
@@ -5233,6 +5261,12 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len,
        else
                val.scact_keynumber = sctp_sk(sk)->ep->active_key_id;
 
+       len = sizeof(struct sctp_authkeyid);
+       if (put_user(len, optlen))
+               return -EFAULT;
+       if (copy_to_user(optval, &val, len))
+               return -EFAULT;
+
        return 0;
 }
 
@@ -5243,13 +5277,16 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
        struct sctp_authchunks val;
        struct sctp_association *asoc;
        struct sctp_chunks_param *ch;
-       u32    num_chunks;
+       u32    num_chunks = 0;
        char __user *to;
 
-       if (len <= sizeof(struct sctp_authchunks))
+       if (!sctp_auth_enable)
+               return -EACCES;
+
+       if (len < sizeof(struct sctp_authchunks))
                return -EINVAL;
 
-       if (copy_from_user(&val, p, sizeof(struct sctp_authchunks)))
+       if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
                return -EFAULT;
 
        to = p->gauth_chunks;
@@ -5258,20 +5295,21 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
                return -EINVAL;
 
        ch = asoc->peer.peer_chunks;
+       if (!ch)
+               goto num;
 
        /* See if the user provided enough room for all the data */
        num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t);
        if (len < num_chunks)
                return -EINVAL;
 
-       len = num_chunks;
-       if (put_user(len, optlen))
+       if (copy_to_user(to, ch->chunks, num_chunks))
                return -EFAULT;
+num:
+       len = sizeof(struct sctp_authchunks) + num_chunks;
+       if (put_user(len, optlen)) return -EFAULT;
        if (put_user(num_chunks, &p->gauth_number_of_chunks))
                return -EFAULT;
-       if (copy_to_user(to, ch->chunks, len))
-               return -EFAULT;
-
        return 0;
 }
 
@@ -5282,13 +5320,16 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
        struct sctp_authchunks val;
        struct sctp_association *asoc;
        struct sctp_chunks_param *ch;
-       u32    num_chunks;
+       u32    num_chunks = 0;
        char __user *to;
 
-       if (len <= sizeof(struct sctp_authchunks))
+       if (!sctp_auth_enable)
+               return -EACCES;
+
+       if (len < sizeof(struct sctp_authchunks))
                return -EINVAL;
 
-       if (copy_from_user(&val, p, sizeof(struct sctp_authchunks)))
+       if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
                return -EFAULT;
 
        to = p->gauth_chunks;
@@ -5301,17 +5342,21 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
        else
                ch = sctp_sk(sk)->ep->auth_chunk_list;
 
+       if (!ch)
+               goto num;
+
        num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t);
-       if (len < num_chunks)
+       if (len < sizeof(struct sctp_authchunks) + num_chunks)
                return -EINVAL;
 
-       len = num_chunks;
+       if (copy_to_user(to, ch->chunks, num_chunks))
+               return -EFAULT;
+num:
+       len = sizeof(struct sctp_authchunks) + num_chunks;
        if (put_user(len, optlen))
                return -EFAULT;
        if (put_user(num_chunks, &p->gauth_number_of_chunks))
                return -EFAULT;
-       if (copy_to_user(to, ch->chunks, len))
-               return -EFAULT;
 
        return 0;
 }
index 63d10da515a5b01e9cf36a2f7b2a49e82b10d199..2458748190361328b3862092c82563fbb587bcf1 100644 (file)
@@ -811,7 +811,8 @@ struct security_operations default_security_ops = {
 
 void security_fixup_ops(struct security_operations *ops)
 {
-       set_to_cap_if_null(ops, ptrace);
+       set_to_cap_if_null(ops, ptrace_may_access);
+       set_to_cap_if_null(ops, ptrace_traceme);
        set_to_cap_if_null(ops, capget);
        set_to_cap_if_null(ops, capset_check);
        set_to_cap_if_null(ops, capset_set);
index 4afbece37a086af337be9f3b8566a11843092ee3..e4c4b3fc0c04e49e553610a8bd4d433e55e9212a 100644 (file)
@@ -63,14 +63,24 @@ int cap_settime(struct timespec *ts, struct timezone *tz)
        return 0;
 }
 
-int cap_ptrace (struct task_struct *parent, struct task_struct *child,
-               unsigned int mode)
+int cap_ptrace_may_access(struct task_struct *child, unsigned int mode)
 {
        /* Derived from arch/i386/kernel/ptrace.c:sys_ptrace. */
-       if (!cap_issubset(child->cap_permitted, parent->cap_permitted) &&
-           !__capable(parent, CAP_SYS_PTRACE))
-               return -EPERM;
-       return 0;
+       if (cap_issubset(child->cap_permitted, current->cap_permitted))
+               return 0;
+       if (capable(CAP_SYS_PTRACE))
+               return 0;
+       return -EPERM;
+}
+
+int cap_ptrace_traceme(struct task_struct *parent)
+{
+       /* Derived from arch/i386/kernel/ptrace.c:sys_ptrace. */
+       if (cap_issubset(current->cap_permitted, parent->cap_permitted))
+               return 0;
+       if (has_capability(parent, CAP_SYS_PTRACE))
+               return 0;
+       return -EPERM;
 }
 
 int cap_capget (struct task_struct *target, kernel_cap_t *effective,
@@ -534,7 +544,7 @@ int cap_task_post_setuid (uid_t old_ruid, uid_t old_euid, uid_t old_suid,
 static inline int cap_safe_nice(struct task_struct *p)
 {
        if (!cap_issubset(p->cap_permitted, current->cap_permitted) &&
-           !__capable(current, CAP_SYS_NICE))
+           !capable(CAP_SYS_NICE))
                return -EPERM;
        return 0;
 }
index be0ebec2580b14165f24f9cbc9fac3778b73b15b..c3f68b5b372d31c74e7f3bbb8e5fbfc737b25cab 100644 (file)
@@ -72,7 +72,8 @@ static int rootplug_bprm_check_security (struct linux_binprm *bprm)
 
 static struct security_operations rootplug_security_ops = {
        /* Use the capability functions for some of the hooks */
-       .ptrace =                       cap_ptrace,
+       .ptrace_may_access =            cap_ptrace_may_access,
+       .ptrace_traceme =               cap_ptrace_traceme,
        .capget =                       cap_capget,
        .capset_check =                 cap_capset_check,
        .capset_set =                   cap_capset_set,
index ff7068727757639149501937043766d2199a8228..3a4b4f55b33f373d5a85145d61e6de95cce4bf3c 100644 (file)
@@ -127,10 +127,14 @@ int register_security(struct security_operations *ops)
 
 /* Security operations */
 
-int security_ptrace(struct task_struct *parent, struct task_struct *child,
-                   unsigned int mode)
+int security_ptrace_may_access(struct task_struct *child, unsigned int mode)
 {
-       return security_ops->ptrace(parent, child, mode);
+       return security_ops->ptrace_may_access(child, mode);
+}
+
+int security_ptrace_traceme(struct task_struct *parent)
+{
+       return security_ops->ptrace_traceme(parent);
 }
 
 int security_capget(struct task_struct *target,
index 3ae9bec5a5088ba62eab619cae7e7664151a522b..03fc6a81ae32bd783ddd96eca85f118a2ba79bd8 100644 (file)
@@ -1738,24 +1738,34 @@ static inline u32 file_to_av(struct file *file)
 
 /* Hook functions begin here. */
 
-static int selinux_ptrace(struct task_struct *parent,
-                         struct task_struct *child,
-                         unsigned int mode)
+static int selinux_ptrace_may_access(struct task_struct *child,
+                                    unsigned int mode)
 {
        int rc;
 
-       rc = secondary_ops->ptrace(parent, child, mode);
+       rc = secondary_ops->ptrace_may_access(child, mode);
        if (rc)
                return rc;
 
        if (mode == PTRACE_MODE_READ) {
-               struct task_security_struct *tsec = parent->security;
+               struct task_security_struct *tsec = current->security;
                struct task_security_struct *csec = child->security;
                return avc_has_perm(tsec->sid, csec->sid,
                                    SECCLASS_FILE, FILE__READ, NULL);
        }
 
-       return task_has_perm(parent, child, PROCESS__PTRACE);
+       return task_has_perm(current, child, PROCESS__PTRACE);
+}
+
+static int selinux_ptrace_traceme(struct task_struct *parent)
+{
+       int rc;
+
+       rc = secondary_ops->ptrace_traceme(parent);
+       if (rc)
+               return rc;
+
+       return task_has_perm(parent, current, PROCESS__PTRACE);
 }
 
 static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
@@ -5346,7 +5356,8 @@ static int selinux_key_getsecurity(struct key *key, char **_buffer)
 static struct security_operations selinux_ops = {
        .name =                         "selinux",
 
-       .ptrace =                       selinux_ptrace,
+       .ptrace_may_access =            selinux_ptrace_may_access,
+       .ptrace_traceme =               selinux_ptrace_traceme,
        .capget =                       selinux_capget,
        .capset_check =                 selinux_capset_check,
        .capset_set =                   selinux_capset_set,
index 1b40e558f98329a718a76c7a4b4458380a63057e..87d75417ea937e7756678fd381c3cb96c9d1c7a5 100644 (file)
@@ -87,27 +87,46 @@ struct inode_smack *new_inode_smack(char *smack)
  */
 
 /**
- * smack_ptrace - Smack approval on ptrace
- * @ptp: parent task pointer
+ * smack_ptrace_may_access - Smack approval on PTRACE_ATTACH
  * @ctp: child task pointer
  *
  * Returns 0 if access is OK, an error code otherwise
  *
  * Do the capability checks, and require read and write.
  */
-static int smack_ptrace(struct task_struct *ptp, struct task_struct *ctp,
-                       unsigned int mode)
+static int smack_ptrace_may_access(struct task_struct *ctp, unsigned int mode)
 {
        int rc;
 
-       rc = cap_ptrace(ptp, ctp, mode);
+       rc = cap_ptrace_may_access(ctp, mode);
        if (rc != 0)
                return rc;
 
-       rc = smk_access(ptp->security, ctp->security, MAY_READWRITE);
-       if (rc != 0 && __capable(ptp, CAP_MAC_OVERRIDE))
+       rc = smk_access(current->security, ctp->security, MAY_READWRITE);
+       if (rc != 0 && capable(CAP_MAC_OVERRIDE))
                return 0;
+       return rc;
+}
+
+/**
+ * smack_ptrace_traceme - Smack approval on PTRACE_TRACEME
+ * @ptp: parent task pointer
+ *
+ * Returns 0 if access is OK, an error code otherwise
+ *
+ * Do the capability checks, and require read and write.
+ */
+static int smack_ptrace_traceme(struct task_struct *ptp)
+{
+       int rc;
+
+       rc = cap_ptrace_traceme(ptp);
+       if (rc != 0)
+               return rc;
 
+       rc = smk_access(ptp->security, current->security, MAY_READWRITE);
+       if (rc != 0 && has_capability(ptp, CAP_MAC_OVERRIDE))
+               return 0;
        return rc;
 }
 
@@ -923,7 +942,7 @@ static int smack_file_send_sigiotask(struct task_struct *tsk,
         */
        file = container_of(fown, struct file, f_owner);
        rc = smk_access(file->f_security, tsk->security, MAY_WRITE);
-       if (rc != 0 && __capable(tsk, CAP_MAC_OVERRIDE))
+       if (rc != 0 && has_capability(tsk, CAP_MAC_OVERRIDE))
                return 0;
        return rc;
 }
@@ -1164,12 +1183,12 @@ static int smack_task_wait(struct task_struct *p)
         * account for the smack labels having gotten to
         * be different in the first place.
         *
-        * This breaks the strict subjet/object access
+        * This breaks the strict subject/object access
         * control ideal, taking the object's privilege
         * state into account in the decision as well as
         * the smack value.
         */
-       if (capable(CAP_MAC_OVERRIDE) || __capable(p, CAP_MAC_OVERRIDE))
+       if (capable(CAP_MAC_OVERRIDE) || has_capability(p, CAP_MAC_OVERRIDE))
                return 0;
 
        return rc;
@@ -2016,9 +2035,6 @@ static int smack_setprocattr(struct task_struct *p, char *name,
 {
        char *newsmack;
 
-       if (!__capable(p, CAP_MAC_ADMIN))
-               return -EPERM;
-
        /*
         * Changing another process' Smack value is too dangerous
         * and supports no sane use case.
@@ -2026,6 +2042,9 @@ static int smack_setprocattr(struct task_struct *p, char *name,
        if (p != current)
                return -EPERM;
 
+       if (!capable(CAP_MAC_ADMIN))
+               return -EPERM;
+
        if (value == NULL || size == 0 || size >= SMK_LABELLEN)
                return -EINVAL;
 
@@ -2552,7 +2571,8 @@ static void smack_release_secctx(char *secdata, u32 seclen)
 struct security_operations smack_ops = {
        .name =                         "smack",
 
-       .ptrace =                       smack_ptrace,
+       .ptrace_may_access =            smack_ptrace_may_access,
+       .ptrace_traceme =               smack_ptrace_traceme,
        .capget =                       cap_capget,
        .capset_check =                 cap_capset_check,
        .capset_set =                   cap_capset_set,
@@ -2729,4 +2749,3 @@ static __init int smack_init(void)
  * all processes and objects when they are created.
  */
 security_initcall(smack_init);
-
index f7d95b224a988ee8c1b1dccc17d8c453f55c10ef..31f52d3fc21f9bce9793b316b2228ad23414faa3 100644 (file)
@@ -845,7 +845,7 @@ config SND_VIRTUOSO
        select SND_OXYGEN_LIB
        help
          Say Y here to include support for sound cards based on the
-         Asus AV100/AV200 chips, i.e., Xonar D2, DX and D2X.
+         Asus AV100/AV200 chips, i.e., Xonar D1, DX, D2 and D2X.
 
          To compile this driver as a module, choose M here: the module
          will be called snd-virtuoso.
index add4e87e0b203a6ff8d9a52705158622550d6d79..b80e725432f047aaa9ab7b3016b27454bdc2daae 100644 (file)
@@ -6437,6 +6437,39 @@ static void alc882_auto_init_analog_input(struct hda_codec *codec)
        }
 }
 
+static void alc882_auto_init_input_src(struct hda_codec *codec)
+{
+       struct alc_spec *spec = codec->spec;
+       const struct hda_input_mux *imux = spec->input_mux;
+       int c;
+
+       for (c = 0; c < spec->num_adc_nids; c++) {
+               hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
+               hda_nid_t nid = spec->capsrc_nids[c];
+               int conns, mute, idx, item;
+
+               conns = snd_hda_get_connections(codec, nid, conn_list,
+                                               ARRAY_SIZE(conn_list));
+               if (conns < 0)
+                       continue;
+               for (idx = 0; idx < conns; idx++) {
+                       /* if the current connection is the selected one,
+                        * unmute it as default - otherwise mute it
+                        */
+                       mute = AMP_IN_MUTE(idx);
+                       for (item = 0; item < imux->num_items; item++) {
+                               if (imux->items[item].index == idx) {
+                                       if (spec->cur_mux[c] == item)
+                                               mute = AMP_IN_UNMUTE(idx);
+                                       break;
+                               }
+                       }
+                       snd_hda_codec_write(codec, nid, 0,
+                                           AC_VERB_SET_AMP_GAIN_MUTE, mute);
+               }
+       }
+}
+
 /* add mic boosts if needed */
 static int alc_auto_add_mic_boost(struct hda_codec *codec)
 {
@@ -6491,6 +6524,7 @@ static void alc882_auto_init(struct hda_codec *codec)
        alc882_auto_init_multi_out(codec);
        alc882_auto_init_hp_out(codec);
        alc882_auto_init_analog_input(codec);
+       alc882_auto_init_input_src(codec);
        if (spec->unsol_event)
                alc_sku_automute(codec);
 }
@@ -8285,6 +8319,8 @@ static void alc883_auto_init_analog_input(struct hda_codec *codec)
        }
 }
 
+#define alc883_auto_init_input_src     alc882_auto_init_input_src
+
 /* almost identical with ALC880 parser... */
 static int alc883_parse_auto_config(struct hda_codec *codec)
 {
@@ -8315,6 +8351,7 @@ static void alc883_auto_init(struct hda_codec *codec)
        alc883_auto_init_multi_out(codec);
        alc883_auto_init_hp_out(codec);
        alc883_auto_init_analog_input(codec);
+       alc883_auto_init_input_src(codec);
        if (spec->unsol_event)
                alc_sku_automute(codec);
 }
@@ -9663,6 +9700,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec)
 #define alc262_auto_init_multi_out     alc882_auto_init_multi_out
 #define alc262_auto_init_hp_out                alc882_auto_init_hp_out
 #define alc262_auto_init_analog_input  alc882_auto_init_analog_input
+#define alc262_auto_init_input_src     alc882_auto_init_input_src
 
 
 /* init callback for auto-configuration model -- overriding the default init */
@@ -9672,6 +9710,7 @@ static void alc262_auto_init(struct hda_codec *codec)
        alc262_auto_init_multi_out(codec);
        alc262_auto_init_hp_out(codec);
        alc262_auto_init_analog_input(codec);
+       alc262_auto_init_input_src(codec);
        if (spec->unsol_event)
                alc_sku_automute(codec);
 }
@@ -13330,6 +13369,8 @@ static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
        }
 }
 
+#define alc861vd_auto_init_input_src   alc882_auto_init_input_src
+
 #define alc861vd_idx_to_mixer_vol(nid)         ((nid) + 0x02)
 #define alc861vd_idx_to_mixer_switch(nid)      ((nid) + 0x0c)
 
@@ -13512,6 +13553,7 @@ static void alc861vd_auto_init(struct hda_codec *codec)
        alc861vd_auto_init_multi_out(codec);
        alc861vd_auto_init_hp_out(codec);
        alc861vd_auto_init_analog_input(codec);
+       alc861vd_auto_init_input_src(codec);
        if (spec->unsol_event)
                alc_sku_automute(codec);
 }
@@ -14677,6 +14719,8 @@ static void alc662_auto_init_analog_input(struct hda_codec *codec)
        }
 }
 
+#define alc662_auto_init_input_src     alc882_auto_init_input_src
+
 static int alc662_parse_auto_config(struct hda_codec *codec)
 {
        struct alc_spec *spec = codec->spec;
@@ -14733,6 +14777,7 @@ static void alc662_auto_init(struct hda_codec *codec)
        alc662_auto_init_multi_out(codec);
        alc662_auto_init_hp_out(codec);
        alc662_auto_init_analog_input(codec);
+       alc662_auto_init_input_src(codec);
        if (spec->unsol_event)
                alc_sku_automute(codec);
 }
index 9a2c16bf94e0479ab359640808f829e1950b7d09..01d7b75f91828144f16c33b4ce81fb4e47ce7438 100644 (file)
  */
 
 /*
- * Xonar DX
- * --------
+ * Xonar D1/DX
+ * -----------
  *
  * CMI8788:
  *
  * I²C <-> CS4398 (front)
  *     <-> CS4362A (surround, center/LFE, back)
  *
- * GPI 0 <- external power present
+ * GPI 0 <- external power present (DX only)
  *
  * GPIO 0 -> enable output to speakers
  * GPIO 1 -> enable front panel I/O
@@ -96,6 +96,7 @@ MODULE_PARM_DESC(enable, "enable card");
 enum {
        MODEL_D2,
        MODEL_D2X,
+       MODEL_D1,
        MODEL_DX,
 };
 
@@ -103,6 +104,7 @@ static struct pci_device_id xonar_ids[] __devinitdata = {
        { OXYGEN_PCI_SUBID(0x1043, 0x8269), .driver_data = MODEL_D2 },
        { OXYGEN_PCI_SUBID(0x1043, 0x8275), .driver_data = MODEL_DX },
        { OXYGEN_PCI_SUBID(0x1043, 0x82b7), .driver_data = MODEL_D2X },
+       { OXYGEN_PCI_SUBID(0x1043, 0x834f), .driver_data = MODEL_D1 },
        { }
 };
 MODULE_DEVICE_TABLE(pci, xonar_ids);
@@ -313,15 +315,12 @@ static void cs43xx_init(struct oxygen *chip)
        cs4362a_write(chip, 0x01, CS4362A_CPEN);
 }
 
-static void xonar_dx_init(struct oxygen *chip)
+static void xonar_d1_init(struct oxygen *chip)
 {
        struct xonar_data *data = chip->model_data;
 
        data->anti_pop_delay = 800;
        data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE;
-       data->ext_power_reg = OXYGEN_GPI_DATA;
-       data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
-       data->ext_power_bit = GPI_DX_EXT_POWER;
        data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST;
        data->cs4362a_fm = CS4362A_FM_SINGLE |
                CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L;
@@ -345,6 +344,16 @@ static void xonar_dx_init(struct oxygen *chip)
        snd_component_add(chip->card, "CS5361");
 }
 
+static void xonar_dx_init(struct oxygen *chip)
+{
+       struct xonar_data *data = chip->model_data;
+
+       data->ext_power_reg = OXYGEN_GPI_DATA;
+       data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
+       data->ext_power_bit = GPI_DX_EXT_POWER;
+       xonar_d1_init(chip);
+}
+
 static void xonar_cleanup(struct oxygen *chip)
 {
        struct xonar_data *data = chip->model_data;
@@ -352,7 +361,7 @@ static void xonar_cleanup(struct oxygen *chip)
        oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, data->output_enable_bit);
 }
 
-static void xonar_dx_cleanup(struct oxygen *chip)
+static void xonar_d1_cleanup(struct oxygen *chip)
 {
        xonar_cleanup(chip);
        cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN);
@@ -365,7 +374,7 @@ static void xonar_d2_resume(struct oxygen *chip)
        xonar_enable_output(chip);
 }
 
-static void xonar_dx_resume(struct oxygen *chip)
+static void xonar_d1_resume(struct oxygen *chip)
 {
        cs43xx_init(chip);
        xonar_enable_output(chip);
@@ -513,7 +522,7 @@ static const struct snd_kcontrol_new front_panel_switch = {
        .put = front_panel_put,
 };
 
-static void xonar_dx_ac97_switch(struct oxygen *chip,
+static void xonar_d1_ac97_switch(struct oxygen *chip,
                                 unsigned int reg, unsigned int mute)
 {
        if (reg == AC97_LINE) {
@@ -536,7 +545,7 @@ static int xonar_d2_control_filter(struct snd_kcontrol_new *template)
        return 0;
 }
 
-static int xonar_dx_control_filter(struct snd_kcontrol_new *template)
+static int xonar_d1_control_filter(struct snd_kcontrol_new *template)
 {
        if (!strncmp(template->name, "CD Capture ", 11))
                return 1; /* no CD input */
@@ -548,7 +557,7 @@ static int xonar_mixer_init(struct oxygen *chip)
        return snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip));
 }
 
-static int xonar_dx_mixer_init(struct oxygen *chip)
+static int xonar_d1_mixer_init(struct oxygen *chip)
 {
        return snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip));
 }
@@ -615,23 +624,51 @@ static const struct oxygen_model xonar_models[] = {
                .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
                .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
        },
+       [MODEL_D1] = {
+               .shortname = "Xonar D1",
+               .longname = "Asus Virtuoso 100",
+               .chip = "AV200",
+               .owner = THIS_MODULE,
+               .init = xonar_d1_init,
+               .control_filter = xonar_d1_control_filter,
+               .mixer_init = xonar_d1_mixer_init,
+               .cleanup = xonar_d1_cleanup,
+               .suspend = xonar_d1_cleanup,
+               .resume = xonar_d1_resume,
+               .set_dac_params = set_cs43xx_params,
+               .set_adc_params = set_cs53x1_params,
+               .update_dac_volume = update_cs43xx_volume,
+               .update_dac_mute = update_cs43xx_mute,
+               .ac97_switch = xonar_d1_ac97_switch,
+               .dac_tlv = cs4362a_db_scale,
+               .model_data_size = sizeof(struct xonar_data),
+               .pcm_dev_cfg = PLAYBACK_0_TO_I2S |
+                              PLAYBACK_1_TO_SPDIF |
+                              CAPTURE_0_FROM_I2S_2,
+               .dac_channels = 8,
+               .dac_volume_min = 0,
+               .dac_volume_max = 127,
+               .function_flags = OXYGEN_FUNCTION_2WIRE,
+               .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
+               .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
+       },
        [MODEL_DX] = {
                .shortname = "Xonar DX",
                .longname = "Asus Virtuoso 100",
                .chip = "AV200",
                .owner = THIS_MODULE,
                .init = xonar_dx_init,
-               .control_filter = xonar_dx_control_filter,
-               .mixer_init = xonar_dx_mixer_init,
-               .cleanup = xonar_dx_cleanup,
-               .suspend = xonar_dx_cleanup,
-               .resume = xonar_dx_resume,
+               .control_filter = xonar_d1_control_filter,
+               .mixer_init = xonar_d1_mixer_init,
+               .cleanup = xonar_d1_cleanup,
+               .suspend = xonar_d1_cleanup,
+               .resume = xonar_d1_resume,
                .set_dac_params = set_cs43xx_params,
                .set_adc_params = set_cs53x1_params,
                .update_dac_volume = update_cs43xx_volume,
                .update_dac_mute = update_cs43xx_mute,
                .gpio_changed = xonar_gpio_changed,
-               .ac97_switch = xonar_dx_ac97_switch,
+               .ac97_switch = xonar_d1_ac97_switch,
                .dac_tlv = cs4362a_db_scale,
                .model_data_size = sizeof(struct xonar_data),
                .pcm_dev_cfg = PLAYBACK_0_TO_I2S |
index 3ecce5168e94aaf936c0fd774d9b7722a6c8635b..e44153fa38de2543ea0b912f2bdc6564ab0593af 100644 (file)
@@ -82,7 +82,7 @@ static const u16 wm8990_reg[] = {
        0x0003,     /* R35 - ClassD1 */
        0x0000,     /* R36 */
        0x0100,     /* R37 - ClassD3 */
-       0x0000,     /* R38 */
+       0x0079,     /* R38 - ClassD4 */
        0x0000,     /* R39 - Input Mixer1 */
        0x0000,     /* R40 - Input Mixer2 */
        0x0000,     /* R41 - Input Mixer3 */
@@ -311,11 +311,15 @@ SOC_SINGLE("Speaker Mode Switch", WM8990_CLASSD1,
        WM8990_CDMODE_BIT, 1, 0),
 
 SOC_SINGLE("Speaker Output Attenuation Volume", WM8990_SPEAKER_VOLUME,
-       WM8990_SPKVOL_SHIFT, WM8990_SPKVOL_MASK, 0),
+       WM8990_SPKATTN_SHIFT, WM8990_SPKATTN_MASK, 0),
 SOC_SINGLE("Speaker DC Boost Volume", WM8990_CLASSD3,
        WM8990_DCGAIN_SHIFT, WM8990_DCGAIN_MASK, 0),
 SOC_SINGLE("Speaker AC Boost Volume", WM8990_CLASSD3,
        WM8990_ACGAIN_SHIFT, WM8990_ACGAIN_MASK, 0),
+SOC_SINGLE_TLV("Speaker Volume", WM8990_CLASSD4,
+       WM8990_SPKVOL_SHIFT, WM8990_SPKVOL_MASK, 0, out_pga_tlv),
+SOC_SINGLE("Speaker ZC Switch", WM8990_CLASSD4,
+       WM8990_SPKZC_SHIFT, WM8990_SPKZC_MASK, 0),
 
 SOC_WM899X_OUTPGA_SINGLE_R_TLV("Left DAC Digital Volume",
        WM8990_LEFT_DAC_DIGITAL_VOLUME,
@@ -920,7 +924,7 @@ static const struct snd_soc_dapm_route audio_map[] = {
        {"SPKMIX", "SPKMIX Left Mixer PGA Switch", "LOPGA"},
        {"SPKMIX", "SPKMIX Right Mixer PGA Switch", "ROPGA"},
        {"SPKMIX", "SPKMIX Right DAC Switch", "Right DAC"},
-       {"SPKMIX", "SPKMIX Left DAC Switch", "Right DAC"},
+       {"SPKMIX", "SPKMIX Left DAC Switch", "Left DAC"},
 
        /* LONMIX */
        {"LONMIX", "LONMIX Left Mixer PGA Switch", "LOPGA"},
index 6bea57485283736eab9002bbac738b3eb7c59879..0a08325d54430819ac0d3a7552384881eea095ca 100644 (file)
@@ -54,6 +54,7 @@
 #define WM8990_SPEAKER_VOLUME                   0x22
 #define WM8990_CLASSD1                          0x23
 #define WM8990_CLASSD3                          0x25
+#define WM8990_CLASSD4                          0x26
 #define WM8990_INPUT_MIXER1                     0x27
 #define WM8990_INPUT_MIXER2                     0x28
 #define WM8990_INPUT_MIXER3                     0x29
 /*
  * R34 (0x22) - Speaker Volume
  */
-#define WM8990_SPKVOL_MASK                      0x0003  /* SPKVOL - [1:0] */
-#define WM8990_SPKVOL_SHIFT                    0
+#define WM8990_SPKATTN_MASK                      0x0003  /* SPKATTN - [1:0] */
+#define WM8990_SPKATTN_SHIFT                    0
 
 /*
  * R35 (0x23) - ClassD1
 #define WM8990_DCGAIN_SHIFT                    3
 #define WM8990_ACGAIN_MASK                      0x0007  /* ACGAIN - [2:0] */
 #define WM8990_ACGAIN_SHIFT                    0
+
+/*
+ * R38 (0x26) - ClassD4
+ */
+#define WM8990_SPKZC_MASK                       0x0001  /* SPKZC */
+#define WM8990_SPKZC_SHIFT                           7  /* SPKZC */
+#define WM8990_SPKVOL_MASK                      0x007F  /* SPKVOL - [6:0] */
+#define WM8990_SPKVOL_SHIFT                          0  /* SPKVOL - [6:0] */
+
 /*
  * R39 (0x27) - Input Mixer1
  */