diff options
-rw-r--r-- | Documentation/00-INDEX | 2 | ||||
-rw-r--r-- | Documentation/DocBook/Makefile | 2 | ||||
-rw-r--r-- | Documentation/DocBook/s390-drivers.tmpl | 8 | ||||
-rw-r--r-- | Documentation/DocBook/sh.tmpl | 105 | ||||
-rw-r--r-- | Documentation/DocBook/videobook.tmpl | 2 | ||||
-rw-r--r-- | Documentation/cli-sti-removal.txt | 133 | ||||
-rw-r--r-- | Documentation/power/pm_qos_interface.txt | 7 | ||||
-rw-r--r-- | Documentation/powerpc/booting-without-of.txt | 4 | ||||
-rw-r--r-- | Documentation/powerpc/eeh-pci-error-recovery.txt | 2 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | arch/m68k/mac/baboon.c | 1 | ||||
-rw-r--r-- | arch/m68k/mac/via.c | 1 | ||||
-rw-r--r-- | arch/mips/emma2rh/markeins/setup.c | 1 | ||||
-rw-r--r-- | arch/mips/jazz/setup.c | 2 | ||||
-rw-r--r-- | arch/mn10300/kernel/module.c | 4 | ||||
-rw-r--r-- | arch/powerpc/Kconfig.debug | 2 | ||||
-rw-r--r-- | arch/powerpc/boot/dts/mpc8610_hpcd.dts | 5 | ||||
-rw-r--r-- | arch/powerpc/boot/io.h | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/8253pit.h (renamed from include/asm-powerpc/8253pit.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/8xx_immap.h (renamed from include/asm-powerpc/8xx_immap.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/Kbuild (renamed from include/asm-powerpc/Kbuild) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/a.out.h (renamed from include/asm-powerpc/a.out.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/abs_addr.h (renamed from include/asm-powerpc/abs_addr.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/agp.h (renamed from include/asm-powerpc/agp.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/asm-compat.h (renamed from include/asm-powerpc/asm-compat.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/atomic.h (renamed from include/asm-powerpc/atomic.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/auxvec.h (renamed from include/asm-powerpc/auxvec.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/backlight.h (renamed from include/asm-powerpc/backlight.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/bitops.h (renamed from include/asm-powerpc/bitops.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/bootx.h (renamed from include/asm-powerpc/bootx.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/btext.h (renamed from include/asm-powerpc/btext.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/bug.h (renamed from include/asm-powerpc/bug.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/bugs.h (renamed from include/asm-powerpc/bugs.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/byteorder.h (renamed from include/asm-powerpc/byteorder.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/cache.h (renamed from include/asm-powerpc/cache.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/cacheflush.h (renamed from include/asm-powerpc/cacheflush.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/cell-pmu.h (renamed from include/asm-powerpc/cell-pmu.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/cell-regs.h (renamed from include/asm-powerpc/cell-regs.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/checksum.h (renamed from include/asm-powerpc/checksum.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/clk_interface.h (renamed from include/asm-powerpc/clk_interface.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/code-patching.h (renamed from include/asm-powerpc/code-patching.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/compat.h (renamed from include/asm-powerpc/compat.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/cpm.h (renamed from include/asm-powerpc/cpm.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/cpm1.h (renamed from include/asm-powerpc/cpm1.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/cpm2.h (renamed from include/asm-powerpc/cpm2.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/cputable.h (renamed from include/asm-powerpc/cputable.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/cputhreads.h (renamed from include/asm-powerpc/cputhreads.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/cputime.h (renamed from include/asm-powerpc/cputime.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/current.h (renamed from include/asm-powerpc/current.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/dbdma.h (renamed from include/asm-powerpc/dbdma.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/dcr-generic.h (renamed from include/asm-powerpc/dcr-generic.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/dcr-mmio.h (renamed from include/asm-powerpc/dcr-mmio.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/dcr-native.h (renamed from include/asm-powerpc/dcr-native.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/dcr-regs.h (renamed from include/asm-powerpc/dcr-regs.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/dcr.h (renamed from include/asm-powerpc/dcr.h) | 6 | ||||
-rw-r--r-- | arch/powerpc/include/asm/delay.h (renamed from include/asm-powerpc/delay.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/device.h (renamed from include/asm-powerpc/device.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/div64.h (renamed from include/asm-powerpc/div64.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/dma-mapping.h (renamed from include/asm-powerpc/dma-mapping.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/dma.h (renamed from include/asm-powerpc/dma.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/edac.h (renamed from include/asm-powerpc/edac.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/eeh.h (renamed from include/asm-powerpc/eeh.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/eeh_event.h (renamed from include/asm-powerpc/eeh_event.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/elf.h (renamed from include/asm-powerpc/elf.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/emergency-restart.h (renamed from include/asm-powerpc/emergency-restart.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/errno.h (renamed from include/asm-powerpc/errno.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/exception.h (renamed from include/asm-powerpc/exception.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/fb.h (renamed from include/asm-powerpc/fb.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/fcntl.h (renamed from include/asm-powerpc/fcntl.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/feature-fixups.h (renamed from include/asm-powerpc/feature-fixups.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/firmware.h (renamed from include/asm-powerpc/firmware.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/fixmap.h (renamed from include/asm-powerpc/fixmap.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/floppy.h (renamed from include/asm-powerpc/floppy.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/fs_pd.h (renamed from include/asm-powerpc/fs_pd.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/fsl_gtm.h (renamed from include/asm-powerpc/fsl_gtm.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/fsl_lbc.h (renamed from include/asm-powerpc/fsl_lbc.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ftrace.h (renamed from include/asm-powerpc/ftrace.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/futex.h (renamed from include/asm-powerpc/futex.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/gpio.h (renamed from include/asm-powerpc/gpio.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/grackle.h (renamed from include/asm-powerpc/grackle.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/hardirq.h (renamed from include/asm-powerpc/hardirq.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/heathrow.h (renamed from include/asm-powerpc/heathrow.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/highmem.h (renamed from include/asm-powerpc/highmem.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/hugetlb.h (renamed from include/asm-powerpc/hugetlb.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/hvcall.h (renamed from include/asm-powerpc/hvcall.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/hvconsole.h (renamed from include/asm-powerpc/hvconsole.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/hvcserver.h (renamed from include/asm-powerpc/hvcserver.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/hw_irq.h (renamed from include/asm-powerpc/hw_irq.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/hydra.h (renamed from include/asm-powerpc/hydra.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/i8259.h (renamed from include/asm-powerpc/i8259.h) | 5 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ibmebus.h (renamed from include/asm-powerpc/ibmebus.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ide.h (renamed from include/asm-powerpc/ide.h) | 1 | ||||
-rw-r--r-- | arch/powerpc/include/asm/immap_86xx.h (renamed from include/asm-powerpc/immap_86xx.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/immap_cpm2.h (renamed from include/asm-powerpc/immap_cpm2.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/immap_qe.h (renamed from include/asm-powerpc/immap_qe.h) | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/io-defs.h (renamed from include/asm-powerpc/io-defs.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/io.h (renamed from include/asm-powerpc/io.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ioctl.h (renamed from include/asm-powerpc/ioctl.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ioctls.h (renamed from include/asm-powerpc/ioctls.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iommu.h (renamed from include/asm-powerpc/iommu.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ipcbuf.h (renamed from include/asm-powerpc/ipcbuf.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ipic.h (renamed from include/asm-powerpc/ipic.h) | 9 | ||||
-rw-r--r-- | arch/powerpc/include/asm/irq.h (renamed from include/asm-powerpc/irq.h) | 288 | ||||
-rw-r--r-- | arch/powerpc/include/asm/irq_regs.h (renamed from include/asm-powerpc/irq_regs.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/irqflags.h (renamed from include/asm-powerpc/irqflags.h) | 4 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iseries/alpaca.h (renamed from include/asm-powerpc/iseries/alpaca.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iseries/hv_call.h (renamed from include/asm-powerpc/iseries/hv_call.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iseries/hv_call_event.h (renamed from include/asm-powerpc/iseries/hv_call_event.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iseries/hv_call_sc.h (renamed from include/asm-powerpc/iseries/hv_call_sc.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iseries/hv_call_xm.h (renamed from include/asm-powerpc/iseries/hv_call_xm.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iseries/hv_lp_config.h (renamed from include/asm-powerpc/iseries/hv_lp_config.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iseries/hv_lp_event.h (renamed from include/asm-powerpc/iseries/hv_lp_event.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iseries/hv_types.h (renamed from include/asm-powerpc/iseries/hv_types.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iseries/iommu.h (renamed from include/asm-powerpc/iseries/iommu.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iseries/it_lp_queue.h (renamed from include/asm-powerpc/iseries/it_lp_queue.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iseries/lpar_map.h (renamed from include/asm-powerpc/iseries/lpar_map.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iseries/mf.h (renamed from include/asm-powerpc/iseries/mf.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/iseries/vio.h (renamed from include/asm-powerpc/iseries/vio.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kdebug.h (renamed from include/asm-powerpc/kdebug.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kdump.h (renamed from include/asm-powerpc/kdump.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kexec.h (renamed from include/asm-powerpc/kexec.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/keylargo.h (renamed from include/asm-powerpc/keylargo.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kgdb.h (renamed from include/asm-powerpc/kgdb.h) | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kmap_types.h (renamed from include/asm-powerpc/kmap_types.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kprobes.h (renamed from include/asm-powerpc/kprobes.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kvm.h (renamed from include/asm-powerpc/kvm.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kvm_asm.h (renamed from include/asm-powerpc/kvm_asm.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kvm_host.h (renamed from include/asm-powerpc/kvm_host.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kvm_para.h (renamed from include/asm-powerpc/kvm_para.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kvm_ppc.h (renamed from include/asm-powerpc/kvm_ppc.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/libata-portmap.h (renamed from include/asm-powerpc/libata-portmap.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/linkage.h (renamed from include/asm-powerpc/linkage.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/lmb.h (renamed from include/asm-powerpc/lmb.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/local.h (renamed from include/asm-powerpc/local.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/lppaca.h (renamed from include/asm-powerpc/lppaca.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/lv1call.h (renamed from include/asm-powerpc/lv1call.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/machdep.h (renamed from include/asm-powerpc/machdep.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/macio.h (renamed from include/asm-powerpc/macio.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mc146818rtc.h (renamed from include/asm-powerpc/mc146818rtc.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mediabay.h (renamed from include/asm-powerpc/mediabay.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mman.h (renamed from include/asm-powerpc/mman.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mmu-40x.h (renamed from include/asm-powerpc/mmu-40x.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mmu-44x.h (renamed from include/asm-powerpc/mmu-44x.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mmu-8xx.h (renamed from include/asm-powerpc/mmu-8xx.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mmu-fsl-booke.h (renamed from include/asm-powerpc/mmu-fsl-booke.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mmu-hash32.h (renamed from include/asm-powerpc/mmu-hash32.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mmu-hash64.h (renamed from include/asm-powerpc/mmu-hash64.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mmu.h (renamed from include/asm-powerpc/mmu.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mmu_context.h (renamed from include/asm-powerpc/mmu_context.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mmzone.h (renamed from include/asm-powerpc/mmzone.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/module.h (renamed from include/asm-powerpc/module.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mpc512x.h (renamed from include/asm-powerpc/mpc512x.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mpc52xx.h (renamed from include/asm-powerpc/mpc52xx.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mpc52xx_psc.h (renamed from include/asm-powerpc/mpc52xx_psc.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mpc6xx.h (renamed from include/asm-powerpc/mpc6xx.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mpc8260.h (renamed from include/asm-powerpc/mpc8260.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mpc86xx.h (renamed from include/asm-powerpc/mpc86xx.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mpc8xx.h (renamed from include/asm-powerpc/mpc8xx.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mpic.h (renamed from include/asm-powerpc/mpic.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/msgbuf.h (renamed from include/asm-powerpc/msgbuf.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mutex.h (renamed from include/asm-powerpc/mutex.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/nvram.h (renamed from include/asm-powerpc/nvram.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/of_device.h (renamed from include/asm-powerpc/of_device.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/of_platform.h (renamed from include/asm-powerpc/of_platform.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ohare.h (renamed from include/asm-powerpc/ohare.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/oprofile_impl.h (renamed from include/asm-powerpc/oprofile_impl.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pSeries_reconfig.h (renamed from include/asm-powerpc/pSeries_reconfig.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/paca.h (renamed from include/asm-powerpc/paca.h) | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/page.h (renamed from include/asm-powerpc/page.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/page_32.h (renamed from include/asm-powerpc/page_32.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/page_64.h (renamed from include/asm-powerpc/page_64.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/param.h (renamed from include/asm-powerpc/param.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/parport.h (renamed from include/asm-powerpc/parport.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pasemi_dma.h (renamed from include/asm-powerpc/pasemi_dma.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pci-bridge.h (renamed from include/asm-powerpc/pci-bridge.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pci.h (renamed from include/asm-powerpc/pci.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/percpu.h (renamed from include/asm-powerpc/percpu.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pgalloc-32.h (renamed from include/asm-powerpc/pgalloc-32.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pgalloc-64.h (renamed from include/asm-powerpc/pgalloc-64.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pgalloc.h (renamed from include/asm-powerpc/pgalloc.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pgtable-4k.h (renamed from include/asm-powerpc/pgtable-4k.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pgtable-64k.h (renamed from include/asm-powerpc/pgtable-64k.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pgtable-ppc32.h (renamed from include/asm-powerpc/pgtable-ppc32.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pgtable-ppc64.h (renamed from include/asm-powerpc/pgtable-ppc64.h) | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pgtable.h (renamed from include/asm-powerpc/pgtable.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/phyp_dump.h (renamed from include/asm-powerpc/phyp_dump.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pmac_feature.h (renamed from include/asm-powerpc/pmac_feature.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pmac_low_i2c.h (renamed from include/asm-powerpc/pmac_low_i2c.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pmac_pfunc.h (renamed from include/asm-powerpc/pmac_pfunc.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pmc.h (renamed from include/asm-powerpc/pmc.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/pmi.h (renamed from include/asm-powerpc/pmi.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/poll.h (renamed from include/asm-powerpc/poll.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/posix_types.h (renamed from include/asm-powerpc/posix_types.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ppc-pci.h (renamed from include/asm-powerpc/ppc-pci.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ppc4xx.h (renamed from include/asm-powerpc/ppc4xx.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ppc_asm.h (renamed from include/asm-powerpc/ppc_asm.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/processor.h (renamed from include/asm-powerpc/processor.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/prom.h (renamed from include/asm-powerpc/prom.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ps3.h (renamed from include/asm-powerpc/ps3.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ps3av.h (renamed from include/asm-powerpc/ps3av.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ps3fb.h (renamed from include/asm-powerpc/ps3fb.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ps3stor.h (renamed from include/asm-powerpc/ps3stor.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ptrace.h (renamed from include/asm-powerpc/ptrace.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/qe.h (renamed from include/asm-powerpc/qe.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/qe_ic.h (renamed from include/asm-powerpc/qe_ic.h) | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/reg.h (renamed from include/asm-powerpc/reg.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/reg_8xx.h (renamed from include/asm-powerpc/reg_8xx.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/reg_booke.h (renamed from include/asm-powerpc/reg_booke.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/reg_fsl_emb.h (renamed from include/asm-powerpc/reg_fsl_emb.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/resource.h (renamed from include/asm-powerpc/resource.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/rheap.h (renamed from include/asm-powerpc/rheap.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/rio.h (renamed from include/asm-powerpc/rio.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/rtas.h (renamed from include/asm-powerpc/rtas.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/rtc.h (renamed from include/asm-powerpc/rtc.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/rwsem.h (renamed from include/asm-powerpc/rwsem.h) | 4 | ||||
-rw-r--r-- | arch/powerpc/include/asm/scatterlist.h (renamed from include/asm-powerpc/scatterlist.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/seccomp.h (renamed from include/asm-powerpc/seccomp.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/sections.h (renamed from include/asm-powerpc/sections.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/sembuf.h (renamed from include/asm-powerpc/sembuf.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/serial.h (renamed from include/asm-powerpc/serial.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/setjmp.h (renamed from include/asm-powerpc/setjmp.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/setup.h (renamed from include/asm-powerpc/setup.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/shmbuf.h (renamed from include/asm-powerpc/shmbuf.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/shmparam.h (renamed from include/asm-powerpc/shmparam.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/sigcontext.h (renamed from include/asm-powerpc/sigcontext.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/siginfo.h (renamed from include/asm-powerpc/siginfo.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/signal.h (renamed from include/asm-powerpc/signal.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/smp.h (renamed from include/asm-powerpc/smp.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/smu.h (renamed from include/asm-powerpc/smu.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/socket.h (renamed from include/asm-powerpc/socket.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/sockios.h (renamed from include/asm-powerpc/sockios.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/sparsemem.h (renamed from include/asm-powerpc/sparsemem.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/spinlock.h (renamed from include/asm-powerpc/spinlock.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/spinlock_types.h (renamed from include/asm-powerpc/spinlock_types.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/spu.h (renamed from include/asm-powerpc/spu.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/spu_csa.h (renamed from include/asm-powerpc/spu_csa.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/spu_info.h (renamed from include/asm-powerpc/spu_info.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/spu_priv1.h (renamed from include/asm-powerpc/spu_priv1.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/sstep.h (renamed from include/asm-powerpc/sstep.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/stat.h (renamed from include/asm-powerpc/stat.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/statfs.h (renamed from include/asm-powerpc/statfs.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/string.h (renamed from include/asm-powerpc/string.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/suspend.h (renamed from include/asm-powerpc/suspend.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/synch.h (renamed from include/asm-powerpc/synch.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/syscall.h (renamed from include/asm-powerpc/syscall.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/syscalls.h (renamed from include/asm-powerpc/syscalls.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/systbl.h (renamed from include/asm-powerpc/systbl.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/system.h (renamed from include/asm-powerpc/system.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/tce.h (renamed from include/asm-powerpc/tce.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/termbits.h (renamed from include/asm-powerpc/termbits.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/termios.h (renamed from include/asm-powerpc/termios.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/thread_info.h (renamed from include/asm-powerpc/thread_info.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/time.h (renamed from include/asm-powerpc/time.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/timex.h (renamed from include/asm-powerpc/timex.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/tlb.h (renamed from include/asm-powerpc/tlb.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/tlbflush.h (renamed from include/asm-powerpc/tlbflush.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/topology.h (renamed from include/asm-powerpc/topology.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/tsi108.h (renamed from include/asm-powerpc/tsi108.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/tsi108_irq.h (renamed from include/asm-powerpc/tsi108_irq.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/tsi108_pci.h (renamed from include/asm-powerpc/tsi108_pci.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/types.h (renamed from include/asm-powerpc/types.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/uaccess.h (renamed from include/asm-powerpc/uaccess.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ucc.h (renamed from include/asm-powerpc/ucc.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ucc_fast.h (renamed from include/asm-powerpc/ucc_fast.h) | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ucc_slow.h (renamed from include/asm-powerpc/ucc_slow.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/ucontext.h (renamed from include/asm-powerpc/ucontext.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/udbg.h (renamed from include/asm-powerpc/udbg.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/uic.h (renamed from include/asm-powerpc/uic.h) | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/unaligned.h (renamed from include/asm-powerpc/unaligned.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/uninorth.h (renamed from include/asm-powerpc/uninorth.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/unistd.h (renamed from include/asm-powerpc/unistd.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/user.h (renamed from include/asm-powerpc/user.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/vdso.h (renamed from include/asm-powerpc/vdso.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/vdso_datapage.h (renamed from include/asm-powerpc/vdso_datapage.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/vga.h (renamed from include/asm-powerpc/vga.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/vio.h (renamed from include/asm-powerpc/vio.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/xilinx_intc.h (renamed from include/asm-powerpc/xilinx_intc.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/xmon.h (renamed from include/asm-powerpc/xmon.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/include/asm/xor.h (renamed from include/asm-powerpc/xor.h) | 0 | ||||
-rw-r--r-- | arch/powerpc/kernel/Makefile | 14 | ||||
-rw-r--r-- | arch/powerpc/kernel/cpu_setup_44x.S | 6 | ||||
-rw-r--r-- | arch/powerpc/kernel/irq.c | 25 | ||||
-rw-r--r-- | arch/powerpc/kernel/process.c | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/vdso.c | 2 | ||||
-rw-r--r-- | arch/powerpc/lib/Makefile | 2 | ||||
-rw-r--r-- | arch/powerpc/mm/mem.c | 2 | ||||
-rw-r--r-- | arch/powerpc/mm/ppc_mmu_32.c | 4 | ||||
-rw-r--r-- | arch/powerpc/mm/tlb_64.c | 2 | ||||
-rw-r--r-- | arch/powerpc/platforms/52xx/Makefile | 4 | ||||
-rw-r--r-- | arch/powerpc/platforms/86xx/mpc86xx_smp.c | 2 | ||||
-rw-r--r-- | arch/powerpc/platforms/Makefile | 6 | ||||
-rw-r--r-- | arch/powerpc/platforms/powermac/Makefile | 3 | ||||
-rw-r--r-- | arch/powerpc/sysdev/Makefile | 2 | ||||
-rw-r--r-- | arch/s390/include/asm/Kbuild (renamed from include/asm-s390/Kbuild) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/airq.h (renamed from include/asm-s390/airq.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/appldata.h (renamed from include/asm-s390/appldata.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/atomic.h (renamed from include/asm-s390/atomic.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/auxvec.h (renamed from include/asm-s390/auxvec.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/bitops.h (renamed from include/asm-s390/bitops.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/bug.h (renamed from include/asm-s390/bug.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/bugs.h (renamed from include/asm-s390/bugs.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/byteorder.h (renamed from include/asm-s390/byteorder.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/cache.h (renamed from include/asm-s390/cache.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/cacheflush.h (renamed from include/asm-s390/cacheflush.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/ccwdev.h (renamed from include/asm-s390/ccwdev.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/ccwgroup.h (renamed from include/asm-s390/ccwgroup.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/checksum.h (renamed from include/asm-s390/checksum.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/chpid.h (renamed from include/asm-s390/chpid.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/chsc.h (renamed from include/asm-s390/chsc.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/cio.h (renamed from include/asm-s390/cio.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/cmb.h (renamed from include/asm-s390/cmb.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/compat.h (renamed from include/asm-s390/compat.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/cpcmd.h (renamed from include/asm-s390/cpcmd.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/cpu.h (renamed from include/asm-s390/cpu.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/cputime.h (renamed from include/asm-s390/cputime.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/current.h (renamed from include/asm-s390/current.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/dasd.h (renamed from include/asm-s390/dasd.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/debug.h (renamed from include/asm-s390/debug.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/delay.h (renamed from include/asm-s390/delay.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/device.h (renamed from include/asm-s390/device.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/diag.h (renamed from include/asm-s390/diag.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/div64.h (renamed from include/asm-s390/div64.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/dma.h (renamed from include/asm-s390/dma.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/ebcdic.h (renamed from include/asm-s390/ebcdic.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/elf.h (renamed from include/asm-s390/elf.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/emergency-restart.h (renamed from include/asm-s390/emergency-restart.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/errno.h (renamed from include/asm-s390/errno.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/etr.h (renamed from include/asm-s390/etr.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/extmem.h (renamed from include/asm-s390/extmem.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/fb.h (renamed from include/asm-s390/fb.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/fcntl.h (renamed from include/asm-s390/fcntl.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/fcx.h (renamed from include/asm-s390/fcx.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/futex.h (renamed from include/asm-s390/futex.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/hardirq.h (renamed from include/asm-s390/hardirq.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/hugetlb.h (renamed from include/asm-s390/hugetlb.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/idals.h (renamed from include/asm-s390/idals.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/io.h (renamed from include/asm-s390/io.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/ioctl.h (renamed from include/asm-s390/ioctl.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/ioctls.h (renamed from include/asm-s390/ioctls.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/ipcbuf.h (renamed from include/asm-s390/ipcbuf.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/ipl.h (renamed from include/asm-s390/ipl.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/irq.h (renamed from include/asm-s390/irq.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/irq_regs.h (renamed from include/asm-s390/irq_regs.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/irqflags.h (renamed from include/asm-s390/irqflags.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/isc.h (renamed from include/asm-s390/isc.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/itcw.h (renamed from include/asm-s390/itcw.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/kdebug.h (renamed from include/asm-s390/kdebug.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/kexec.h (renamed from include/asm-s390/kexec.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/kmap_types.h (renamed from include/asm-s390/kmap_types.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/kprobes.h (renamed from include/asm-s390/kprobes.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/kvm.h (renamed from include/asm-s390/kvm.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/kvm_host.h (renamed from include/asm-s390/kvm_host.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/kvm_para.h (renamed from include/asm-s390/kvm_para.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/kvm_virtio.h (renamed from include/asm-s390/kvm_virtio.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/linkage.h (renamed from include/asm-s390/linkage.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/local.h (renamed from include/asm-s390/local.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/lowcore.h (renamed from include/asm-s390/lowcore.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/mathemu.h (renamed from include/asm-s390/mathemu.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/mman.h (renamed from include/asm-s390/mman.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/mmu.h (renamed from include/asm-s390/mmu.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/mmu_context.h (renamed from include/asm-s390/mmu_context.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/module.h (renamed from include/asm-s390/module.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/monwriter.h (renamed from include/asm-s390/monwriter.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/msgbuf.h (renamed from include/asm-s390/msgbuf.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/mutex.h (renamed from include/asm-s390/mutex.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/page.h (renamed from include/asm-s390/page.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/param.h (renamed from include/asm-s390/param.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/pci.h (renamed from include/asm-s390/pci.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/percpu.h (renamed from include/asm-s390/percpu.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/pgalloc.h (renamed from include/asm-s390/pgalloc.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/pgtable.h (renamed from include/asm-s390/pgtable.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/poll.h (renamed from include/asm-s390/poll.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/posix_types.h (renamed from include/asm-s390/posix_types.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/processor.h (renamed from include/asm-s390/processor.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/ptrace.h (renamed from include/asm-s390/ptrace.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/qdio.h (renamed from include/asm-s390/qdio.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/qeth.h (renamed from include/asm-s390/qeth.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/reset.h (renamed from include/asm-s390/reset.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/resource.h (renamed from include/asm-s390/resource.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/rwsem.h (renamed from include/asm-s390/rwsem.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/s390_ext.h (renamed from include/asm-s390/s390_ext.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/s390_rdev.h (renamed from include/asm-s390/s390_rdev.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/scatterlist.h (renamed from include/asm-s390/scatterlist.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/schid.h (renamed from include/asm-s390/schid.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/sclp.h (renamed from include/asm-s390/sclp.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/sections.h (renamed from include/asm-s390/sections.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/segment.h (renamed from include/asm-s390/segment.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/sembuf.h (renamed from include/asm-s390/sembuf.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/setup.h (renamed from include/asm-s390/setup.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/sfp-machine.h (renamed from include/asm-s390/sfp-machine.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/sfp-util.h (renamed from include/asm-s390/sfp-util.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/shmbuf.h (renamed from include/asm-s390/shmbuf.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/shmparam.h (renamed from include/asm-s390/shmparam.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/sigcontext.h (renamed from include/asm-s390/sigcontext.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/siginfo.h (renamed from include/asm-s390/siginfo.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/signal.h (renamed from include/asm-s390/signal.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/sigp.h (renamed from include/asm-s390/sigp.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/smp.h (renamed from include/asm-s390/smp.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/socket.h (renamed from include/asm-s390/socket.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/sockios.h (renamed from include/asm-s390/sockios.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/sparsemem.h (renamed from include/asm-s390/sparsemem.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/spinlock.h (renamed from include/asm-s390/spinlock.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/spinlock_types.h (renamed from include/asm-s390/spinlock_types.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/stat.h (renamed from include/asm-s390/stat.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/statfs.h (renamed from include/asm-s390/statfs.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/string.h (renamed from include/asm-s390/string.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/suspend.h (renamed from include/asm-s390/suspend.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/sysinfo.h (renamed from include/asm-s390/sysinfo.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/system.h (renamed from include/asm-s390/system.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/tape390.h (renamed from include/asm-s390/tape390.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/termbits.h (renamed from include/asm-s390/termbits.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/termios.h (renamed from include/asm-s390/termios.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/thread_info.h (renamed from include/asm-s390/thread_info.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/timer.h (renamed from include/asm-s390/timer.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/timex.h (renamed from include/asm-s390/timex.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/tlb.h (renamed from include/asm-s390/tlb.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/tlbflush.h (renamed from include/asm-s390/tlbflush.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/todclk.h (renamed from include/asm-s390/todclk.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/topology.h (renamed from include/asm-s390/topology.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/types.h (renamed from include/asm-s390/types.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/uaccess.h (renamed from include/asm-s390/uaccess.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/ucontext.h (renamed from include/asm-s390/ucontext.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/unaligned.h (renamed from include/asm-s390/unaligned.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/unistd.h (renamed from include/asm-s390/unistd.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/user.h (renamed from include/asm-s390/user.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/vtoc.h (renamed from include/asm-s390/vtoc.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/xor.h (renamed from include/asm-s390/xor.h) | 0 | ||||
-rw-r--r-- | arch/s390/include/asm/zcrypt.h (renamed from include/asm-s390/zcrypt.h) | 0 | ||||
-rw-r--r-- | arch/sh/Kconfig | 27 | ||||
-rw-r--r-- | arch/sh/Kconfig.debug | 2 | ||||
-rw-r--r-- | arch/sh/Makefile | 16 | ||||
-rw-r--r-- | arch/sh/boards/Makefile | 2 | ||||
-rw-r--r-- | arch/sh/boards/board-ap325rxa.c | 1 | ||||
-rw-r--r-- | arch/sh/boards/mach-se/7343/irq.c | 1 | ||||
-rw-r--r-- | arch/sh/boards/mach-systemh/irq.c | 3 | ||||
-rw-r--r-- | arch/sh/configs/dreamcast_defconfig | 14 | ||||
-rw-r--r-- | arch/sh/include/asm/a.out.h | 20 | ||||
-rw-r--r-- | arch/sh/include/asm/ptrace.h | 9 | ||||
-rw-r--r-- | arch/sh/include/asm/seccomp.h | 10 | ||||
-rw-r--r-- | arch/sh/include/asm/thread_info.h | 51 | ||||
-rw-r--r-- | arch/sh/include/asm/tlb_64.h | 12 | ||||
-rw-r--r-- | arch/sh/include/cpu-sh2/cpu/cache.h | 6 | ||||
-rw-r--r-- | arch/sh/include/cpu-sh2a/cpu/addrspace.h | 10 | ||||
-rw-r--r-- | arch/sh/include/cpu-sh2a/cpu/cache.h | 3 | ||||
-rw-r--r-- | arch/sh/include/cpu-sh2a/cpu/cacheflush.h | 34 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4/sq.c | 2 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh5/entry.S | 19 | ||||
-rw-r--r-- | arch/sh/kernel/entry-common.S | 16 | ||||
-rw-r--r-- | arch/sh/kernel/machine_kexec.c | 8 | ||||
-rw-r--r-- | arch/sh/kernel/module.c | 7 | ||||
-rw-r--r-- | arch/sh/kernel/ptrace_32.c | 157 | ||||
-rw-r--r-- | arch/sh/kernel/ptrace_64.c | 144 | ||||
-rw-r--r-- | arch/sh/kernel/setup.c | 20 | ||||
-rw-r--r-- | arch/sh/kernel/signal_32.c | 22 | ||||
-rw-r--r-- | arch/sh/kernel/signal_64.c | 166 | ||||
-rw-r--r-- | arch/sh/mm/Kconfig | 1 | ||||
-rw-r--r-- | arch/sh/mm/Makefile_32 | 11 | ||||
-rw-r--r-- | arch/sh/mm/cache-sh2.c | 45 | ||||
-rw-r--r-- | arch/sh/mm/cache-sh2a.c | 129 | ||||
-rw-r--r-- | arch/sh/mm/tlb-sh5.c | 20 | ||||
-rw-r--r-- | arch/sh/tools/Makefile | 4 | ||||
-rw-r--r-- | arch/sparc64/kernel/irq.c | 19 | ||||
-rw-r--r-- | arch/sparc64/kernel/signal.c | 1 | ||||
-rw-r--r-- | arch/sparc64/kernel/smp.c | 292 | ||||
-rw-r--r-- | arch/sparc64/mm/tsb.c | 5 | ||||
-rw-r--r-- | arch/xtensa/kernel/xtensa_ksyms.c | 1 | ||||
-rw-r--r-- | block/scsi_ioctl.c | 2 | ||||
-rw-r--r-- | drivers/block/cciss.c | 2 | ||||
-rw-r--r-- | drivers/cdrom/cdrom.c | 4 | ||||
-rw-r--r-- | drivers/char/efirtc.c | 1 | ||||
-rw-r--r-- | drivers/char/hvc_console.h | 2 | ||||
-rw-r--r-- | drivers/char/hvcs.c | 2 | ||||
-rw-r--r-- | drivers/char/viocons.c | 4 | ||||
-rw-r--r-- | drivers/char/vt.c | 2 | ||||
-rw-r--r-- | drivers/ide/Kconfig | 10 | ||||
-rw-r--r-- | drivers/ide/arm/palm_bk3710.c | 2 | ||||
-rw-r--r-- | drivers/ide/ide-cd.c | 30 | ||||
-rw-r--r-- | drivers/ide/ide-disk.c | 11 | ||||
-rw-r--r-- | drivers/ide/ide-dma.c | 6 | ||||
-rw-r--r-- | drivers/ide/ide-floppy.c | 11 | ||||
-rw-r--r-- | drivers/ide/ide-iops.c | 6 | ||||
-rw-r--r-- | drivers/ide/ide-tape.c | 11 | ||||
-rw-r--r-- | drivers/ide/pci/aec62xx.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/alim15x3.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/amd74xx.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/atiixp.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/cmd64x.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/cs5520.c | 1 | ||||
-rw-r--r-- | drivers/ide/pci/cs5535.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/hpt366.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/it8213.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/it821x.c | 4 | ||||
-rw-r--r-- | drivers/ide/pci/jmicron.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/pdc202xx_new.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/pdc202xx_old.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/piix.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/scc_pata.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/serverworks.c | 8 | ||||
-rw-r--r-- | drivers/ide/pci/siimage.c | 4 | ||||
-rw-r--r-- | drivers/ide/pci/sis5513.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/slc90e66.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/tc86c001.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/via82cxxx.c | 2 | ||||
-rw-r--r-- | drivers/infiniband/hw/ehca/ehca_reqs.c | 2 | ||||
-rw-r--r-- | drivers/input/keyboard/maple_keyb.c | 172 | ||||
-rw-r--r-- | drivers/isdn/Makefile | 2 | ||||
-rw-r--r-- | drivers/isdn/hardware/mISDN/hfcmulti.c | 37 | ||||
-rw-r--r-- | drivers/isdn/hardware/mISDN/hfcpci.c | 2 | ||||
-rw-r--r-- | drivers/isdn/mISDN/l1oip_core.c | 6 | ||||
-rw-r--r-- | drivers/isdn/mISDN/socket.c | 4 | ||||
-rw-r--r-- | drivers/macintosh/mediabay.c | 1 | ||||
-rw-r--r-- | drivers/media/video/vino.c | 1 | ||||
-rw-r--r-- | drivers/misc/sgi-gru/grutlbpurge.c | 1 | ||||
-rw-r--r-- | drivers/net/stnic.c | 2 | ||||
-rw-r--r-- | drivers/net/tg3.c | 20 | ||||
-rw-r--r-- | drivers/net/wireless/Kconfig | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath5k/ath5k.h | 8 | ||||
-rw-r--r-- | drivers/net/wireless/ath5k/base.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath5k/debug.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath5k/debug.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath5k/hw.c | 239 | ||||
-rw-r--r-- | drivers/net/wireless/ath5k/initvals.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/ath5k/phy.c | 185 | ||||
-rw-r--r-- | drivers/net/wireless/ath5k/reg.h | 934 | ||||
-rw-r--r-- | drivers/net/wireless/ipw2200.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/Kconfig | 98 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/Makefile | 13 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945-led.c | 33 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945-led.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.c | 17 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965.c | 156 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-5000.c | 71 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-rs.c (renamed from drivers/net/wireless/iwlwifi/iwl-4965-rs.c) | 327 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-rs.h (renamed from drivers/net/wireless/iwlwifi/iwl-4965-rs.h) | 23 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c (renamed from drivers/net/wireless/iwlwifi/iwl4965-base.c) | 232 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-commands.h | 44 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-csr.h | 10 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-debug.h | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-debugfs.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 22 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-eeprom.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-hcmd.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-led.c | 69 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-led.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-power.c | 45 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-power.h | 33 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-prph.h | 12 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-rx.c | 59 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-scan.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-sta.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-tx.c | 86 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 58 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/main.c | 15 | ||||
-rw-r--r-- | drivers/net/wireless/p54/p54.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/p54/p54common.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/prism54/isl_ioctl.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500pci.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 20 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00config.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00debug.c | 17 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00mac.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00usb.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00usb.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt61pci.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/rtl8187.h | 4 | ||||
-rw-r--r-- | drivers/net/wireless/rtl8187_dev.c | 17 | ||||
-rw-r--r-- | drivers/pcmcia/rsrc_nonstatic.c | 2 | ||||
-rw-r--r-- | drivers/rtc/rtc-bfin.c | 105 | ||||
-rw-r--r-- | drivers/scsi/hptiop.c | 8 | ||||
-rw-r--r-- | drivers/scsi/ide-scsi.c | 11 | ||||
-rw-r--r-- | drivers/scsi/scsi_transport_spi.c | 8 | ||||
-rw-r--r-- | drivers/scsi/ses.c | 18 | ||||
-rw-r--r-- | drivers/scsi/sg.c | 2 | ||||
-rw-r--r-- | drivers/serial/bfin_5xx.c | 2 | ||||
-rw-r--r-- | drivers/serial/crisv10.c | 79 | ||||
-rw-r--r-- | drivers/serial/crisv10.h | 3 | ||||
-rw-r--r-- | drivers/sh/maple/maple.c | 65 | ||||
-rw-r--r-- | drivers/spi/Kconfig | 6 | ||||
-rw-r--r-- | drivers/spi/Makefile | 1 | ||||
-rw-r--r-- | drivers/spi/atmel_spi.c | 17 | ||||
-rw-r--r-- | drivers/spi/orion_spi.c | 574 | ||||
-rw-r--r-- | drivers/spi/spi_s3c24xx.c | 25 | ||||
-rw-r--r-- | drivers/usb/core/message.c | 2 | ||||
-rw-r--r-- | drivers/usb/storage/freecom.c | 2 | ||||
-rw-r--r-- | drivers/video/arkfb.c | 18 | ||||
-rw-r--r-- | drivers/video/aty/atyfb_base.c | 29 | ||||
-rw-r--r-- | drivers/video/aty/radeon_accel.c | 4 | ||||
-rw-r--r-- | drivers/video/aty/radeon_i2c.c | 3 | ||||
-rw-r--r-- | drivers/video/backlight/pwm_bl.c | 10 | ||||
-rw-r--r-- | drivers/video/console/fbcon.c | 3 | ||||
-rw-r--r-- | drivers/video/fsl-diu-fb.c | 8 | ||||
-rw-r--r-- | drivers/video/s3fb.c | 18 | ||||
-rw-r--r-- | drivers/video/vt8623fb.c | 20 | ||||
-rw-r--r-- | drivers/watchdog/ar7_wdt.c | 29 | ||||
-rw-r--r-- | drivers/watchdog/it8712f_wdt.c | 77 | ||||
-rw-r--r-- | drivers/watchdog/s3c2410_wdt.c | 148 | ||||
-rw-r--r-- | drivers/watchdog/sc1200wdt.c | 205 | ||||
-rw-r--r-- | drivers/watchdog/wdt.c | 176 | ||||
-rw-r--r-- | drivers/watchdog/wdt_pci.c | 301 | ||||
-rw-r--r-- | firmware/ihex2fw.c | 6 | ||||
-rw-r--r-- | fs/afs/write.c | 2 | ||||
-rw-r--r-- | fs/buffer.c | 4 | ||||
-rw-r--r-- | fs/cifs/file.c | 2 | ||||
-rw-r--r-- | fs/jbd/commit.c | 6 | ||||
-rw-r--r-- | fs/jbd2/commit.c | 2 | ||||
-rw-r--r-- | fs/nfs/nfsroot.c | 2 | ||||
-rw-r--r-- | fs/ntfs/aops.c | 2 | ||||
-rw-r--r-- | fs/ntfs/compress.c | 2 | ||||
-rw-r--r-- | fs/ntfs/mft.c | 4 | ||||
-rw-r--r-- | fs/omfs/inode.c | 3 | ||||
-rw-r--r-- | fs/proc/base.c | 11 | ||||
-rw-r--r-- | fs/reiserfs/inode.c | 2 | ||||
-rw-r--r-- | fs/reiserfs/journal.c | 6 | ||||
-rw-r--r-- | fs/splice.c | 2 | ||||
-rw-r--r-- | fs/ufs/super.c | 2 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.c | 6 | ||||
-rw-r--r-- | include/asm-m68k/contregs.h | 51 | ||||
-rw-r--r-- | include/asm-m68k/fbio.h | 331 | ||||
-rw-r--r-- | include/asm-m68k/idprom.h | 21 | ||||
-rw-r--r-- | include/linux/buffer_head.h | 8 | ||||
-rw-r--r-- | include/linux/ide.h | 40 | ||||
-rw-r--r-- | include/linux/ieee80211.h | 13 | ||||
-rw-r--r-- | include/linux/ihex.h | 2 | ||||
-rw-r--r-- | include/linux/interrupt.h | 29 | ||||
-rw-r--r-- | include/linux/kexec.h | 4 | ||||
-rw-r--r-- | include/linux/mISDNif.h | 32 | ||||
-rw-r--r-- | include/linux/maple.h | 8 | ||||
-rw-r--r-- | include/linux/netdevice.h | 4 | ||||
-rw-r--r-- | include/linux/page-flags.h | 2 | ||||
-rw-r--r-- | include/linux/pagemap.h | 67 | ||||
-rw-r--r-- | include/linux/parser.h | 2 | ||||
-rw-r--r-- | include/linux/pm_qos_params.h | 2 | ||||
-rw-r--r-- | include/linux/spi/orion_spi.h | 17 | ||||
-rw-r--r-- | include/linux/tracehook.h | 5 | ||||
-rw-r--r-- | include/linux/vt_kern.h | 1 | ||||
-rw-r--r-- | include/net/dst.h | 12 | ||||
-rw-r--r-- | include/net/flow.h | 1 | ||||
-rw-r--r-- | include/net/mac80211.h | 13 | ||||
-rw-r--r-- | include/net/sch_generic.h | 26 | ||||
-rw-r--r-- | include/net/sctp/structs.h | 3 | ||||
-rw-r--r-- | include/video/radeon.h | 5 | ||||
-rw-r--r-- | init/main.c | 1 | ||||
-rw-r--r-- | kernel/auditsc.c | 7 | ||||
-rw-r--r-- | kernel/dma-coherent.c | 5 | ||||
-rw-r--r-- | kernel/irq/manage.c | 3 | ||||
-rw-r--r-- | kernel/pm_qos_params.c | 16 | ||||
-rw-r--r-- | kernel/relay.c | 12 | ||||
-rw-r--r-- | kernel/sched.c | 22 | ||||
-rw-r--r-- | kernel/semaphore.c | 4 | ||||
-rw-r--r-- | mm/filemap.c | 12 | ||||
-rw-r--r-- | mm/memory.c | 18 | ||||
-rw-r--r-- | mm/migrate.c | 4 | ||||
-rw-r--r-- | mm/mlock.c | 2 | ||||
-rw-r--r-- | mm/mm_init.c | 8 | ||||
-rw-r--r-- | mm/mmap.c | 2 | ||||
-rw-r--r-- | mm/nommu.c | 21 | ||||
-rw-r--r-- | mm/rmap.c | 2 | ||||
-rw-r--r-- | mm/shmem.c | 4 | ||||
-rw-r--r-- | mm/swap.c | 2 | ||||
-rw-r--r-- | mm/swap_state.c | 8 | ||||
-rw-r--r-- | mm/swapfile.c | 2 | ||||
-rw-r--r-- | mm/truncate.c | 4 | ||||
-rw-r--r-- | mm/vmscan.c | 4 | ||||
-rw-r--r-- | net/ax25/sysctl_net_ax25.c | 14 | ||||
-rw-r--r-- | net/bridge/br_netfilter.c | 2 | ||||
-rw-r--r-- | net/bridge/br_stp.c | 25 | ||||
-rw-r--r-- | net/core/dev.c | 32 | ||||
-rw-r--r-- | net/core/neighbour.c | 13 | ||||
-rw-r--r-- | net/core/pktgen.c | 10 | ||||
-rw-r--r-- | net/ipv4/sysctl_net_ipv4.c | 1 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 2 | ||||
-rw-r--r-- | net/ipv6/ipv6_sockglue.c | 2 | ||||
-rw-r--r-- | net/ipv6/syncookies.c | 22 | ||||
-rw-r--r-- | net/mac80211/ieee80211_i.h | 2 | ||||
-rw-r--r-- | net/mac80211/main.c | 5 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 39 | ||||
-rw-r--r-- | net/mac80211/tx.c | 17 | ||||
-rw-r--r-- | net/mac80211/util.c | 1 | ||||
-rw-r--r-- | net/mac80211/wme.c | 6 | ||||
-rw-r--r-- | net/rfkill/rfkill-input.c | 54 | ||||
-rw-r--r-- | net/rfkill/rfkill.c | 15 | ||||
-rw-r--r-- | net/sched/sch_atm.c | 14 | ||||
-rw-r--r-- | net/sched/sch_cbq.c | 27 | ||||
-rw-r--r-- | net/sched/sch_dsmark.c | 10 | ||||
-rw-r--r-- | net/sched/sch_generic.c | 12 | ||||
-rw-r--r-- | net/sched/sch_hfsc.c | 12 | ||||
-rw-r--r-- | net/sched/sch_htb.c | 24 | ||||
-rw-r--r-- | net/sched/sch_netem.c | 5 | ||||
-rw-r--r-- | net/sched/sch_prio.c | 14 | ||||
-rw-r--r-- | net/sched/sch_red.c | 2 | ||||
-rw-r--r-- | net/sched/sch_sfq.c | 8 | ||||
-rw-r--r-- | net/sched/sch_tbf.c | 3 | ||||
-rw-r--r-- | net/sctp/ipv6.c | 8 | ||||
-rw-r--r-- | net/sctp/output.c | 6 | ||||
-rw-r--r-- | net/sctp/protocol.c | 9 | ||||
-rw-r--r-- | scripts/kconfig/conf.c | 2 | ||||
-rw-r--r-- | scripts/kconfig/confdata.c | 8 | ||||
-rwxr-xr-x | scripts/kernel-doc | 2 | ||||
-rw-r--r-- | sound/core/seq/oss/seq_oss_synth.c | 3 |
703 files changed, 5269 insertions, 3411 deletions
diff --git a/Documentation/00-INDEX b/Documentation/00-INDEX index 6de71308a906..5b5aba404aac 100644 --- a/Documentation/00-INDEX +++ b/Documentation/00-INDEX | |||
@@ -89,8 +89,6 @@ cciss.txt | |||
89 | - info, major/minor #'s for Compaq's SMART Array Controllers. | 89 | - info, major/minor #'s for Compaq's SMART Array Controllers. |
90 | cdrom/ | 90 | cdrom/ |
91 | - directory with information on the CD-ROM drivers that Linux has. | 91 | - directory with information on the CD-ROM drivers that Linux has. |
92 | cli-sti-removal.txt | ||
93 | - cli()/sti() removal guide. | ||
94 | computone.txt | 92 | computone.txt |
95 | - info on Computone Intelliport II/Plus Multiport Serial Driver. | 93 | - info on Computone Intelliport II/Plus Multiport Serial Driver. |
96 | connector/ | 94 | connector/ |
diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile index 0eb0d027eb32..1d1b34500b69 100644 --- a/Documentation/DocBook/Makefile +++ b/Documentation/DocBook/Makefile | |||
@@ -12,7 +12,7 @@ DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \ | |||
12 | kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \ | 12 | kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \ |
13 | gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \ | 13 | gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \ |
14 | genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \ | 14 | genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \ |
15 | mac80211.xml debugobjects.xml | 15 | mac80211.xml debugobjects.xml sh.xml |
16 | 16 | ||
17 | ### | 17 | ### |
18 | # The build process is as follows (targets): | 18 | # The build process is as follows (targets): |
diff --git a/Documentation/DocBook/s390-drivers.tmpl b/Documentation/DocBook/s390-drivers.tmpl index 4acc73240a6d..95bfc12e5439 100644 --- a/Documentation/DocBook/s390-drivers.tmpl +++ b/Documentation/DocBook/s390-drivers.tmpl | |||
@@ -100,7 +100,7 @@ | |||
100 | the hardware structures represented here, please consult the Principles | 100 | the hardware structures represented here, please consult the Principles |
101 | of Operation. | 101 | of Operation. |
102 | </para> | 102 | </para> |
103 | !Iinclude/asm-s390/cio.h | 103 | !Iarch/s390/include/asm/cio.h |
104 | </sect1> | 104 | </sect1> |
105 | <sect1 id="ccwdev"> | 105 | <sect1 id="ccwdev"> |
106 | <title>ccw devices</title> | 106 | <title>ccw devices</title> |
@@ -114,7 +114,7 @@ | |||
114 | ccw device structure. Device drivers must not bypass those functions | 114 | ccw device structure. Device drivers must not bypass those functions |
115 | or strange side effects may happen. | 115 | or strange side effects may happen. |
116 | </para> | 116 | </para> |
117 | !Iinclude/asm-s390/ccwdev.h | 117 | !Iarch/s390/include/asm/ccwdev.h |
118 | !Edrivers/s390/cio/device.c | 118 | !Edrivers/s390/cio/device.c |
119 | !Edrivers/s390/cio/device_ops.c | 119 | !Edrivers/s390/cio/device_ops.c |
120 | </sect1> | 120 | </sect1> |
@@ -125,7 +125,7 @@ | |||
125 | measurement data which is made available by the channel subsystem | 125 | measurement data which is made available by the channel subsystem |
126 | for each channel attached device. | 126 | for each channel attached device. |
127 | </para> | 127 | </para> |
128 | !Iinclude/asm-s390/cmb.h | 128 | !Iarch/s390/include/asm/cmb.h |
129 | !Edrivers/s390/cio/cmf.c | 129 | !Edrivers/s390/cio/cmf.c |
130 | </sect1> | 130 | </sect1> |
131 | </chapter> | 131 | </chapter> |
@@ -142,7 +142,7 @@ | |||
142 | </para> | 142 | </para> |
143 | <sect1 id="ccwgroupdevices"> | 143 | <sect1 id="ccwgroupdevices"> |
144 | <title>ccw group devices</title> | 144 | <title>ccw group devices</title> |
145 | !Iinclude/asm-s390/ccwgroup.h | 145 | !Iarch/s390/include/asm/ccwgroup.h |
146 | !Edrivers/s390/cio/ccwgroup.c | 146 | !Edrivers/s390/cio/ccwgroup.c |
147 | </sect1> | 147 | </sect1> |
148 | </chapter> | 148 | </chapter> |
diff --git a/Documentation/DocBook/sh.tmpl b/Documentation/DocBook/sh.tmpl new file mode 100644 index 000000000000..0c3dc4c69dd1 --- /dev/null +++ b/Documentation/DocBook/sh.tmpl | |||
@@ -0,0 +1,105 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | ||
2 | <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" | ||
3 | "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []> | ||
4 | |||
5 | <book id="sh-drivers"> | ||
6 | <bookinfo> | ||
7 | <title>SuperH Interfaces Guide</title> | ||
8 | |||
9 | <authorgroup> | ||
10 | <author> | ||
11 | <firstname>Paul</firstname> | ||
12 | <surname>Mundt</surname> | ||
13 | <affiliation> | ||
14 | <address> | ||
15 | <email>lethal@linux-sh.org</email> | ||
16 | </address> | ||
17 | </affiliation> | ||
18 | </author> | ||
19 | </authorgroup> | ||
20 | |||
21 | <copyright> | ||
22 | <year>2008</year> | ||
23 | <holder>Paul Mundt</holder> | ||
24 | </copyright> | ||
25 | <copyright> | ||
26 | <year>2008</year> | ||
27 | <holder>Renesas Technology Corp.</holder> | ||
28 | </copyright> | ||
29 | |||
30 | <legalnotice> | ||
31 | <para> | ||
32 | This documentation is free software; you can redistribute | ||
33 | it and/or modify it under the terms of the GNU General Public | ||
34 | License version 2 as published by the Free Software Foundation. | ||
35 | </para> | ||
36 | |||
37 | <para> | ||
38 | This program is distributed in the hope that it will be | ||
39 | useful, but WITHOUT ANY WARRANTY; without even the implied | ||
40 | warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
41 | See the GNU General Public License for more details. | ||
42 | </para> | ||
43 | |||
44 | <para> | ||
45 | You should have received a copy of the GNU General Public | ||
46 | License along with this program; if not, write to the Free | ||
47 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||
48 | MA 02111-1307 USA | ||
49 | </para> | ||
50 | |||
51 | <para> | ||
52 | For more details see the file COPYING in the source | ||
53 | distribution of Linux. | ||
54 | </para> | ||
55 | </legalnotice> | ||
56 | </bookinfo> | ||
57 | |||
58 | <toc></toc> | ||
59 | |||
60 | <chapter id="mm"> | ||
61 | <title>Memory Management</title> | ||
62 | <sect1 id="sh4"> | ||
63 | <title>SH-4</title> | ||
64 | <sect2 id="sq"> | ||
65 | <title>Store Queue API</title> | ||
66 | !Earch/sh/kernel/cpu/sh4/sq.c | ||
67 | </sect2> | ||
68 | </sect1> | ||
69 | <sect1 id="sh5"> | ||
70 | <title>SH-5</title> | ||
71 | <sect2 id="tlb"> | ||
72 | <title>TLB Interfaces</title> | ||
73 | !Iarch/sh/mm/tlb-sh5.c | ||
74 | !Iarch/sh/include/asm/tlb_64.h | ||
75 | </sect2> | ||
76 | </sect1> | ||
77 | </chapter> | ||
78 | <chapter id="clk"> | ||
79 | <title>Clock Framework Extensions</title> | ||
80 | !Iarch/sh/include/asm/clock.h | ||
81 | </chapter> | ||
82 | <chapter id="mach"> | ||
83 | <title>Machine Specific Interfaces</title> | ||
84 | <sect1 id="dreamcast"> | ||
85 | <title>mach-dreamcast</title> | ||
86 | !Iarch/sh/boards/mach-dreamcast/rtc.c | ||
87 | </sect1> | ||
88 | <sect1 id="x3proto"> | ||
89 | <title>mach-x3proto</title> | ||
90 | !Earch/sh/boards/mach-x3proto/ilsel.c | ||
91 | </sect1> | ||
92 | </chapter> | ||
93 | <chapter id="busses"> | ||
94 | <title>Busses</title> | ||
95 | <sect1 id="superhyway"> | ||
96 | <title>SuperHyway</title> | ||
97 | !Edrivers/sh/superhyway/superhyway.c | ||
98 | </sect1> | ||
99 | |||
100 | <sect1 id="maple"> | ||
101 | <title>Maple</title> | ||
102 | !Edrivers/sh/maple/maple.c | ||
103 | </sect1> | ||
104 | </chapter> | ||
105 | </book> | ||
diff --git a/Documentation/DocBook/videobook.tmpl b/Documentation/DocBook/videobook.tmpl index 89817795e668..0bc25949b668 100644 --- a/Documentation/DocBook/videobook.tmpl +++ b/Documentation/DocBook/videobook.tmpl | |||
@@ -1648,7 +1648,7 @@ static struct video_buffer capture_fb; | |||
1648 | 1648 | ||
1649 | <chapter id="pubfunctions"> | 1649 | <chapter id="pubfunctions"> |
1650 | <title>Public Functions Provided</title> | 1650 | <title>Public Functions Provided</title> |
1651 | !Edrivers/media/video/videodev.c | 1651 | !Edrivers/media/video/v4l2-dev.c |
1652 | </chapter> | 1652 | </chapter> |
1653 | 1653 | ||
1654 | </book> | 1654 | </book> |
diff --git a/Documentation/cli-sti-removal.txt b/Documentation/cli-sti-removal.txt deleted file mode 100644 index 60932b02fcb3..000000000000 --- a/Documentation/cli-sti-removal.txt +++ /dev/null | |||
@@ -1,133 +0,0 @@ | |||
1 | |||
2 | #### cli()/sti() removal guide, started by Ingo Molnar <mingo@redhat.com> | ||
3 | |||
4 | |||
5 | as of 2.5.28, five popular macros have been removed on SMP, and | ||
6 | are being phased out on UP: | ||
7 | |||
8 | cli(), sti(), save_flags(flags), save_flags_cli(flags), restore_flags(flags) | ||
9 | |||
10 | until now it was possible to protect driver code against interrupt | ||
11 | handlers via a cli(), but from now on other, more lightweight methods | ||
12 | have to be used for synchronization, such as spinlocks or semaphores. | ||
13 | |||
14 | for example, driver code that used to do something like: | ||
15 | |||
16 | struct driver_data; | ||
17 | |||
18 | irq_handler (...) | ||
19 | { | ||
20 | .... | ||
21 | driver_data.finish = 1; | ||
22 | driver_data.new_work = 0; | ||
23 | .... | ||
24 | } | ||
25 | |||
26 | ... | ||
27 | |||
28 | ioctl_func (...) | ||
29 | { | ||
30 | ... | ||
31 | cli(); | ||
32 | ... | ||
33 | driver_data.finish = 0; | ||
34 | driver_data.new_work = 2; | ||
35 | ... | ||
36 | sti(); | ||
37 | ... | ||
38 | } | ||
39 | |||
40 | was SMP-correct because the cli() function ensured that no | ||
41 | interrupt handler (amongst them the above irq_handler()) function | ||
42 | would execute while the cli()-ed section is executing. | ||
43 | |||
44 | but from now on a more direct method of locking has to be used: | ||
45 | |||
46 | DEFINE_SPINLOCK(driver_lock); | ||
47 | struct driver_data; | ||
48 | |||
49 | irq_handler (...) | ||
50 | { | ||
51 | unsigned long flags; | ||
52 | .... | ||
53 | spin_lock_irqsave(&driver_lock, flags); | ||
54 | .... | ||
55 | driver_data.finish = 1; | ||
56 | driver_data.new_work = 0; | ||
57 | .... | ||
58 | spin_unlock_irqrestore(&driver_lock, flags); | ||
59 | .... | ||
60 | } | ||
61 | |||
62 | ... | ||
63 | |||
64 | ioctl_func (...) | ||
65 | { | ||
66 | ... | ||
67 | spin_lock_irq(&driver_lock); | ||
68 | ... | ||
69 | driver_data.finish = 0; | ||
70 | driver_data.new_work = 2; | ||
71 | ... | ||
72 | spin_unlock_irq(&driver_lock); | ||
73 | ... | ||
74 | } | ||
75 | |||
76 | the above code has a number of advantages: | ||
77 | |||
78 | - the locking relation is easier to understand - actual lock usage | ||
79 | pinpoints the critical sections. cli() usage is too opaque. | ||
80 | Easier to understand means it's easier to debug. | ||
81 | |||
82 | - it's faster, because spinlocks are faster to acquire than the | ||
83 | potentially heavily-used IRQ lock. Furthermore, your driver does | ||
84 | not have to wait eg. for a big heavy SCSI interrupt to finish, | ||
85 | because the driver_lock spinlock is only used by your driver. | ||
86 | cli() on the other hand was used by many drivers, and extended | ||
87 | the critical section to the whole IRQ handler function - creating | ||
88 | serious lock contention. | ||
89 | |||
90 | |||
91 | to make the transition easier, we've still kept the cli(), sti(), | ||
92 | save_flags(), save_flags_cli() and restore_flags() macros defined | ||
93 | on UP systems - but their usage will be phased out until 2.6 is | ||
94 | released. | ||
95 | |||
96 | drivers that want to disable local interrupts (interrupts on the | ||
97 | current CPU), can use the following five macros: | ||
98 | |||
99 | local_irq_disable(), local_irq_enable(), local_save_flags(flags), | ||
100 | local_irq_save(flags), local_irq_restore(flags) | ||
101 | |||
102 | but beware, their meaning and semantics are much simpler, far from | ||
103 | that of the old cli(), sti(), save_flags(flags) and restore_flags(flags) | ||
104 | SMP meaning: | ||
105 | |||
106 | local_irq_disable() => turn local IRQs off | ||
107 | |||
108 | local_irq_enable() => turn local IRQs on | ||
109 | |||
110 | local_save_flags(flags) => save the current IRQ state into flags. The | ||
111 | state can be on or off. (on some | ||
112 | architectures there's even more bits in it.) | ||
113 | |||
114 | local_irq_save(flags) => save the current IRQ state into flags and | ||
115 | disable interrupts. | ||
116 | |||
117 | local_irq_restore(flags) => restore the IRQ state from flags. | ||
118 | |||
119 | (local_irq_save can save both irqs on and irqs off state, and | ||
120 | local_irq_restore can restore into both irqs on and irqs off state.) | ||
121 | |||
122 | another related change is that synchronize_irq() now takes a parameter: | ||
123 | synchronize_irq(irq). This change too has the purpose of making SMP | ||
124 | synchronization more lightweight - this way you can wait for your own | ||
125 | interrupt handler to finish, no need to wait for other IRQ sources. | ||
126 | |||
127 | |||
128 | why were these changes done? The main reason was the architectural burden | ||
129 | of maintaining the cli()/sti() interface - it became a real problem. The | ||
130 | new interrupt system is much more streamlined, easier to understand, debug, | ||
131 | and it's also a bit faster - the same happened to it that will happen to | ||
132 | cli()/sti() using drivers once they convert to spinlocks :-) | ||
133 | |||
diff --git a/Documentation/power/pm_qos_interface.txt b/Documentation/power/pm_qos_interface.txt index 49adb1a33514..c40866e8b957 100644 --- a/Documentation/power/pm_qos_interface.txt +++ b/Documentation/power/pm_qos_interface.txt | |||
@@ -1,4 +1,4 @@ | |||
1 | PM quality of Service interface. | 1 | PM Quality Of Service Interface. |
2 | 2 | ||
3 | This interface provides a kernel and user mode interface for registering | 3 | This interface provides a kernel and user mode interface for registering |
4 | performance expectations by drivers, subsystems and user space applications on | 4 | performance expectations by drivers, subsystems and user space applications on |
@@ -7,6 +7,11 @@ one of the parameters. | |||
7 | Currently we have {cpu_dma_latency, network_latency, network_throughput} as the | 7 | Currently we have {cpu_dma_latency, network_latency, network_throughput} as the |
8 | initial set of pm_qos parameters. | 8 | initial set of pm_qos parameters. |
9 | 9 | ||
10 | Each parameters have defined units: | ||
11 | * latency: usec | ||
12 | * timeout: usec | ||
13 | * throughput: kbs (kilo bit / sec) | ||
14 | |||
10 | The infrastructure exposes multiple misc device nodes one per implemented | 15 | The infrastructure exposes multiple misc device nodes one per implemented |
11 | parameter. The set of parameters implement is defined by pm_qos_power_init() | 16 | parameter. The set of parameters implement is defined by pm_qos_power_init() |
12 | and pm_qos_params.h. This is done because having the available parameters | 17 | and pm_qos_params.h. This is done because having the available parameters |
diff --git a/Documentation/powerpc/booting-without-of.txt b/Documentation/powerpc/booting-without-of.txt index 928a79ceb7aa..de4063cb4fdc 100644 --- a/Documentation/powerpc/booting-without-of.txt +++ b/Documentation/powerpc/booting-without-of.txt | |||
@@ -278,7 +278,7 @@ it with special cases. | |||
278 | a 64-bit platform. | 278 | a 64-bit platform. |
279 | 279 | ||
280 | d) request and get assigned a platform number (see PLATFORM_* | 280 | d) request and get assigned a platform number (see PLATFORM_* |
281 | constants in include/asm-powerpc/processor.h | 281 | constants in arch/powerpc/include/asm/processor.h |
282 | 282 | ||
283 | 32-bit embedded kernels: | 283 | 32-bit embedded kernels: |
284 | 284 | ||
@@ -340,7 +340,7 @@ the block to RAM before passing it to the kernel. | |||
340 | --------- | 340 | --------- |
341 | 341 | ||
342 | The kernel is entered with r3 pointing to an area of memory that is | 342 | The kernel is entered with r3 pointing to an area of memory that is |
343 | roughly described in include/asm-powerpc/prom.h by the structure | 343 | roughly described in arch/powerpc/include/asm/prom.h by the structure |
344 | boot_param_header: | 344 | boot_param_header: |
345 | 345 | ||
346 | struct boot_param_header { | 346 | struct boot_param_header { |
diff --git a/Documentation/powerpc/eeh-pci-error-recovery.txt b/Documentation/powerpc/eeh-pci-error-recovery.txt index df7afe43d462..9d4e33df624c 100644 --- a/Documentation/powerpc/eeh-pci-error-recovery.txt +++ b/Documentation/powerpc/eeh-pci-error-recovery.txt | |||
@@ -133,7 +133,7 @@ error. Given an arbitrary address, the routine | |||
133 | pci_get_device_by_addr() will find the pci device associated | 133 | pci_get_device_by_addr() will find the pci device associated |
134 | with that address (if any). | 134 | with that address (if any). |
135 | 135 | ||
136 | The default include/asm-powerpc/io.h macros readb(), inb(), insb(), | 136 | The default arch/powerpc/include/asm/io.h macros readb(), inb(), insb(), |
137 | etc. include a check to see if the i/o read returned all-0xff's. | 137 | etc. include a check to see if the i/o read returned all-0xff's. |
138 | If so, these make a call to eeh_dn_check_failure(), which in turn | 138 | If so, these make a call to eeh_dn_check_failure(), which in turn |
139 | asks the firmware if the all-ff's value is the sign of a true EEH | 139 | asks the firmware if the all-ff's value is the sign of a true EEH |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 2 | 1 | VERSION = 2 |
2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
3 | SUBLEVEL = 27 | 3 | SUBLEVEL = 27 |
4 | EXTRAVERSION = -rc1 | 4 | EXTRAVERSION = -rc2 |
5 | NAME = Rotary Wombat | 5 | NAME = Rotary Wombat |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/m68k/mac/baboon.c b/arch/m68k/mac/baboon.c index dae9c982aa89..c7b25b0aacff 100644 --- a/arch/m68k/mac/baboon.c +++ b/arch/m68k/mac/baboon.c | |||
@@ -11,7 +11,6 @@ | |||
11 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
12 | #include <linux/delay.h> | 12 | #include <linux/delay.h> |
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/ide.h> | ||
15 | 14 | ||
16 | #include <asm/traps.h> | 15 | #include <asm/traps.h> |
17 | #include <asm/bootinfo.h> | 16 | #include <asm/bootinfo.h> |
diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c index f3b27d04a31f..1bdb03c73c0f 100644 --- a/arch/m68k/mac/via.c +++ b/arch/m68k/mac/via.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/mm.h> | 27 | #include <linux/mm.h> |
28 | #include <linux/delay.h> | 28 | #include <linux/delay.h> |
29 | #include <linux/init.h> | 29 | #include <linux/init.h> |
30 | #include <linux/ide.h> | ||
31 | #include <linux/module.h> | 30 | #include <linux/module.h> |
32 | 31 | ||
33 | #include <asm/bootinfo.h> | 32 | #include <asm/bootinfo.h> |
diff --git a/arch/mips/emma2rh/markeins/setup.c b/arch/mips/emma2rh/markeins/setup.c index a56c4b804b07..822a20e21fa4 100644 --- a/arch/mips/emma2rh/markeins/setup.c +++ b/arch/mips/emma2rh/markeins/setup.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/types.h> | 27 | #include <linux/types.h> |
28 | #include <linux/initrd.h> | 28 | #include <linux/initrd.h> |
29 | #include <linux/irq.h> | 29 | #include <linux/irq.h> |
30 | #include <linux/ide.h> | ||
31 | #include <linux/ioport.h> | 30 | #include <linux/ioport.h> |
32 | #include <linux/param.h> /* for HZ */ | 31 | #include <linux/param.h> /* for HZ */ |
33 | #include <linux/root_dev.h> | 32 | #include <linux/root_dev.h> |
diff --git a/arch/mips/jazz/setup.c b/arch/mips/jazz/setup.c index f60524e8bc44..b59ba6b93cdd 100644 --- a/arch/mips/jazz/setup.c +++ b/arch/mips/jazz/setup.c | |||
@@ -10,7 +10,6 @@ | |||
10 | * Copyright (C) 2007 by Thomas Bogendoerfer | 10 | * Copyright (C) 2007 by Thomas Bogendoerfer |
11 | */ | 11 | */ |
12 | #include <linux/eisa.h> | 12 | #include <linux/eisa.h> |
13 | #include <linux/hdreg.h> | ||
14 | #include <linux/init.h> | 13 | #include <linux/init.h> |
15 | #include <linux/ioport.h> | 14 | #include <linux/ioport.h> |
16 | #include <linux/sched.h> | 15 | #include <linux/sched.h> |
@@ -18,7 +17,6 @@ | |||
18 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
19 | #include <linux/console.h> | 18 | #include <linux/console.h> |
20 | #include <linux/fb.h> | 19 | #include <linux/fb.h> |
21 | #include <linux/ide.h> | ||
22 | #include <linux/pm.h> | 20 | #include <linux/pm.h> |
23 | #include <linux/screen_info.h> | 21 | #include <linux/screen_info.h> |
24 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
diff --git a/arch/mn10300/kernel/module.c b/arch/mn10300/kernel/module.c index 0e4d2f6fa6e8..8fa36893df7a 100644 --- a/arch/mn10300/kernel/module.c +++ b/arch/mn10300/kernel/module.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/fs.h> | 24 | #include <linux/fs.h> |
25 | #include <linux/string.h> | 25 | #include <linux/string.h> |
26 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
27 | #include <linux/bug.h> | ||
27 | 28 | ||
28 | #if 0 | 29 | #if 0 |
29 | #define DEBUGP printk | 30 | #define DEBUGP printk |
@@ -195,7 +196,7 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
195 | const Elf_Shdr *sechdrs, | 196 | const Elf_Shdr *sechdrs, |
196 | struct module *me) | 197 | struct module *me) |
197 | { | 198 | { |
198 | return 0; | 199 | return module_bug_finalize(hdr, sechdrs, me); |
199 | } | 200 | } |
200 | 201 | ||
201 | /* | 202 | /* |
@@ -203,4 +204,5 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
203 | */ | 204 | */ |
204 | void module_arch_cleanup(struct module *mod) | 205 | void module_arch_cleanup(struct module *mod) |
205 | { | 206 | { |
207 | module_bug_cleanup(mod); | ||
206 | } | 208 | } |
diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 8c8aadbe9563..4ebc52a19f0a 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug | |||
@@ -97,7 +97,7 @@ config IRQSTACKS | |||
97 | 97 | ||
98 | config VIRQ_DEBUG | 98 | config VIRQ_DEBUG |
99 | bool "Expose hardware/virtual IRQ mapping via debugfs" | 99 | bool "Expose hardware/virtual IRQ mapping via debugfs" |
100 | depends on DEBUG_FS && PPC_MERGE | 100 | depends on DEBUG_FS |
101 | help | 101 | help |
102 | This option will show the mapping relationship between hardware irq | 102 | This option will show the mapping relationship between hardware irq |
103 | numbers and virtual irq numbers. The mapping is exposed via debugfs | 103 | numbers and virtual irq numbers. The mapping is exposed via debugfs |
diff --git a/arch/powerpc/boot/dts/mpc8610_hpcd.dts b/arch/powerpc/boot/dts/mpc8610_hpcd.dts index 666185f59459..3b3a1062cb25 100644 --- a/arch/powerpc/boot/dts/mpc8610_hpcd.dts +++ b/arch/powerpc/boot/dts/mpc8610_hpcd.dts | |||
@@ -202,6 +202,11 @@ | |||
202 | fsl,has-rstcr; | 202 | fsl,has-rstcr; |
203 | }; | 203 | }; |
204 | 204 | ||
205 | wdt@e4000 { | ||
206 | compatible = "fsl,mpc8610-wdt"; | ||
207 | reg = <0xe4000 0x100>; | ||
208 | }; | ||
209 | |||
205 | i2s@16000 { | 210 | i2s@16000 { |
206 | compatible = "fsl,mpc8610-ssi"; | 211 | compatible = "fsl,mpc8610-ssi"; |
207 | cell-index = <0>; | 212 | cell-index = <0>; |
diff --git a/arch/powerpc/boot/io.h b/arch/powerpc/boot/io.h index ccaedaec50d5..7c09f4861fe1 100644 --- a/arch/powerpc/boot/io.h +++ b/arch/powerpc/boot/io.h | |||
@@ -6,7 +6,7 @@ | |||
6 | /* | 6 | /* |
7 | * Low-level I/O routines. | 7 | * Low-level I/O routines. |
8 | * | 8 | * |
9 | * Copied from <file:include/asm-powerpc/io.h> (which has no copyright) | 9 | * Copied from <file:arch/powerpc/include/asm/io.h> (which has no copyright) |
10 | */ | 10 | */ |
11 | static inline int in_8(const volatile unsigned char *addr) | 11 | static inline int in_8(const volatile unsigned char *addr) |
12 | { | 12 | { |
diff --git a/include/asm-powerpc/8253pit.h b/arch/powerpc/include/asm/8253pit.h index b70d6e53b303..b70d6e53b303 100644 --- a/include/asm-powerpc/8253pit.h +++ b/arch/powerpc/include/asm/8253pit.h | |||
diff --git a/include/asm-powerpc/8xx_immap.h b/arch/powerpc/include/asm/8xx_immap.h index 4b0e15206006..4b0e15206006 100644 --- a/include/asm-powerpc/8xx_immap.h +++ b/arch/powerpc/include/asm/8xx_immap.h | |||
diff --git a/include/asm-powerpc/Kbuild b/arch/powerpc/include/asm/Kbuild index 5ab7d7fe198c..5ab7d7fe198c 100644 --- a/include/asm-powerpc/Kbuild +++ b/arch/powerpc/include/asm/Kbuild | |||
diff --git a/include/asm-powerpc/a.out.h b/arch/powerpc/include/asm/a.out.h index 89cead6b176e..89cead6b176e 100644 --- a/include/asm-powerpc/a.out.h +++ b/arch/powerpc/include/asm/a.out.h | |||
diff --git a/include/asm-powerpc/abs_addr.h b/arch/powerpc/include/asm/abs_addr.h index 98324c5a8286..98324c5a8286 100644 --- a/include/asm-powerpc/abs_addr.h +++ b/arch/powerpc/include/asm/abs_addr.h | |||
diff --git a/include/asm-powerpc/agp.h b/arch/powerpc/include/asm/agp.h index 86455c4c31ee..86455c4c31ee 100644 --- a/include/asm-powerpc/agp.h +++ b/arch/powerpc/include/asm/agp.h | |||
diff --git a/include/asm-powerpc/asm-compat.h b/arch/powerpc/include/asm/asm-compat.h index 8f0fe7971949..8f0fe7971949 100644 --- a/include/asm-powerpc/asm-compat.h +++ b/arch/powerpc/include/asm/asm-compat.h | |||
diff --git a/include/asm-powerpc/atomic.h b/arch/powerpc/include/asm/atomic.h index f3fc733758f5..f3fc733758f5 100644 --- a/include/asm-powerpc/atomic.h +++ b/arch/powerpc/include/asm/atomic.h | |||
diff --git a/include/asm-powerpc/auxvec.h b/arch/powerpc/include/asm/auxvec.h index 19a099b62cd6..19a099b62cd6 100644 --- a/include/asm-powerpc/auxvec.h +++ b/arch/powerpc/include/asm/auxvec.h | |||
diff --git a/include/asm-powerpc/backlight.h b/arch/powerpc/include/asm/backlight.h index 8cf5c37c3817..8cf5c37c3817 100644 --- a/include/asm-powerpc/backlight.h +++ b/arch/powerpc/include/asm/backlight.h | |||
diff --git a/include/asm-powerpc/bitops.h b/arch/powerpc/include/asm/bitops.h index 897eade3afbe..897eade3afbe 100644 --- a/include/asm-powerpc/bitops.h +++ b/arch/powerpc/include/asm/bitops.h | |||
diff --git a/include/asm-powerpc/bootx.h b/arch/powerpc/include/asm/bootx.h index 57b82e3f89ce..57b82e3f89ce 100644 --- a/include/asm-powerpc/bootx.h +++ b/arch/powerpc/include/asm/bootx.h | |||
diff --git a/include/asm-powerpc/btext.h b/arch/powerpc/include/asm/btext.h index 906f46e31006..906f46e31006 100644 --- a/include/asm-powerpc/btext.h +++ b/arch/powerpc/include/asm/btext.h | |||
diff --git a/include/asm-powerpc/bug.h b/arch/powerpc/include/asm/bug.h index e55d1f66b86f..e55d1f66b86f 100644 --- a/include/asm-powerpc/bug.h +++ b/arch/powerpc/include/asm/bug.h | |||
diff --git a/include/asm-powerpc/bugs.h b/arch/powerpc/include/asm/bugs.h index 42fdb73e3068..42fdb73e3068 100644 --- a/include/asm-powerpc/bugs.h +++ b/arch/powerpc/include/asm/bugs.h | |||
diff --git a/include/asm-powerpc/byteorder.h b/arch/powerpc/include/asm/byteorder.h index b37752214a16..b37752214a16 100644 --- a/include/asm-powerpc/byteorder.h +++ b/arch/powerpc/include/asm/byteorder.h | |||
diff --git a/include/asm-powerpc/cache.h b/arch/powerpc/include/asm/cache.h index 81de6eb3455d..81de6eb3455d 100644 --- a/include/asm-powerpc/cache.h +++ b/arch/powerpc/include/asm/cache.h | |||
diff --git a/include/asm-powerpc/cacheflush.h b/arch/powerpc/include/asm/cacheflush.h index ba667a383b8c..ba667a383b8c 100644 --- a/include/asm-powerpc/cacheflush.h +++ b/arch/powerpc/include/asm/cacheflush.h | |||
diff --git a/include/asm-powerpc/cell-pmu.h b/arch/powerpc/include/asm/cell-pmu.h index 8066eede3a0c..8066eede3a0c 100644 --- a/include/asm-powerpc/cell-pmu.h +++ b/arch/powerpc/include/asm/cell-pmu.h | |||
diff --git a/include/asm-powerpc/cell-regs.h b/arch/powerpc/include/asm/cell-regs.h index fd6fd00434ef..fd6fd00434ef 100644 --- a/include/asm-powerpc/cell-regs.h +++ b/arch/powerpc/include/asm/cell-regs.h | |||
diff --git a/include/asm-powerpc/checksum.h b/arch/powerpc/include/asm/checksum.h index 7cdf358337cf..7cdf358337cf 100644 --- a/include/asm-powerpc/checksum.h +++ b/arch/powerpc/include/asm/checksum.h | |||
diff --git a/include/asm-powerpc/clk_interface.h b/arch/powerpc/include/asm/clk_interface.h index ab1882c1e176..ab1882c1e176 100644 --- a/include/asm-powerpc/clk_interface.h +++ b/arch/powerpc/include/asm/clk_interface.h | |||
diff --git a/include/asm-powerpc/code-patching.h b/arch/powerpc/include/asm/code-patching.h index 107d9b915e33..107d9b915e33 100644 --- a/include/asm-powerpc/code-patching.h +++ b/arch/powerpc/include/asm/code-patching.h | |||
diff --git a/include/asm-powerpc/compat.h b/arch/powerpc/include/asm/compat.h index d811a8cd7b58..d811a8cd7b58 100644 --- a/include/asm-powerpc/compat.h +++ b/arch/powerpc/include/asm/compat.h | |||
diff --git a/include/asm-powerpc/cpm.h b/arch/powerpc/include/asm/cpm.h index 24d79e3abd8e..24d79e3abd8e 100644 --- a/include/asm-powerpc/cpm.h +++ b/arch/powerpc/include/asm/cpm.h | |||
diff --git a/include/asm-powerpc/cpm1.h b/arch/powerpc/include/asm/cpm1.h index 2ff798744c1d..2ff798744c1d 100644 --- a/include/asm-powerpc/cpm1.h +++ b/arch/powerpc/include/asm/cpm1.h | |||
diff --git a/include/asm-powerpc/cpm2.h b/arch/powerpc/include/asm/cpm2.h index 2a6fa0183ac9..2a6fa0183ac9 100644 --- a/include/asm-powerpc/cpm2.h +++ b/arch/powerpc/include/asm/cpm2.h | |||
diff --git a/include/asm-powerpc/cputable.h b/arch/powerpc/include/asm/cputable.h index ef8a248dfd55..ef8a248dfd55 100644 --- a/include/asm-powerpc/cputable.h +++ b/arch/powerpc/include/asm/cputable.h | |||
diff --git a/include/asm-powerpc/cputhreads.h b/arch/powerpc/include/asm/cputhreads.h index fb11b0c459b8..fb11b0c459b8 100644 --- a/include/asm-powerpc/cputhreads.h +++ b/arch/powerpc/include/asm/cputhreads.h | |||
diff --git a/include/asm-powerpc/cputime.h b/arch/powerpc/include/asm/cputime.h index f42e623030ee..f42e623030ee 100644 --- a/include/asm-powerpc/cputime.h +++ b/arch/powerpc/include/asm/cputime.h | |||
diff --git a/include/asm-powerpc/current.h b/arch/powerpc/include/asm/current.h index e2c7f06931e7..e2c7f06931e7 100644 --- a/include/asm-powerpc/current.h +++ b/arch/powerpc/include/asm/current.h | |||
diff --git a/include/asm-powerpc/dbdma.h b/arch/powerpc/include/asm/dbdma.h index e23f07e73cb3..e23f07e73cb3 100644 --- a/include/asm-powerpc/dbdma.h +++ b/arch/powerpc/include/asm/dbdma.h | |||
diff --git a/include/asm-powerpc/dcr-generic.h b/arch/powerpc/include/asm/dcr-generic.h index 35b71599ec46..35b71599ec46 100644 --- a/include/asm-powerpc/dcr-generic.h +++ b/arch/powerpc/include/asm/dcr-generic.h | |||
diff --git a/include/asm-powerpc/dcr-mmio.h b/arch/powerpc/include/asm/dcr-mmio.h index acd491dbd45a..acd491dbd45a 100644 --- a/include/asm-powerpc/dcr-mmio.h +++ b/arch/powerpc/include/asm/dcr-mmio.h | |||
diff --git a/include/asm-powerpc/dcr-native.h b/arch/powerpc/include/asm/dcr-native.h index 72d2b72c7390..72d2b72c7390 100644 --- a/include/asm-powerpc/dcr-native.h +++ b/arch/powerpc/include/asm/dcr-native.h | |||
diff --git a/include/asm-powerpc/dcr-regs.h b/arch/powerpc/include/asm/dcr-regs.h index 29b0ecef980a..29b0ecef980a 100644 --- a/include/asm-powerpc/dcr-regs.h +++ b/arch/powerpc/include/asm/dcr-regs.h | |||
diff --git a/include/asm-powerpc/dcr.h b/arch/powerpc/include/asm/dcr.h index 53b283050ab3..d13fb68bb5c0 100644 --- a/include/asm-powerpc/dcr.h +++ b/arch/powerpc/include/asm/dcr.h | |||
@@ -65,17 +65,13 @@ typedef dcr_host_mmio_t dcr_host_t; | |||
65 | #endif /* defined(CONFIG_PPC_DCR_NATIVE) && defined(CONFIG_PPC_DCR_MMIO) */ | 65 | #endif /* defined(CONFIG_PPC_DCR_NATIVE) && defined(CONFIG_PPC_DCR_MMIO) */ |
66 | 66 | ||
67 | /* | 67 | /* |
68 | * On CONFIG_PPC_MERGE, we have additional helpers to read the DCR | 68 | * additional helpers to read the DCR * base from the device-tree |
69 | * base from the device-tree | ||
70 | */ | 69 | */ |
71 | #ifdef CONFIG_PPC_MERGE | ||
72 | struct device_node; | 70 | struct device_node; |
73 | extern unsigned int dcr_resource_start(struct device_node *np, | 71 | extern unsigned int dcr_resource_start(struct device_node *np, |
74 | unsigned int index); | 72 | unsigned int index); |
75 | extern unsigned int dcr_resource_len(struct device_node *np, | 73 | extern unsigned int dcr_resource_len(struct device_node *np, |
76 | unsigned int index); | 74 | unsigned int index); |
77 | #endif /* CONFIG_PPC_MERGE */ | ||
78 | |||
79 | #endif /* CONFIG_PPC_DCR */ | 75 | #endif /* CONFIG_PPC_DCR */ |
80 | #endif /* __ASSEMBLY__ */ | 76 | #endif /* __ASSEMBLY__ */ |
81 | #endif /* __KERNEL__ */ | 77 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-powerpc/delay.h b/arch/powerpc/include/asm/delay.h index f9200a65c632..f9200a65c632 100644 --- a/include/asm-powerpc/delay.h +++ b/arch/powerpc/include/asm/delay.h | |||
diff --git a/include/asm-powerpc/device.h b/arch/powerpc/include/asm/device.h index 228ab2a315b9..228ab2a315b9 100644 --- a/include/asm-powerpc/device.h +++ b/arch/powerpc/include/asm/device.h | |||
diff --git a/include/asm-powerpc/div64.h b/arch/powerpc/include/asm/div64.h index 6cd978cefb28..6cd978cefb28 100644 --- a/include/asm-powerpc/div64.h +++ b/arch/powerpc/include/asm/div64.h | |||
diff --git a/include/asm-powerpc/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h index c7ca45f97dd2..c7ca45f97dd2 100644 --- a/include/asm-powerpc/dma-mapping.h +++ b/arch/powerpc/include/asm/dma-mapping.h | |||
diff --git a/include/asm-powerpc/dma.h b/arch/powerpc/include/asm/dma.h index a7e06e25c708..a7e06e25c708 100644 --- a/include/asm-powerpc/dma.h +++ b/arch/powerpc/include/asm/dma.h | |||
diff --git a/include/asm-powerpc/edac.h b/arch/powerpc/include/asm/edac.h index 6ead88bbfbb8..6ead88bbfbb8 100644 --- a/include/asm-powerpc/edac.h +++ b/arch/powerpc/include/asm/edac.h | |||
diff --git a/include/asm-powerpc/eeh.h b/arch/powerpc/include/asm/eeh.h index b886bec67016..b886bec67016 100644 --- a/include/asm-powerpc/eeh.h +++ b/arch/powerpc/include/asm/eeh.h | |||
diff --git a/include/asm-powerpc/eeh_event.h b/arch/powerpc/include/asm/eeh_event.h index cc3cb04539ac..cc3cb04539ac 100644 --- a/include/asm-powerpc/eeh_event.h +++ b/arch/powerpc/include/asm/eeh_event.h | |||
diff --git a/include/asm-powerpc/elf.h b/arch/powerpc/include/asm/elf.h index 80d1f399ee51..80d1f399ee51 100644 --- a/include/asm-powerpc/elf.h +++ b/arch/powerpc/include/asm/elf.h | |||
diff --git a/include/asm-powerpc/emergency-restart.h b/arch/powerpc/include/asm/emergency-restart.h index 3711bd9d50bd..3711bd9d50bd 100644 --- a/include/asm-powerpc/emergency-restart.h +++ b/arch/powerpc/include/asm/emergency-restart.h | |||
diff --git a/include/asm-powerpc/errno.h b/arch/powerpc/include/asm/errno.h index 8c145fd17d86..8c145fd17d86 100644 --- a/include/asm-powerpc/errno.h +++ b/arch/powerpc/include/asm/errno.h | |||
diff --git a/include/asm-powerpc/exception.h b/arch/powerpc/include/asm/exception.h index 329148b5acc6..329148b5acc6 100644 --- a/include/asm-powerpc/exception.h +++ b/arch/powerpc/include/asm/exception.h | |||
diff --git a/include/asm-powerpc/fb.h b/arch/powerpc/include/asm/fb.h index 411af8d17a69..411af8d17a69 100644 --- a/include/asm-powerpc/fb.h +++ b/arch/powerpc/include/asm/fb.h | |||
diff --git a/include/asm-powerpc/fcntl.h b/arch/powerpc/include/asm/fcntl.h index ce5c4516d404..ce5c4516d404 100644 --- a/include/asm-powerpc/fcntl.h +++ b/arch/powerpc/include/asm/fcntl.h | |||
diff --git a/include/asm-powerpc/feature-fixups.h b/arch/powerpc/include/asm/feature-fixups.h index a1029967620b..a1029967620b 100644 --- a/include/asm-powerpc/feature-fixups.h +++ b/arch/powerpc/include/asm/feature-fixups.h | |||
diff --git a/include/asm-powerpc/firmware.h b/arch/powerpc/include/asm/firmware.h index 3a179827528d..3a179827528d 100644 --- a/include/asm-powerpc/firmware.h +++ b/arch/powerpc/include/asm/firmware.h | |||
diff --git a/include/asm-powerpc/fixmap.h b/arch/powerpc/include/asm/fixmap.h index 8428b38a3d30..8428b38a3d30 100644 --- a/include/asm-powerpc/fixmap.h +++ b/arch/powerpc/include/asm/fixmap.h | |||
diff --git a/include/asm-powerpc/floppy.h b/arch/powerpc/include/asm/floppy.h index 24bd34c57e9d..24bd34c57e9d 100644 --- a/include/asm-powerpc/floppy.h +++ b/arch/powerpc/include/asm/floppy.h | |||
diff --git a/include/asm-powerpc/fs_pd.h b/arch/powerpc/include/asm/fs_pd.h index 9361cd5342cc..9361cd5342cc 100644 --- a/include/asm-powerpc/fs_pd.h +++ b/arch/powerpc/include/asm/fs_pd.h | |||
diff --git a/include/asm-powerpc/fsl_gtm.h b/arch/powerpc/include/asm/fsl_gtm.h index 8e8c9b5032d3..8e8c9b5032d3 100644 --- a/include/asm-powerpc/fsl_gtm.h +++ b/arch/powerpc/include/asm/fsl_gtm.h | |||
diff --git a/include/asm-powerpc/fsl_lbc.h b/arch/powerpc/include/asm/fsl_lbc.h index 303f5484c050..303f5484c050 100644 --- a/include/asm-powerpc/fsl_lbc.h +++ b/arch/powerpc/include/asm/fsl_lbc.h | |||
diff --git a/include/asm-powerpc/ftrace.h b/arch/powerpc/include/asm/ftrace.h index de921326cca8..de921326cca8 100644 --- a/include/asm-powerpc/ftrace.h +++ b/arch/powerpc/include/asm/ftrace.h | |||
diff --git a/include/asm-powerpc/futex.h b/arch/powerpc/include/asm/futex.h index 6d406c5c5de4..6d406c5c5de4 100644 --- a/include/asm-powerpc/futex.h +++ b/arch/powerpc/include/asm/futex.h | |||
diff --git a/include/asm-powerpc/gpio.h b/arch/powerpc/include/asm/gpio.h index ea04632399d8..ea04632399d8 100644 --- a/include/asm-powerpc/gpio.h +++ b/arch/powerpc/include/asm/gpio.h | |||
diff --git a/include/asm-powerpc/grackle.h b/arch/powerpc/include/asm/grackle.h index bd7812a519d4..bd7812a519d4 100644 --- a/include/asm-powerpc/grackle.h +++ b/arch/powerpc/include/asm/grackle.h | |||
diff --git a/include/asm-powerpc/hardirq.h b/arch/powerpc/include/asm/hardirq.h index 288e14d53b7f..288e14d53b7f 100644 --- a/include/asm-powerpc/hardirq.h +++ b/arch/powerpc/include/asm/hardirq.h | |||
diff --git a/include/asm-powerpc/heathrow.h b/arch/powerpc/include/asm/heathrow.h index 93f54958a9d1..93f54958a9d1 100644 --- a/include/asm-powerpc/heathrow.h +++ b/arch/powerpc/include/asm/heathrow.h | |||
diff --git a/include/asm-powerpc/highmem.h b/arch/powerpc/include/asm/highmem.h index 5d99b6489d56..5d99b6489d56 100644 --- a/include/asm-powerpc/highmem.h +++ b/arch/powerpc/include/asm/highmem.h | |||
diff --git a/include/asm-powerpc/hugetlb.h b/arch/powerpc/include/asm/hugetlb.h index 26f0d0ab27a5..26f0d0ab27a5 100644 --- a/include/asm-powerpc/hugetlb.h +++ b/arch/powerpc/include/asm/hugetlb.h | |||
diff --git a/include/asm-powerpc/hvcall.h b/arch/powerpc/include/asm/hvcall.h index fbe2932fa9e9..fbe2932fa9e9 100644 --- a/include/asm-powerpc/hvcall.h +++ b/arch/powerpc/include/asm/hvcall.h | |||
diff --git a/include/asm-powerpc/hvconsole.h b/arch/powerpc/include/asm/hvconsole.h index 35ea69e8121f..35ea69e8121f 100644 --- a/include/asm-powerpc/hvconsole.h +++ b/arch/powerpc/include/asm/hvconsole.h | |||
diff --git a/include/asm-powerpc/hvcserver.h b/arch/powerpc/include/asm/hvcserver.h index 67d7da3a4da4..67d7da3a4da4 100644 --- a/include/asm-powerpc/hvcserver.h +++ b/arch/powerpc/include/asm/hvcserver.h | |||
diff --git a/include/asm-powerpc/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h index f75a5fc64d2e..f75a5fc64d2e 100644 --- a/include/asm-powerpc/hw_irq.h +++ b/arch/powerpc/include/asm/hw_irq.h | |||
diff --git a/include/asm-powerpc/hydra.h b/arch/powerpc/include/asm/hydra.h index 1ad4eed07fbe..1ad4eed07fbe 100644 --- a/include/asm-powerpc/hydra.h +++ b/arch/powerpc/include/asm/hydra.h | |||
diff --git a/include/asm-powerpc/i8259.h b/arch/powerpc/include/asm/i8259.h index db1362f8c603..105ade297aad 100644 --- a/include/asm-powerpc/i8259.h +++ b/arch/powerpc/include/asm/i8259.h | |||
@@ -4,14 +4,9 @@ | |||
4 | 4 | ||
5 | #include <linux/irq.h> | 5 | #include <linux/irq.h> |
6 | 6 | ||
7 | #ifdef CONFIG_PPC_MERGE | ||
8 | extern void i8259_init(struct device_node *node, unsigned long intack_addr); | 7 | extern void i8259_init(struct device_node *node, unsigned long intack_addr); |
9 | extern unsigned int i8259_irq(void); | 8 | extern unsigned int i8259_irq(void); |
10 | extern struct irq_host *i8259_get_host(void); | 9 | extern struct irq_host *i8259_get_host(void); |
11 | #else | ||
12 | extern void i8259_init(unsigned long intack_addr, int offset); | ||
13 | extern int i8259_irq(void); | ||
14 | #endif | ||
15 | 10 | ||
16 | #endif /* __KERNEL__ */ | 11 | #endif /* __KERNEL__ */ |
17 | #endif /* _ASM_POWERPC_I8259_H */ | 12 | #endif /* _ASM_POWERPC_I8259_H */ |
diff --git a/include/asm-powerpc/ibmebus.h b/arch/powerpc/include/asm/ibmebus.h index 1a9d9aea21fa..1a9d9aea21fa 100644 --- a/include/asm-powerpc/ibmebus.h +++ b/arch/powerpc/include/asm/ibmebus.h | |||
diff --git a/include/asm-powerpc/ide.h b/arch/powerpc/include/asm/ide.h index 1aaf27be8741..048480e340f2 100644 --- a/include/asm-powerpc/ide.h +++ b/arch/powerpc/include/asm/ide.h | |||
@@ -20,7 +20,6 @@ | |||
20 | #define __ide_mm_outsl(p, a, c) writesl((void __iomem *)(p), (a), (c)) | 20 | #define __ide_mm_outsl(p, a, c) writesl((void __iomem *)(p), (a), (c)) |
21 | 21 | ||
22 | #ifndef __powerpc64__ | 22 | #ifndef __powerpc64__ |
23 | #include <linux/hdreg.h> | ||
24 | #include <linux/ioport.h> | 23 | #include <linux/ioport.h> |
25 | 24 | ||
26 | /* FIXME: use ide_platform host driver */ | 25 | /* FIXME: use ide_platform host driver */ |
diff --git a/include/asm-powerpc/immap_86xx.h b/arch/powerpc/include/asm/immap_86xx.h index 0f165e59c326..0f165e59c326 100644 --- a/include/asm-powerpc/immap_86xx.h +++ b/arch/powerpc/include/asm/immap_86xx.h | |||
diff --git a/include/asm-powerpc/immap_cpm2.h b/arch/powerpc/include/asm/immap_cpm2.h index 4080bab0468c..4080bab0468c 100644 --- a/include/asm-powerpc/immap_cpm2.h +++ b/arch/powerpc/include/asm/immap_cpm2.h | |||
diff --git a/include/asm-powerpc/immap_qe.h b/arch/powerpc/include/asm/immap_qe.h index 7b6f411db3e6..3c2fced3ac22 100644 --- a/include/asm-powerpc/immap_qe.h +++ b/arch/powerpc/include/asm/immap_qe.h | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-powerpc/immap_qe.h | ||
3 | * | ||
4 | * QUICC Engine (QE) Internal Memory Map. | 2 | * QUICC Engine (QE) Internal Memory Map. |
5 | * The Internal Memory Map for devices with QE on them. This | 3 | * The Internal Memory Map for devices with QE on them. This |
6 | * is the superset of all QE devices (8360, etc.). | 4 | * is the superset of all QE devices (8360, etc.). |
diff --git a/include/asm-powerpc/io-defs.h b/arch/powerpc/include/asm/io-defs.h index 44d7927aec69..44d7927aec69 100644 --- a/include/asm-powerpc/io-defs.h +++ b/arch/powerpc/include/asm/io-defs.h | |||
diff --git a/include/asm-powerpc/io.h b/arch/powerpc/include/asm/io.h index 77c7fa025e65..77c7fa025e65 100644 --- a/include/asm-powerpc/io.h +++ b/arch/powerpc/include/asm/io.h | |||
diff --git a/include/asm-powerpc/ioctl.h b/arch/powerpc/include/asm/ioctl.h index 57d68304218b..57d68304218b 100644 --- a/include/asm-powerpc/ioctl.h +++ b/arch/powerpc/include/asm/ioctl.h | |||
diff --git a/include/asm-powerpc/ioctls.h b/arch/powerpc/include/asm/ioctls.h index 279a6229584b..279a6229584b 100644 --- a/include/asm-powerpc/ioctls.h +++ b/arch/powerpc/include/asm/ioctls.h | |||
diff --git a/include/asm-powerpc/iommu.h b/arch/powerpc/include/asm/iommu.h index 51ecfef8d843..51ecfef8d843 100644 --- a/include/asm-powerpc/iommu.h +++ b/arch/powerpc/include/asm/iommu.h | |||
diff --git a/include/asm-powerpc/ipcbuf.h b/arch/powerpc/include/asm/ipcbuf.h index 2c3e1d94db1d..2c3e1d94db1d 100644 --- a/include/asm-powerpc/ipcbuf.h +++ b/arch/powerpc/include/asm/ipcbuf.h | |||
diff --git a/include/asm-powerpc/ipic.h b/arch/powerpc/include/asm/ipic.h index 8ff08be00146..fb59829983b8 100644 --- a/include/asm-powerpc/ipic.h +++ b/arch/powerpc/include/asm/ipic.h | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-powerpc/ipic.h | ||
3 | * | ||
4 | * IPIC external definitions and structure. | 2 | * IPIC external definitions and structure. |
5 | * | 3 | * |
6 | * Maintainer: Kumar Gala <galak@kernel.crashing.org> | 4 | * Maintainer: Kumar Gala <galak@kernel.crashing.org> |
@@ -79,15 +77,8 @@ extern void ipic_disable_mcp(enum ipic_mcp_irq mcp_irq); | |||
79 | extern u32 ipic_get_mcp_status(void); | 77 | extern u32 ipic_get_mcp_status(void); |
80 | extern void ipic_clear_mcp_status(u32 mask); | 78 | extern void ipic_clear_mcp_status(u32 mask); |
81 | 79 | ||
82 | #ifdef CONFIG_PPC_MERGE | ||
83 | extern struct ipic * ipic_init(struct device_node *node, unsigned int flags); | 80 | extern struct ipic * ipic_init(struct device_node *node, unsigned int flags); |
84 | extern unsigned int ipic_get_irq(void); | 81 | extern unsigned int ipic_get_irq(void); |
85 | #else | ||
86 | extern void ipic_init(phys_addr_t phys_addr, unsigned int flags, | ||
87 | unsigned int irq_offset, | ||
88 | unsigned char *senses, unsigned int senses_count); | ||
89 | extern int ipic_get_irq(void); | ||
90 | #endif | ||
91 | 82 | ||
92 | #endif /* __ASM_IPIC_H__ */ | 83 | #endif /* __ASM_IPIC_H__ */ |
93 | #endif /* __KERNEL__ */ | 84 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-powerpc/irq.h b/arch/powerpc/include/asm/irq.h index 1ef8e304e0ea..a372f76836c2 100644 --- a/include/asm-powerpc/irq.h +++ b/arch/powerpc/include/asm/irq.h | |||
@@ -25,8 +25,6 @@ | |||
25 | 25 | ||
26 | extern atomic_t ppc_n_lost_interrupts; | 26 | extern atomic_t ppc_n_lost_interrupts; |
27 | 27 | ||
28 | #ifdef CONFIG_PPC_MERGE | ||
29 | |||
30 | /* This number is used when no interrupt has been assigned */ | 28 | /* This number is used when no interrupt has been assigned */ |
31 | #define NO_IRQ (0) | 29 | #define NO_IRQ (0) |
32 | 30 | ||
@@ -326,292 +324,6 @@ static __inline__ int irq_canonicalize(int irq) | |||
326 | return irq; | 324 | return irq; |
327 | } | 325 | } |
328 | 326 | ||
329 | |||
330 | #else /* CONFIG_PPC_MERGE */ | ||
331 | |||
332 | /* This number is used when no interrupt has been assigned */ | ||
333 | #define NO_IRQ (-1) | ||
334 | #define NO_IRQ_IGNORE (-2) | ||
335 | |||
336 | |||
337 | /* | ||
338 | * These constants are used for passing information about interrupt | ||
339 | * signal polarity and level/edge sensing to the low-level PIC chip | ||
340 | * drivers. | ||
341 | */ | ||
342 | #define IRQ_SENSE_MASK 0x1 | ||
343 | #define IRQ_SENSE_LEVEL 0x1 /* interrupt on active level */ | ||
344 | #define IRQ_SENSE_EDGE 0x0 /* interrupt triggered by edge */ | ||
345 | |||
346 | #define IRQ_POLARITY_MASK 0x2 | ||
347 | #define IRQ_POLARITY_POSITIVE 0x2 /* high level or low->high edge */ | ||
348 | #define IRQ_POLARITY_NEGATIVE 0x0 /* low level or high->low edge */ | ||
349 | |||
350 | |||
351 | #if defined(CONFIG_40x) | ||
352 | #include <asm/ibm4xx.h> | ||
353 | |||
354 | #ifndef NR_BOARD_IRQS | ||
355 | #define NR_BOARD_IRQS 0 | ||
356 | #endif | ||
357 | |||
358 | #ifndef UIC_WIDTH /* Number of interrupts per device */ | ||
359 | #define UIC_WIDTH 32 | ||
360 | #endif | ||
361 | |||
362 | #ifndef NR_UICS /* number of UIC devices */ | ||
363 | #define NR_UICS 1 | ||
364 | #endif | ||
365 | |||
366 | #if defined (CONFIG_403) | ||
367 | /* | ||
368 | * The PowerPC 403 cores' Asynchronous Interrupt Controller (AIC) has | ||
369 | * 32 possible interrupts, a majority of which are not implemented on | ||
370 | * all cores. There are six configurable, external interrupt pins and | ||
371 | * there are eight internal interrupts for the on-chip serial port | ||
372 | * (SPU), DMA controller, and JTAG controller. | ||
373 | * | ||
374 | */ | ||
375 | |||
376 | #define NR_AIC_IRQS 32 | ||
377 | #define NR_IRQS (NR_AIC_IRQS + NR_BOARD_IRQS) | ||
378 | |||
379 | #elif !defined (CONFIG_403) | ||
380 | |||
381 | /* | ||
382 | * The PowerPC 405 cores' Universal Interrupt Controller (UIC) has 32 | ||
383 | * possible interrupts as well. There are seven, configurable external | ||
384 | * interrupt pins and there are 17 internal interrupts for the on-chip | ||
385 | * serial port, DMA controller, on-chip Ethernet controller, PCI, etc. | ||
386 | * | ||
387 | */ | ||
388 | |||
389 | |||
390 | #define NR_UIC_IRQS UIC_WIDTH | ||
391 | #define NR_IRQS ((NR_UIC_IRQS * NR_UICS) + NR_BOARD_IRQS) | ||
392 | #endif | ||
393 | |||
394 | #elif defined(CONFIG_44x) | ||
395 | #include <asm/ibm44x.h> | ||
396 | |||
397 | #define NR_UIC_IRQS 32 | ||
398 | #define NR_IRQS ((NR_UIC_IRQS * NR_UICS) + NR_BOARD_IRQS) | ||
399 | |||
400 | #elif defined(CONFIG_8xx) | ||
401 | |||
402 | /* Now include the board configuration specific associations. | ||
403 | */ | ||
404 | #include <asm/mpc8xx.h> | ||
405 | |||
406 | /* The MPC8xx cores have 16 possible interrupts. There are eight | ||
407 | * possible level sensitive interrupts assigned and generated internally | ||
408 | * from such devices as CPM, PCMCIA, RTC, PIT, TimeBase and Decrementer. | ||
409 | * There are eight external interrupts (IRQs) that can be configured | ||
410 | * as either level or edge sensitive. | ||
411 | * | ||
412 | * On some implementations, there is also the possibility of an 8259 | ||
413 | * through the PCI and PCI-ISA bridges. | ||
414 | * | ||
415 | * We are "flattening" the interrupt vectors of the cascaded CPM | ||
416 | * and 8259 interrupt controllers so that we can uniquely identify | ||
417 | * any interrupt source with a single integer. | ||
418 | */ | ||
419 | #define NR_SIU_INTS 16 | ||
420 | #define NR_CPM_INTS 32 | ||
421 | #ifndef NR_8259_INTS | ||
422 | #define NR_8259_INTS 0 | ||
423 | #endif | ||
424 | |||
425 | #define SIU_IRQ_OFFSET 0 | ||
426 | #define CPM_IRQ_OFFSET (SIU_IRQ_OFFSET + NR_SIU_INTS) | ||
427 | #define I8259_IRQ_OFFSET (CPM_IRQ_OFFSET + NR_CPM_INTS) | ||
428 | |||
429 | #define NR_IRQS (NR_SIU_INTS + NR_CPM_INTS + NR_8259_INTS) | ||
430 | |||
431 | /* These values must be zero-based and map 1:1 with the SIU configuration. | ||
432 | * They are used throughout the 8xx I/O subsystem to generate | ||
433 | * interrupt masks, flags, and other control patterns. This is why the | ||
434 | * current kernel assumption of the 8259 as the base controller is such | ||
435 | * a pain in the butt. | ||
436 | */ | ||
437 | #define SIU_IRQ0 (0) /* Highest priority */ | ||
438 | #define SIU_LEVEL0 (1) | ||
439 | #define SIU_IRQ1 (2) | ||
440 | #define SIU_LEVEL1 (3) | ||
441 | #define SIU_IRQ2 (4) | ||
442 | #define SIU_LEVEL2 (5) | ||
443 | #define SIU_IRQ3 (6) | ||
444 | #define SIU_LEVEL3 (7) | ||
445 | #define SIU_IRQ4 (8) | ||
446 | #define SIU_LEVEL4 (9) | ||
447 | #define SIU_IRQ5 (10) | ||
448 | #define SIU_LEVEL5 (11) | ||
449 | #define SIU_IRQ6 (12) | ||
450 | #define SIU_LEVEL6 (13) | ||
451 | #define SIU_IRQ7 (14) | ||
452 | #define SIU_LEVEL7 (15) | ||
453 | |||
454 | #define MPC8xx_INT_FEC1 SIU_LEVEL1 | ||
455 | #define MPC8xx_INT_FEC2 SIU_LEVEL3 | ||
456 | |||
457 | #define MPC8xx_INT_SCC1 (CPM_IRQ_OFFSET + CPMVEC_SCC1) | ||
458 | #define MPC8xx_INT_SCC2 (CPM_IRQ_OFFSET + CPMVEC_SCC2) | ||
459 | #define MPC8xx_INT_SCC3 (CPM_IRQ_OFFSET + CPMVEC_SCC3) | ||
460 | #define MPC8xx_INT_SCC4 (CPM_IRQ_OFFSET + CPMVEC_SCC4) | ||
461 | #define MPC8xx_INT_SMC1 (CPM_IRQ_OFFSET + CPMVEC_SMC1) | ||
462 | #define MPC8xx_INT_SMC2 (CPM_IRQ_OFFSET + CPMVEC_SMC2) | ||
463 | |||
464 | /* The internal interrupts we can configure as we see fit. | ||
465 | * My personal preference is CPM at level 2, which puts it above the | ||
466 | * MBX PCI/ISA/IDE interrupts. | ||
467 | */ | ||
468 | #ifndef PIT_INTERRUPT | ||
469 | #define PIT_INTERRUPT SIU_LEVEL0 | ||
470 | #endif | ||
471 | #ifndef CPM_INTERRUPT | ||
472 | #define CPM_INTERRUPT SIU_LEVEL2 | ||
473 | #endif | ||
474 | #ifndef PCMCIA_INTERRUPT | ||
475 | #define PCMCIA_INTERRUPT SIU_LEVEL6 | ||
476 | #endif | ||
477 | #ifndef DEC_INTERRUPT | ||
478 | #define DEC_INTERRUPT SIU_LEVEL7 | ||
479 | #endif | ||
480 | |||
481 | /* Some internal interrupt registers use an 8-bit mask for the interrupt | ||
482 | * level instead of a number. | ||
483 | */ | ||
484 | #define mk_int_int_mask(IL) (1 << (7 - (IL/2))) | ||
485 | |||
486 | #else /* CONFIG_40x + CONFIG_8xx */ | ||
487 | /* | ||
488 | * this is the # irq's for all ppc arch's (pmac/chrp/prep) | ||
489 | * so it is the max of them all | ||
490 | */ | ||
491 | #define NR_IRQS 256 | ||
492 | #define __DO_IRQ_CANON 1 | ||
493 | |||
494 | #ifndef CONFIG_8260 | ||
495 | |||
496 | #define NUM_8259_INTERRUPTS 16 | ||
497 | |||
498 | #else /* CONFIG_8260 */ | ||
499 | |||
500 | /* The 8260 has an internal interrupt controller with a maximum of | ||
501 | * 64 IRQs. We will use NR_IRQs from above since it is large enough. | ||
502 | * Don't be confused by the 8260 documentation where they list an | ||
503 | * "interrupt number" and "interrupt vector". We are only interested | ||
504 | * in the interrupt vector. There are "reserved" holes where the | ||
505 | * vector number increases, but the interrupt number in the table does not. | ||
506 | * (Document errata updates have fixed this...make sure you have up to | ||
507 | * date processor documentation -- Dan). | ||
508 | */ | ||
509 | |||
510 | #ifndef CPM_IRQ_OFFSET | ||
511 | #define CPM_IRQ_OFFSET 0 | ||
512 | #endif | ||
513 | |||
514 | #define NR_CPM_INTS 64 | ||
515 | |||
516 | #define SIU_INT_ERROR ((uint)0x00 + CPM_IRQ_OFFSET) | ||
517 | #define SIU_INT_I2C ((uint)0x01 + CPM_IRQ_OFFSET) | ||
518 | #define SIU_INT_SPI ((uint)0x02 + CPM_IRQ_OFFSET) | ||
519 | #define SIU_INT_RISC ((uint)0x03 + CPM_IRQ_OFFSET) | ||
520 | #define SIU_INT_SMC1 ((uint)0x04 + CPM_IRQ_OFFSET) | ||
521 | #define SIU_INT_SMC2 ((uint)0x05 + CPM_IRQ_OFFSET) | ||
522 | #define SIU_INT_IDMA1 ((uint)0x06 + CPM_IRQ_OFFSET) | ||
523 | #define SIU_INT_IDMA2 ((uint)0x07 + CPM_IRQ_OFFSET) | ||
524 | #define SIU_INT_IDMA3 ((uint)0x08 + CPM_IRQ_OFFSET) | ||
525 | #define SIU_INT_IDMA4 ((uint)0x09 + CPM_IRQ_OFFSET) | ||
526 | #define SIU_INT_SDMA ((uint)0x0a + CPM_IRQ_OFFSET) | ||
527 | #define SIU_INT_USB ((uint)0x0b + CPM_IRQ_OFFSET) | ||
528 | #define SIU_INT_TIMER1 ((uint)0x0c + CPM_IRQ_OFFSET) | ||
529 | #define SIU_INT_TIMER2 ((uint)0x0d + CPM_IRQ_OFFSET) | ||
530 | #define SIU_INT_TIMER3 ((uint)0x0e + CPM_IRQ_OFFSET) | ||
531 | #define SIU_INT_TIMER4 ((uint)0x0f + CPM_IRQ_OFFSET) | ||
532 | #define SIU_INT_TMCNT ((uint)0x10 + CPM_IRQ_OFFSET) | ||
533 | #define SIU_INT_PIT ((uint)0x11 + CPM_IRQ_OFFSET) | ||
534 | #define SIU_INT_PCI ((uint)0x12 + CPM_IRQ_OFFSET) | ||
535 | #define SIU_INT_IRQ1 ((uint)0x13 + CPM_IRQ_OFFSET) | ||
536 | #define SIU_INT_IRQ2 ((uint)0x14 + CPM_IRQ_OFFSET) | ||
537 | #define SIU_INT_IRQ3 ((uint)0x15 + CPM_IRQ_OFFSET) | ||
538 | #define SIU_INT_IRQ4 ((uint)0x16 + CPM_IRQ_OFFSET) | ||
539 | #define SIU_INT_IRQ5 ((uint)0x17 + CPM_IRQ_OFFSET) | ||
540 | #define SIU_INT_IRQ6 ((uint)0x18 + CPM_IRQ_OFFSET) | ||
541 | #define SIU_INT_IRQ7 ((uint)0x19 + CPM_IRQ_OFFSET) | ||
542 | #define SIU_INT_FCC1 ((uint)0x20 + CPM_IRQ_OFFSET) | ||
543 | #define SIU_INT_FCC2 ((uint)0x21 + CPM_IRQ_OFFSET) | ||
544 | #define SIU_INT_FCC3 ((uint)0x22 + CPM_IRQ_OFFSET) | ||
545 | #define SIU_INT_MCC1 ((uint)0x24 + CPM_IRQ_OFFSET) | ||
546 | #define SIU_INT_MCC2 ((uint)0x25 + CPM_IRQ_OFFSET) | ||
547 | #define SIU_INT_SCC1 ((uint)0x28 + CPM_IRQ_OFFSET) | ||
548 | #define SIU_INT_SCC2 ((uint)0x29 + CPM_IRQ_OFFSET) | ||
549 | #define SIU_INT_SCC3 ((uint)0x2a + CPM_IRQ_OFFSET) | ||
550 | #define SIU_INT_SCC4 ((uint)0x2b + CPM_IRQ_OFFSET) | ||
551 | #define SIU_INT_PC15 ((uint)0x30 + CPM_IRQ_OFFSET) | ||
552 | #define SIU_INT_PC14 ((uint)0x31 + CPM_IRQ_OFFSET) | ||
553 | #define SIU_INT_PC13 ((uint)0x32 + CPM_IRQ_OFFSET) | ||
554 | #define SIU_INT_PC12 ((uint)0x33 + CPM_IRQ_OFFSET) | ||
555 | #define SIU_INT_PC11 ((uint)0x34 + CPM_IRQ_OFFSET) | ||
556 | #define SIU_INT_PC10 ((uint)0x35 + CPM_IRQ_OFFSET) | ||
557 | #define SIU_INT_PC9 ((uint)0x36 + CPM_IRQ_OFFSET) | ||
558 | #define SIU_INT_PC8 ((uint)0x37 + CPM_IRQ_OFFSET) | ||
559 | #define SIU_INT_PC7 ((uint)0x38 + CPM_IRQ_OFFSET) | ||
560 | #define SIU_INT_PC6 ((uint)0x39 + CPM_IRQ_OFFSET) | ||
561 | #define SIU_INT_PC5 ((uint)0x3a + CPM_IRQ_OFFSET) | ||
562 | #define SIU_INT_PC4 ((uint)0x3b + CPM_IRQ_OFFSET) | ||
563 | #define SIU_INT_PC3 ((uint)0x3c + CPM_IRQ_OFFSET) | ||
564 | #define SIU_INT_PC2 ((uint)0x3d + CPM_IRQ_OFFSET) | ||
565 | #define SIU_INT_PC1 ((uint)0x3e + CPM_IRQ_OFFSET) | ||
566 | #define SIU_INT_PC0 ((uint)0x3f + CPM_IRQ_OFFSET) | ||
567 | |||
568 | #endif /* CONFIG_8260 */ | ||
569 | |||
570 | #endif /* Whatever way too big #ifdef */ | ||
571 | |||
572 | #define NR_MASK_WORDS ((NR_IRQS + 31) / 32) | ||
573 | /* pedantic: these are long because they are used with set_bit --RR */ | ||
574 | extern unsigned long ppc_cached_irq_mask[NR_MASK_WORDS]; | ||
575 | |||
576 | /* | ||
577 | * Because many systems have two overlapping names spaces for | ||
578 | * interrupts (ISA and XICS for example), and the ISA interrupts | ||
579 | * have historically not been easy to renumber, we allow ISA | ||
580 | * interrupts to take values 0 - 15, and shift up the remaining | ||
581 | * interrupts by 0x10. | ||
582 | */ | ||
583 | #define NUM_ISA_INTERRUPTS 0x10 | ||
584 | extern int __irq_offset_value; | ||
585 | |||
586 | static inline int irq_offset_up(int irq) | ||
587 | { | ||
588 | return(irq + __irq_offset_value); | ||
589 | } | ||
590 | |||
591 | static inline int irq_offset_down(int irq) | ||
592 | { | ||
593 | return(irq - __irq_offset_value); | ||
594 | } | ||
595 | |||
596 | static inline int irq_offset_value(void) | ||
597 | { | ||
598 | return __irq_offset_value; | ||
599 | } | ||
600 | |||
601 | #ifdef __DO_IRQ_CANON | ||
602 | extern int ppc_do_canonicalize_irqs; | ||
603 | #else | ||
604 | #define ppc_do_canonicalize_irqs 0 | ||
605 | #endif | ||
606 | |||
607 | static __inline__ int irq_canonicalize(int irq) | ||
608 | { | ||
609 | if (ppc_do_canonicalize_irqs && irq == 2) | ||
610 | irq = 9; | ||
611 | return irq; | ||
612 | } | ||
613 | #endif /* CONFIG_PPC_MERGE */ | ||
614 | |||
615 | extern int distribute_irqs; | 327 | extern int distribute_irqs; |
616 | 328 | ||
617 | struct irqaction; | 329 | struct irqaction; |
diff --git a/include/asm-powerpc/irq_regs.h b/arch/powerpc/include/asm/irq_regs.h index ba94b51a0a70..ba94b51a0a70 100644 --- a/include/asm-powerpc/irq_regs.h +++ b/arch/powerpc/include/asm/irq_regs.h | |||
diff --git a/include/asm-powerpc/irqflags.h b/arch/powerpc/include/asm/irqflags.h index cc6fdba33660..17ba3a881bfd 100644 --- a/include/asm-powerpc/irqflags.h +++ b/arch/powerpc/include/asm/irqflags.h | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-powerpc/irqflags.h | ||
3 | * | ||
4 | * IRQ flags handling | 2 | * IRQ flags handling |
5 | */ | 3 | */ |
6 | #ifndef _ASM_IRQFLAGS_H | 4 | #ifndef _ASM_IRQFLAGS_H |
@@ -10,7 +8,7 @@ | |||
10 | /* | 8 | /* |
11 | * Get definitions for raw_local_save_flags(x), etc. | 9 | * Get definitions for raw_local_save_flags(x), etc. |
12 | */ | 10 | */ |
13 | #include <asm-powerpc/hw_irq.h> | 11 | #include <asm/hw_irq.h> |
14 | 12 | ||
15 | #else | 13 | #else |
16 | #ifdef CONFIG_TRACE_IRQFLAGS | 14 | #ifdef CONFIG_TRACE_IRQFLAGS |
diff --git a/include/asm-powerpc/iseries/alpaca.h b/arch/powerpc/include/asm/iseries/alpaca.h index c0cce6727a69..c0cce6727a69 100644 --- a/include/asm-powerpc/iseries/alpaca.h +++ b/arch/powerpc/include/asm/iseries/alpaca.h | |||
diff --git a/include/asm-powerpc/iseries/hv_call.h b/arch/powerpc/include/asm/iseries/hv_call.h index 162d653ad51f..162d653ad51f 100644 --- a/include/asm-powerpc/iseries/hv_call.h +++ b/arch/powerpc/include/asm/iseries/hv_call.h | |||
diff --git a/include/asm-powerpc/iseries/hv_call_event.h b/arch/powerpc/include/asm/iseries/hv_call_event.h index cc029d388e11..cc029d388e11 100644 --- a/include/asm-powerpc/iseries/hv_call_event.h +++ b/arch/powerpc/include/asm/iseries/hv_call_event.h | |||
diff --git a/include/asm-powerpc/iseries/hv_call_sc.h b/arch/powerpc/include/asm/iseries/hv_call_sc.h index f5d210959250..f5d210959250 100644 --- a/include/asm-powerpc/iseries/hv_call_sc.h +++ b/arch/powerpc/include/asm/iseries/hv_call_sc.h | |||
diff --git a/include/asm-powerpc/iseries/hv_call_xm.h b/arch/powerpc/include/asm/iseries/hv_call_xm.h index 392ac3f54df0..392ac3f54df0 100644 --- a/include/asm-powerpc/iseries/hv_call_xm.h +++ b/arch/powerpc/include/asm/iseries/hv_call_xm.h | |||
diff --git a/include/asm-powerpc/iseries/hv_lp_config.h b/arch/powerpc/include/asm/iseries/hv_lp_config.h index a006fd1e4a2c..a006fd1e4a2c 100644 --- a/include/asm-powerpc/iseries/hv_lp_config.h +++ b/arch/powerpc/include/asm/iseries/hv_lp_config.h | |||
diff --git a/include/asm-powerpc/iseries/hv_lp_event.h b/arch/powerpc/include/asm/iseries/hv_lp_event.h index 8f5da7d77202..8f5da7d77202 100644 --- a/include/asm-powerpc/iseries/hv_lp_event.h +++ b/arch/powerpc/include/asm/iseries/hv_lp_event.h | |||
diff --git a/include/asm-powerpc/iseries/hv_types.h b/arch/powerpc/include/asm/iseries/hv_types.h index c3e6d2a1d1c3..c3e6d2a1d1c3 100644 --- a/include/asm-powerpc/iseries/hv_types.h +++ b/arch/powerpc/include/asm/iseries/hv_types.h | |||
diff --git a/include/asm-powerpc/iseries/iommu.h b/arch/powerpc/include/asm/iseries/iommu.h index c59ee7e4bed1..c59ee7e4bed1 100644 --- a/include/asm-powerpc/iseries/iommu.h +++ b/arch/powerpc/include/asm/iseries/iommu.h | |||
diff --git a/include/asm-powerpc/iseries/it_lp_queue.h b/arch/powerpc/include/asm/iseries/it_lp_queue.h index 428278838821..428278838821 100644 --- a/include/asm-powerpc/iseries/it_lp_queue.h +++ b/arch/powerpc/include/asm/iseries/it_lp_queue.h | |||
diff --git a/include/asm-powerpc/iseries/lpar_map.h b/arch/powerpc/include/asm/iseries/lpar_map.h index 5e9f3e128ee2..5e9f3e128ee2 100644 --- a/include/asm-powerpc/iseries/lpar_map.h +++ b/arch/powerpc/include/asm/iseries/lpar_map.h | |||
diff --git a/include/asm-powerpc/iseries/mf.h b/arch/powerpc/include/asm/iseries/mf.h index eb851a9c9e5c..eb851a9c9e5c 100644 --- a/include/asm-powerpc/iseries/mf.h +++ b/arch/powerpc/include/asm/iseries/mf.h | |||
diff --git a/include/asm-powerpc/iseries/vio.h b/arch/powerpc/include/asm/iseries/vio.h index f9ac0d00b951..f9ac0d00b951 100644 --- a/include/asm-powerpc/iseries/vio.h +++ b/arch/powerpc/include/asm/iseries/vio.h | |||
diff --git a/include/asm-powerpc/kdebug.h b/arch/powerpc/include/asm/kdebug.h index ae6d206728af..ae6d206728af 100644 --- a/include/asm-powerpc/kdebug.h +++ b/arch/powerpc/include/asm/kdebug.h | |||
diff --git a/include/asm-powerpc/kdump.h b/arch/powerpc/include/asm/kdump.h index f6c93c716898..f6c93c716898 100644 --- a/include/asm-powerpc/kdump.h +++ b/arch/powerpc/include/asm/kdump.h | |||
diff --git a/include/asm-powerpc/kexec.h b/arch/powerpc/include/asm/kexec.h index acdcdc66f1b6..acdcdc66f1b6 100644 --- a/include/asm-powerpc/kexec.h +++ b/arch/powerpc/include/asm/kexec.h | |||
diff --git a/include/asm-powerpc/keylargo.h b/arch/powerpc/include/asm/keylargo.h index d8520ef121f9..d8520ef121f9 100644 --- a/include/asm-powerpc/keylargo.h +++ b/arch/powerpc/include/asm/keylargo.h | |||
diff --git a/include/asm-powerpc/kgdb.h b/arch/powerpc/include/asm/kgdb.h index 1399caf719ae..edd217006d27 100644 --- a/include/asm-powerpc/kgdb.h +++ b/arch/powerpc/include/asm/kgdb.h | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-powerpc/kgdb.h | ||
3 | * | ||
4 | * The PowerPC (32/64) specific defines / externs for KGDB. Based on | 2 | * The PowerPC (32/64) specific defines / externs for KGDB. Based on |
5 | * the previous 32bit and 64bit specific files, which had the following | 3 | * the previous 32bit and 64bit specific files, which had the following |
6 | * copyrights: | 4 | * copyrights: |
diff --git a/include/asm-powerpc/kmap_types.h b/arch/powerpc/include/asm/kmap_types.h index b6bac6f61c16..b6bac6f61c16 100644 --- a/include/asm-powerpc/kmap_types.h +++ b/arch/powerpc/include/asm/kmap_types.h | |||
diff --git a/include/asm-powerpc/kprobes.h b/arch/powerpc/include/asm/kprobes.h index d0e7701fa1f6..d0e7701fa1f6 100644 --- a/include/asm-powerpc/kprobes.h +++ b/arch/powerpc/include/asm/kprobes.h | |||
diff --git a/include/asm-powerpc/kvm.h b/arch/powerpc/include/asm/kvm.h index f993e4198d5c..f993e4198d5c 100644 --- a/include/asm-powerpc/kvm.h +++ b/arch/powerpc/include/asm/kvm.h | |||
diff --git a/include/asm-powerpc/kvm_asm.h b/arch/powerpc/include/asm/kvm_asm.h index 2197764796d9..2197764796d9 100644 --- a/include/asm-powerpc/kvm_asm.h +++ b/arch/powerpc/include/asm/kvm_asm.h | |||
diff --git a/include/asm-powerpc/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index 2655e2a4831e..2655e2a4831e 100644 --- a/include/asm-powerpc/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h | |||
diff --git a/include/asm-powerpc/kvm_para.h b/arch/powerpc/include/asm/kvm_para.h index 2d48f6a63d0b..2d48f6a63d0b 100644 --- a/include/asm-powerpc/kvm_para.h +++ b/arch/powerpc/include/asm/kvm_para.h | |||
diff --git a/include/asm-powerpc/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index a8b068792260..a8b068792260 100644 --- a/include/asm-powerpc/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h | |||
diff --git a/include/asm-powerpc/libata-portmap.h b/arch/powerpc/include/asm/libata-portmap.h index 4d8518049f4d..4d8518049f4d 100644 --- a/include/asm-powerpc/libata-portmap.h +++ b/arch/powerpc/include/asm/libata-portmap.h | |||
diff --git a/include/asm-powerpc/linkage.h b/arch/powerpc/include/asm/linkage.h index e1c4ac1cc4ba..e1c4ac1cc4ba 100644 --- a/include/asm-powerpc/linkage.h +++ b/arch/powerpc/include/asm/linkage.h | |||
diff --git a/include/asm-powerpc/lmb.h b/arch/powerpc/include/asm/lmb.h index 6f5fdf0a19ae..6f5fdf0a19ae 100644 --- a/include/asm-powerpc/lmb.h +++ b/arch/powerpc/include/asm/lmb.h | |||
diff --git a/include/asm-powerpc/local.h b/arch/powerpc/include/asm/local.h index 612d83276653..612d83276653 100644 --- a/include/asm-powerpc/local.h +++ b/arch/powerpc/include/asm/local.h | |||
diff --git a/include/asm-powerpc/lppaca.h b/arch/powerpc/include/asm/lppaca.h index 2fe268b10333..2fe268b10333 100644 --- a/include/asm-powerpc/lppaca.h +++ b/arch/powerpc/include/asm/lppaca.h | |||
diff --git a/include/asm-powerpc/lv1call.h b/arch/powerpc/include/asm/lv1call.h index 81713acf7529..81713acf7529 100644 --- a/include/asm-powerpc/lv1call.h +++ b/arch/powerpc/include/asm/lv1call.h | |||
diff --git a/include/asm-powerpc/machdep.h b/arch/powerpc/include/asm/machdep.h index 893aafd87fde..893aafd87fde 100644 --- a/include/asm-powerpc/machdep.h +++ b/arch/powerpc/include/asm/machdep.h | |||
diff --git a/include/asm-powerpc/macio.h b/arch/powerpc/include/asm/macio.h index 079c06eae446..079c06eae446 100644 --- a/include/asm-powerpc/macio.h +++ b/arch/powerpc/include/asm/macio.h | |||
diff --git a/include/asm-powerpc/mc146818rtc.h b/arch/powerpc/include/asm/mc146818rtc.h index f2741c8b59a1..f2741c8b59a1 100644 --- a/include/asm-powerpc/mc146818rtc.h +++ b/arch/powerpc/include/asm/mc146818rtc.h | |||
diff --git a/include/asm-powerpc/mediabay.h b/arch/powerpc/include/asm/mediabay.h index b2efb3325808..b2efb3325808 100644 --- a/include/asm-powerpc/mediabay.h +++ b/arch/powerpc/include/asm/mediabay.h | |||
diff --git a/include/asm-powerpc/mman.h b/arch/powerpc/include/asm/mman.h index 9209f755763e..9209f755763e 100644 --- a/include/asm-powerpc/mman.h +++ b/arch/powerpc/include/asm/mman.h | |||
diff --git a/include/asm-powerpc/mmu-40x.h b/arch/powerpc/include/asm/mmu-40x.h index 3d108676584c..3d108676584c 100644 --- a/include/asm-powerpc/mmu-40x.h +++ b/arch/powerpc/include/asm/mmu-40x.h | |||
diff --git a/include/asm-powerpc/mmu-44x.h b/arch/powerpc/include/asm/mmu-44x.h index a825524c981a..a825524c981a 100644 --- a/include/asm-powerpc/mmu-44x.h +++ b/arch/powerpc/include/asm/mmu-44x.h | |||
diff --git a/include/asm-powerpc/mmu-8xx.h b/arch/powerpc/include/asm/mmu-8xx.h index 9db877eb88db..9db877eb88db 100644 --- a/include/asm-powerpc/mmu-8xx.h +++ b/arch/powerpc/include/asm/mmu-8xx.h | |||
diff --git a/include/asm-powerpc/mmu-fsl-booke.h b/arch/powerpc/include/asm/mmu-fsl-booke.h index 925d93cf64d8..925d93cf64d8 100644 --- a/include/asm-powerpc/mmu-fsl-booke.h +++ b/arch/powerpc/include/asm/mmu-fsl-booke.h | |||
diff --git a/include/asm-powerpc/mmu-hash32.h b/arch/powerpc/include/asm/mmu-hash32.h index 16b1a1e77e64..16b1a1e77e64 100644 --- a/include/asm-powerpc/mmu-hash32.h +++ b/arch/powerpc/include/asm/mmu-hash32.h | |||
diff --git a/include/asm-powerpc/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h index 19c7a9403490..19c7a9403490 100644 --- a/include/asm-powerpc/mmu-hash64.h +++ b/arch/powerpc/include/asm/mmu-hash64.h | |||
diff --git a/include/asm-powerpc/mmu.h b/arch/powerpc/include/asm/mmu.h index 4c0e1b4f975c..4c0e1b4f975c 100644 --- a/include/asm-powerpc/mmu.h +++ b/arch/powerpc/include/asm/mmu.h | |||
diff --git a/include/asm-powerpc/mmu_context.h b/arch/powerpc/include/asm/mmu_context.h index 9102b8bf0ead..9102b8bf0ead 100644 --- a/include/asm-powerpc/mmu_context.h +++ b/arch/powerpc/include/asm/mmu_context.h | |||
diff --git a/include/asm-powerpc/mmzone.h b/arch/powerpc/include/asm/mmzone.h index 19f299b7e256..19f299b7e256 100644 --- a/include/asm-powerpc/mmzone.h +++ b/arch/powerpc/include/asm/mmzone.h | |||
diff --git a/include/asm-powerpc/module.h b/arch/powerpc/include/asm/module.h index e5f14b13ccf0..e5f14b13ccf0 100644 --- a/include/asm-powerpc/module.h +++ b/arch/powerpc/include/asm/module.h | |||
diff --git a/include/asm-powerpc/mpc512x.h b/arch/powerpc/include/asm/mpc512x.h index c48a1658eeac..c48a1658eeac 100644 --- a/include/asm-powerpc/mpc512x.h +++ b/arch/powerpc/include/asm/mpc512x.h | |||
diff --git a/include/asm-powerpc/mpc52xx.h b/arch/powerpc/include/asm/mpc52xx.h index 81ef10b6b672..81ef10b6b672 100644 --- a/include/asm-powerpc/mpc52xx.h +++ b/arch/powerpc/include/asm/mpc52xx.h | |||
diff --git a/include/asm-powerpc/mpc52xx_psc.h b/arch/powerpc/include/asm/mpc52xx_psc.h index 8917ed630565..8917ed630565 100644 --- a/include/asm-powerpc/mpc52xx_psc.h +++ b/arch/powerpc/include/asm/mpc52xx_psc.h | |||
diff --git a/include/asm-powerpc/mpc6xx.h b/arch/powerpc/include/asm/mpc6xx.h index effc2291beb2..effc2291beb2 100644 --- a/include/asm-powerpc/mpc6xx.h +++ b/arch/powerpc/include/asm/mpc6xx.h | |||
diff --git a/include/asm-powerpc/mpc8260.h b/arch/powerpc/include/asm/mpc8260.h index 03317e1e6185..03317e1e6185 100644 --- a/include/asm-powerpc/mpc8260.h +++ b/arch/powerpc/include/asm/mpc8260.h | |||
diff --git a/include/asm-powerpc/mpc86xx.h b/arch/powerpc/include/asm/mpc86xx.h index 15f650f987e7..15f650f987e7 100644 --- a/include/asm-powerpc/mpc86xx.h +++ b/arch/powerpc/include/asm/mpc86xx.h | |||
diff --git a/include/asm-powerpc/mpc8xx.h b/arch/powerpc/include/asm/mpc8xx.h index 98f3c4f17328..98f3c4f17328 100644 --- a/include/asm-powerpc/mpc8xx.h +++ b/arch/powerpc/include/asm/mpc8xx.h | |||
diff --git a/include/asm-powerpc/mpic.h b/arch/powerpc/include/asm/mpic.h index fe566a348a86..fe566a348a86 100644 --- a/include/asm-powerpc/mpic.h +++ b/arch/powerpc/include/asm/mpic.h | |||
diff --git a/include/asm-powerpc/msgbuf.h b/arch/powerpc/include/asm/msgbuf.h index dd76743c7537..dd76743c7537 100644 --- a/include/asm-powerpc/msgbuf.h +++ b/arch/powerpc/include/asm/msgbuf.h | |||
diff --git a/include/asm-powerpc/mutex.h b/arch/powerpc/include/asm/mutex.h index 458c1f7fbc18..458c1f7fbc18 100644 --- a/include/asm-powerpc/mutex.h +++ b/arch/powerpc/include/asm/mutex.h | |||
diff --git a/include/asm-powerpc/nvram.h b/arch/powerpc/include/asm/nvram.h index efde5ac82f7b..efde5ac82f7b 100644 --- a/include/asm-powerpc/nvram.h +++ b/arch/powerpc/include/asm/nvram.h | |||
diff --git a/include/asm-powerpc/of_device.h b/arch/powerpc/include/asm/of_device.h index 3c123990ca2e..3c123990ca2e 100644 --- a/include/asm-powerpc/of_device.h +++ b/arch/powerpc/include/asm/of_device.h | |||
diff --git a/include/asm-powerpc/of_platform.h b/arch/powerpc/include/asm/of_platform.h index 18659ef72139..18659ef72139 100644 --- a/include/asm-powerpc/of_platform.h +++ b/arch/powerpc/include/asm/of_platform.h | |||
diff --git a/include/asm-powerpc/ohare.h b/arch/powerpc/include/asm/ohare.h index 0d030f9dea24..0d030f9dea24 100644 --- a/include/asm-powerpc/ohare.h +++ b/arch/powerpc/include/asm/ohare.h | |||
diff --git a/include/asm-powerpc/oprofile_impl.h b/arch/powerpc/include/asm/oprofile_impl.h index 95035c602ba6..95035c602ba6 100644 --- a/include/asm-powerpc/oprofile_impl.h +++ b/arch/powerpc/include/asm/oprofile_impl.h | |||
diff --git a/include/asm-powerpc/pSeries_reconfig.h b/arch/powerpc/include/asm/pSeries_reconfig.h index e482e5352e69..e482e5352e69 100644 --- a/include/asm-powerpc/pSeries_reconfig.h +++ b/arch/powerpc/include/asm/pSeries_reconfig.h | |||
diff --git a/include/asm-powerpc/paca.h b/arch/powerpc/include/asm/paca.h index 7b564444ff61..6493a395508b 100644 --- a/include/asm-powerpc/paca.h +++ b/arch/powerpc/include/asm/paca.h | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-powerpc/paca.h | ||
3 | * | ||
4 | * This control block defines the PACA which defines the processor | 2 | * This control block defines the PACA which defines the processor |
5 | * specific data for each logical processor on the system. | 3 | * specific data for each logical processor on the system. |
6 | * There are some pointers defined that are utilized by PLIC. | 4 | * There are some pointers defined that are utilized by PLIC. |
diff --git a/include/asm-powerpc/page.h b/arch/powerpc/include/asm/page.h index e088545cb3f5..e088545cb3f5 100644 --- a/include/asm-powerpc/page.h +++ b/arch/powerpc/include/asm/page.h | |||
diff --git a/include/asm-powerpc/page_32.h b/arch/powerpc/include/asm/page_32.h index ebfae530a379..ebfae530a379 100644 --- a/include/asm-powerpc/page_32.h +++ b/arch/powerpc/include/asm/page_32.h | |||
diff --git a/include/asm-powerpc/page_64.h b/arch/powerpc/include/asm/page_64.h index 043bfdfe4f73..043bfdfe4f73 100644 --- a/include/asm-powerpc/page_64.h +++ b/arch/powerpc/include/asm/page_64.h | |||
diff --git a/include/asm-powerpc/param.h b/arch/powerpc/include/asm/param.h index 094f63d4d5ca..094f63d4d5ca 100644 --- a/include/asm-powerpc/param.h +++ b/arch/powerpc/include/asm/param.h | |||
diff --git a/include/asm-powerpc/parport.h b/arch/powerpc/include/asm/parport.h index 414c50e2e881..414c50e2e881 100644 --- a/include/asm-powerpc/parport.h +++ b/arch/powerpc/include/asm/parport.h | |||
diff --git a/include/asm-powerpc/pasemi_dma.h b/arch/powerpc/include/asm/pasemi_dma.h index 19fd7933e2d9..19fd7933e2d9 100644 --- a/include/asm-powerpc/pasemi_dma.h +++ b/arch/powerpc/include/asm/pasemi_dma.h | |||
diff --git a/include/asm-powerpc/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h index ae2ea803a0f2..ae2ea803a0f2 100644 --- a/include/asm-powerpc/pci-bridge.h +++ b/arch/powerpc/include/asm/pci-bridge.h | |||
diff --git a/include/asm-powerpc/pci.h b/arch/powerpc/include/asm/pci.h index a05a942b1c25..a05a942b1c25 100644 --- a/include/asm-powerpc/pci.h +++ b/arch/powerpc/include/asm/pci.h | |||
diff --git a/include/asm-powerpc/percpu.h b/arch/powerpc/include/asm/percpu.h index f879252b7ea6..f879252b7ea6 100644 --- a/include/asm-powerpc/percpu.h +++ b/arch/powerpc/include/asm/percpu.h | |||
diff --git a/include/asm-powerpc/pgalloc-32.h b/arch/powerpc/include/asm/pgalloc-32.h index 58c07147b3ea..58c07147b3ea 100644 --- a/include/asm-powerpc/pgalloc-32.h +++ b/arch/powerpc/include/asm/pgalloc-32.h | |||
diff --git a/include/asm-powerpc/pgalloc-64.h b/arch/powerpc/include/asm/pgalloc-64.h index 812a1d8f35cb..812a1d8f35cb 100644 --- a/include/asm-powerpc/pgalloc-64.h +++ b/arch/powerpc/include/asm/pgalloc-64.h | |||
diff --git a/include/asm-powerpc/pgalloc.h b/arch/powerpc/include/asm/pgalloc.h index b4505ed0f0f2..b4505ed0f0f2 100644 --- a/include/asm-powerpc/pgalloc.h +++ b/arch/powerpc/include/asm/pgalloc.h | |||
diff --git a/include/asm-powerpc/pgtable-4k.h b/arch/powerpc/include/asm/pgtable-4k.h index 6b18ba9d2d85..6b18ba9d2d85 100644 --- a/include/asm-powerpc/pgtable-4k.h +++ b/arch/powerpc/include/asm/pgtable-4k.h | |||
diff --git a/include/asm-powerpc/pgtable-64k.h b/arch/powerpc/include/asm/pgtable-64k.h index 07b0d8f09cb6..07b0d8f09cb6 100644 --- a/include/asm-powerpc/pgtable-64k.h +++ b/arch/powerpc/include/asm/pgtable-64k.h | |||
diff --git a/include/asm-powerpc/pgtable-ppc32.h b/arch/powerpc/include/asm/pgtable-ppc32.h index 6fe39e327047..6fe39e327047 100644 --- a/include/asm-powerpc/pgtable-ppc32.h +++ b/arch/powerpc/include/asm/pgtable-ppc32.h | |||
diff --git a/include/asm-powerpc/pgtable-ppc64.h b/arch/powerpc/include/asm/pgtable-ppc64.h index 74c6f380b805..db0b8f3b8807 100644 --- a/include/asm-powerpc/pgtable-ppc64.h +++ b/arch/powerpc/include/asm/pgtable-ppc64.h | |||
@@ -100,7 +100,7 @@ | |||
100 | 100 | ||
101 | #define _PAGE_WRENABLE (_PAGE_RW | _PAGE_DIRTY) | 101 | #define _PAGE_WRENABLE (_PAGE_RW | _PAGE_DIRTY) |
102 | 102 | ||
103 | /* __pgprot defined in asm-powerpc/page.h */ | 103 | /* __pgprot defined in arch/powerpc/incliude/asm/page.h */ |
104 | #define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED) | 104 | #define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED) |
105 | 105 | ||
106 | #define PAGE_SHARED __pgprot(_PAGE_BASE | _PAGE_RW | _PAGE_USER) | 106 | #define PAGE_SHARED __pgprot(_PAGE_BASE | _PAGE_RW | _PAGE_USER) |
diff --git a/include/asm-powerpc/pgtable.h b/arch/powerpc/include/asm/pgtable.h index dbb8ca172e44..dbb8ca172e44 100644 --- a/include/asm-powerpc/pgtable.h +++ b/arch/powerpc/include/asm/pgtable.h | |||
diff --git a/include/asm-powerpc/phyp_dump.h b/arch/powerpc/include/asm/phyp_dump.h index fa74c6c3e106..fa74c6c3e106 100644 --- a/include/asm-powerpc/phyp_dump.h +++ b/arch/powerpc/include/asm/phyp_dump.h | |||
diff --git a/include/asm-powerpc/pmac_feature.h b/arch/powerpc/include/asm/pmac_feature.h index 877c35a4356e..877c35a4356e 100644 --- a/include/asm-powerpc/pmac_feature.h +++ b/arch/powerpc/include/asm/pmac_feature.h | |||
diff --git a/include/asm-powerpc/pmac_low_i2c.h b/arch/powerpc/include/asm/pmac_low_i2c.h index 131011bd7e76..131011bd7e76 100644 --- a/include/asm-powerpc/pmac_low_i2c.h +++ b/arch/powerpc/include/asm/pmac_low_i2c.h | |||
diff --git a/include/asm-powerpc/pmac_pfunc.h b/arch/powerpc/include/asm/pmac_pfunc.h index 1330d6a58c57..1330d6a58c57 100644 --- a/include/asm-powerpc/pmac_pfunc.h +++ b/arch/powerpc/include/asm/pmac_pfunc.h | |||
diff --git a/include/asm-powerpc/pmc.h b/arch/powerpc/include/asm/pmc.h index d6a616a1b3ea..d6a616a1b3ea 100644 --- a/include/asm-powerpc/pmc.h +++ b/arch/powerpc/include/asm/pmc.h | |||
diff --git a/include/asm-powerpc/pmi.h b/arch/powerpc/include/asm/pmi.h index b4e91fbf5081..b4e91fbf5081 100644 --- a/include/asm-powerpc/pmi.h +++ b/arch/powerpc/include/asm/pmi.h | |||
diff --git a/include/asm-powerpc/poll.h b/arch/powerpc/include/asm/poll.h index c98509d3149e..c98509d3149e 100644 --- a/include/asm-powerpc/poll.h +++ b/arch/powerpc/include/asm/poll.h | |||
diff --git a/include/asm-powerpc/posix_types.h b/arch/powerpc/include/asm/posix_types.h index c4e396b540df..c4e396b540df 100644 --- a/include/asm-powerpc/posix_types.h +++ b/arch/powerpc/include/asm/posix_types.h | |||
diff --git a/include/asm-powerpc/ppc-pci.h b/arch/powerpc/include/asm/ppc-pci.h index 854ab713f56c..854ab713f56c 100644 --- a/include/asm-powerpc/ppc-pci.h +++ b/arch/powerpc/include/asm/ppc-pci.h | |||
diff --git a/include/asm-powerpc/ppc4xx.h b/arch/powerpc/include/asm/ppc4xx.h index 033039a80c42..033039a80c42 100644 --- a/include/asm-powerpc/ppc4xx.h +++ b/arch/powerpc/include/asm/ppc4xx.h | |||
diff --git a/include/asm-powerpc/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index 0966899d974b..0966899d974b 100644 --- a/include/asm-powerpc/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h | |||
diff --git a/include/asm-powerpc/processor.h b/arch/powerpc/include/asm/processor.h index 101ed87f7d84..101ed87f7d84 100644 --- a/include/asm-powerpc/processor.h +++ b/arch/powerpc/include/asm/processor.h | |||
diff --git a/include/asm-powerpc/prom.h b/arch/powerpc/include/asm/prom.h index eb3bd2e1c7f6..eb3bd2e1c7f6 100644 --- a/include/asm-powerpc/prom.h +++ b/arch/powerpc/include/asm/prom.h | |||
diff --git a/include/asm-powerpc/ps3.h b/arch/powerpc/include/asm/ps3.h index f9e34c493cbb..f9e34c493cbb 100644 --- a/include/asm-powerpc/ps3.h +++ b/arch/powerpc/include/asm/ps3.h | |||
diff --git a/include/asm-powerpc/ps3av.h b/arch/powerpc/include/asm/ps3av.h index fda98715cd35..fda98715cd35 100644 --- a/include/asm-powerpc/ps3av.h +++ b/arch/powerpc/include/asm/ps3av.h | |||
diff --git a/include/asm-powerpc/ps3fb.h b/arch/powerpc/include/asm/ps3fb.h index 3f121fe4010d..3f121fe4010d 100644 --- a/include/asm-powerpc/ps3fb.h +++ b/arch/powerpc/include/asm/ps3fb.h | |||
diff --git a/include/asm-powerpc/ps3stor.h b/arch/powerpc/include/asm/ps3stor.h index 6fcaf714fa50..6fcaf714fa50 100644 --- a/include/asm-powerpc/ps3stor.h +++ b/arch/powerpc/include/asm/ps3stor.h | |||
diff --git a/include/asm-powerpc/ptrace.h b/arch/powerpc/include/asm/ptrace.h index 734e0754fb9b..734e0754fb9b 100644 --- a/include/asm-powerpc/ptrace.h +++ b/arch/powerpc/include/asm/ptrace.h | |||
diff --git a/include/asm-powerpc/qe.h b/arch/powerpc/include/asm/qe.h index edee15d269ea..edee15d269ea 100644 --- a/include/asm-powerpc/qe.h +++ b/arch/powerpc/include/asm/qe.h | |||
diff --git a/include/asm-powerpc/qe_ic.h b/arch/powerpc/include/asm/qe_ic.h index a779b2c9eaf1..56a7745ca343 100644 --- a/include/asm-powerpc/qe_ic.h +++ b/arch/powerpc/include/asm/qe_ic.h | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-powerpc/qe_ic.h | ||
3 | * | ||
4 | * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved. | 2 | * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved. |
5 | * | 3 | * |
6 | * Authors: Shlomi Gridish <gridish@freescale.com> | 4 | * Authors: Shlomi Gridish <gridish@freescale.com> |
diff --git a/include/asm-powerpc/reg.h b/arch/powerpc/include/asm/reg.h index c6d1ab650778..c6d1ab650778 100644 --- a/include/asm-powerpc/reg.h +++ b/arch/powerpc/include/asm/reg.h | |||
diff --git a/include/asm-powerpc/reg_8xx.h b/arch/powerpc/include/asm/reg_8xx.h index e8ea346b21d3..e8ea346b21d3 100644 --- a/include/asm-powerpc/reg_8xx.h +++ b/arch/powerpc/include/asm/reg_8xx.h | |||
diff --git a/include/asm-powerpc/reg_booke.h b/arch/powerpc/include/asm/reg_booke.h index be980f4ee495..be980f4ee495 100644 --- a/include/asm-powerpc/reg_booke.h +++ b/arch/powerpc/include/asm/reg_booke.h | |||
diff --git a/include/asm-powerpc/reg_fsl_emb.h b/arch/powerpc/include/asm/reg_fsl_emb.h index 1e180a594589..1e180a594589 100644 --- a/include/asm-powerpc/reg_fsl_emb.h +++ b/arch/powerpc/include/asm/reg_fsl_emb.h | |||
diff --git a/include/asm-powerpc/resource.h b/arch/powerpc/include/asm/resource.h index 04bc4db8921b..04bc4db8921b 100644 --- a/include/asm-powerpc/resource.h +++ b/arch/powerpc/include/asm/resource.h | |||
diff --git a/include/asm-powerpc/rheap.h b/arch/powerpc/include/asm/rheap.h index 172381769cfc..172381769cfc 100644 --- a/include/asm-powerpc/rheap.h +++ b/arch/powerpc/include/asm/rheap.h | |||
diff --git a/include/asm-powerpc/rio.h b/arch/powerpc/include/asm/rio.h index 0018bf80cb25..0018bf80cb25 100644 --- a/include/asm-powerpc/rio.h +++ b/arch/powerpc/include/asm/rio.h | |||
diff --git a/include/asm-powerpc/rtas.h b/arch/powerpc/include/asm/rtas.h index 8eaa7b28d9d0..8eaa7b28d9d0 100644 --- a/include/asm-powerpc/rtas.h +++ b/arch/powerpc/include/asm/rtas.h | |||
diff --git a/include/asm-powerpc/rtc.h b/arch/powerpc/include/asm/rtc.h index f5802926b6c0..f5802926b6c0 100644 --- a/include/asm-powerpc/rtc.h +++ b/arch/powerpc/include/asm/rtc.h | |||
diff --git a/include/asm-powerpc/rwsem.h b/arch/powerpc/include/asm/rwsem.h index a6cc93b78b98..24cd9281ec37 100644 --- a/include/asm-powerpc/rwsem.h +++ b/arch/powerpc/include/asm/rwsem.h | |||
@@ -8,8 +8,8 @@ | |||
8 | #ifdef __KERNEL__ | 8 | #ifdef __KERNEL__ |
9 | 9 | ||
10 | /* | 10 | /* |
11 | * include/asm-powerpc/rwsem.h: R/W semaphores for PPC using the stuff | 11 | * R/W semaphores for PPC using the stuff in lib/rwsem.c. |
12 | * in lib/rwsem.c. Adapted largely from include/asm-i386/rwsem.h | 12 | * Adapted largely from include/asm-i386/rwsem.h |
13 | * by Paul Mackerras <paulus@samba.org>. | 13 | * by Paul Mackerras <paulus@samba.org>. |
14 | */ | 14 | */ |
15 | 15 | ||
diff --git a/include/asm-powerpc/scatterlist.h b/arch/powerpc/include/asm/scatterlist.h index fcf7d55afe45..fcf7d55afe45 100644 --- a/include/asm-powerpc/scatterlist.h +++ b/arch/powerpc/include/asm/scatterlist.h | |||
diff --git a/include/asm-powerpc/seccomp.h b/arch/powerpc/include/asm/seccomp.h index 853765eb1f65..853765eb1f65 100644 --- a/include/asm-powerpc/seccomp.h +++ b/arch/powerpc/include/asm/seccomp.h | |||
diff --git a/include/asm-powerpc/sections.h b/arch/powerpc/include/asm/sections.h index 916018e425c4..916018e425c4 100644 --- a/include/asm-powerpc/sections.h +++ b/arch/powerpc/include/asm/sections.h | |||
diff --git a/include/asm-powerpc/sembuf.h b/arch/powerpc/include/asm/sembuf.h index 99a41938ae3d..99a41938ae3d 100644 --- a/include/asm-powerpc/sembuf.h +++ b/arch/powerpc/include/asm/sembuf.h | |||
diff --git a/include/asm-powerpc/serial.h b/arch/powerpc/include/asm/serial.h index 3e8589b43cb2..3e8589b43cb2 100644 --- a/include/asm-powerpc/serial.h +++ b/arch/powerpc/include/asm/serial.h | |||
diff --git a/include/asm-powerpc/setjmp.h b/arch/powerpc/include/asm/setjmp.h index 279d03a1eec6..279d03a1eec6 100644 --- a/include/asm-powerpc/setjmp.h +++ b/arch/powerpc/include/asm/setjmp.h | |||
diff --git a/include/asm-powerpc/setup.h b/arch/powerpc/include/asm/setup.h index 817fac0a0714..817fac0a0714 100644 --- a/include/asm-powerpc/setup.h +++ b/arch/powerpc/include/asm/setup.h | |||
diff --git a/include/asm-powerpc/shmbuf.h b/arch/powerpc/include/asm/shmbuf.h index 8efa39698b6c..8efa39698b6c 100644 --- a/include/asm-powerpc/shmbuf.h +++ b/arch/powerpc/include/asm/shmbuf.h | |||
diff --git a/include/asm-powerpc/shmparam.h b/arch/powerpc/include/asm/shmparam.h index 5cda42a6d39e..5cda42a6d39e 100644 --- a/include/asm-powerpc/shmparam.h +++ b/arch/powerpc/include/asm/shmparam.h | |||
diff --git a/include/asm-powerpc/sigcontext.h b/arch/powerpc/include/asm/sigcontext.h index 9c1f24fd5d11..9c1f24fd5d11 100644 --- a/include/asm-powerpc/sigcontext.h +++ b/arch/powerpc/include/asm/sigcontext.h | |||
diff --git a/include/asm-powerpc/siginfo.h b/arch/powerpc/include/asm/siginfo.h index 12f1bce037be..12f1bce037be 100644 --- a/include/asm-powerpc/siginfo.h +++ b/arch/powerpc/include/asm/siginfo.h | |||
diff --git a/include/asm-powerpc/signal.h b/arch/powerpc/include/asm/signal.h index a7360cdd99eb..a7360cdd99eb 100644 --- a/include/asm-powerpc/signal.h +++ b/arch/powerpc/include/asm/signal.h | |||
diff --git a/include/asm-powerpc/smp.h b/arch/powerpc/include/asm/smp.h index 4d28e1e4521b..4d28e1e4521b 100644 --- a/include/asm-powerpc/smp.h +++ b/arch/powerpc/include/asm/smp.h | |||
diff --git a/include/asm-powerpc/smu.h b/arch/powerpc/include/asm/smu.h index 7ae2753da565..7ae2753da565 100644 --- a/include/asm-powerpc/smu.h +++ b/arch/powerpc/include/asm/smu.h | |||
diff --git a/include/asm-powerpc/socket.h b/arch/powerpc/include/asm/socket.h index f5a4e168e498..f5a4e168e498 100644 --- a/include/asm-powerpc/socket.h +++ b/arch/powerpc/include/asm/socket.h | |||
diff --git a/include/asm-powerpc/sockios.h b/arch/powerpc/include/asm/sockios.h index 55cef7675a31..55cef7675a31 100644 --- a/include/asm-powerpc/sockios.h +++ b/arch/powerpc/include/asm/sockios.h | |||
diff --git a/include/asm-powerpc/sparsemem.h b/arch/powerpc/include/asm/sparsemem.h index 54a47ea2c3aa..54a47ea2c3aa 100644 --- a/include/asm-powerpc/sparsemem.h +++ b/arch/powerpc/include/asm/sparsemem.h | |||
diff --git a/include/asm-powerpc/spinlock.h b/arch/powerpc/include/asm/spinlock.h index f56a843f4705..f56a843f4705 100644 --- a/include/asm-powerpc/spinlock.h +++ b/arch/powerpc/include/asm/spinlock.h | |||
diff --git a/include/asm-powerpc/spinlock_types.h b/arch/powerpc/include/asm/spinlock_types.h index 74236c9f05b1..74236c9f05b1 100644 --- a/include/asm-powerpc/spinlock_types.h +++ b/arch/powerpc/include/asm/spinlock_types.h | |||
diff --git a/include/asm-powerpc/spu.h b/arch/powerpc/include/asm/spu.h index 8b2eb044270a..8b2eb044270a 100644 --- a/include/asm-powerpc/spu.h +++ b/arch/powerpc/include/asm/spu.h | |||
diff --git a/include/asm-powerpc/spu_csa.h b/arch/powerpc/include/asm/spu_csa.h index a40fd491250c..a40fd491250c 100644 --- a/include/asm-powerpc/spu_csa.h +++ b/arch/powerpc/include/asm/spu_csa.h | |||
diff --git a/include/asm-powerpc/spu_info.h b/arch/powerpc/include/asm/spu_info.h index 3545efbf9891..3545efbf9891 100644 --- a/include/asm-powerpc/spu_info.h +++ b/arch/powerpc/include/asm/spu_info.h | |||
diff --git a/include/asm-powerpc/spu_priv1.h b/arch/powerpc/include/asm/spu_priv1.h index 25020a34ce7f..25020a34ce7f 100644 --- a/include/asm-powerpc/spu_priv1.h +++ b/arch/powerpc/include/asm/spu_priv1.h | |||
diff --git a/include/asm-powerpc/sstep.h b/arch/powerpc/include/asm/sstep.h index f593b0f9b627..f593b0f9b627 100644 --- a/include/asm-powerpc/sstep.h +++ b/arch/powerpc/include/asm/sstep.h | |||
diff --git a/include/asm-powerpc/stat.h b/arch/powerpc/include/asm/stat.h index e4edc510b530..e4edc510b530 100644 --- a/include/asm-powerpc/stat.h +++ b/arch/powerpc/include/asm/stat.h | |||
diff --git a/include/asm-powerpc/statfs.h b/arch/powerpc/include/asm/statfs.h index 67024026c10d..67024026c10d 100644 --- a/include/asm-powerpc/statfs.h +++ b/arch/powerpc/include/asm/statfs.h | |||
diff --git a/include/asm-powerpc/string.h b/arch/powerpc/include/asm/string.h index e40010abcaf1..e40010abcaf1 100644 --- a/include/asm-powerpc/string.h +++ b/arch/powerpc/include/asm/string.h | |||
diff --git a/include/asm-powerpc/suspend.h b/arch/powerpc/include/asm/suspend.h index cbf2c9404c37..cbf2c9404c37 100644 --- a/include/asm-powerpc/suspend.h +++ b/arch/powerpc/include/asm/suspend.h | |||
diff --git a/include/asm-powerpc/synch.h b/arch/powerpc/include/asm/synch.h index 45963e80f557..45963e80f557 100644 --- a/include/asm-powerpc/synch.h +++ b/arch/powerpc/include/asm/synch.h | |||
diff --git a/include/asm-powerpc/syscall.h b/arch/powerpc/include/asm/syscall.h index efa7f0b879f3..efa7f0b879f3 100644 --- a/include/asm-powerpc/syscall.h +++ b/arch/powerpc/include/asm/syscall.h | |||
diff --git a/include/asm-powerpc/syscalls.h b/arch/powerpc/include/asm/syscalls.h index eb8eb400c664..eb8eb400c664 100644 --- a/include/asm-powerpc/syscalls.h +++ b/arch/powerpc/include/asm/syscalls.h | |||
diff --git a/include/asm-powerpc/systbl.h b/arch/powerpc/include/asm/systbl.h index e084272ed1c2..e084272ed1c2 100644 --- a/include/asm-powerpc/systbl.h +++ b/arch/powerpc/include/asm/systbl.h | |||
diff --git a/include/asm-powerpc/system.h b/arch/powerpc/include/asm/system.h index d6648c143322..d6648c143322 100644 --- a/include/asm-powerpc/system.h +++ b/arch/powerpc/include/asm/system.h | |||
diff --git a/include/asm-powerpc/tce.h b/arch/powerpc/include/asm/tce.h index f663634cccc9..f663634cccc9 100644 --- a/include/asm-powerpc/tce.h +++ b/arch/powerpc/include/asm/tce.h | |||
diff --git a/include/asm-powerpc/termbits.h b/arch/powerpc/include/asm/termbits.h index 6698188ca550..6698188ca550 100644 --- a/include/asm-powerpc/termbits.h +++ b/arch/powerpc/include/asm/termbits.h | |||
diff --git a/include/asm-powerpc/termios.h b/arch/powerpc/include/asm/termios.h index 2c14fea07c8a..2c14fea07c8a 100644 --- a/include/asm-powerpc/termios.h +++ b/arch/powerpc/include/asm/termios.h | |||
diff --git a/include/asm-powerpc/thread_info.h b/arch/powerpc/include/asm/thread_info.h index 9665a26a253a..9665a26a253a 100644 --- a/include/asm-powerpc/thread_info.h +++ b/arch/powerpc/include/asm/thread_info.h | |||
diff --git a/include/asm-powerpc/time.h b/arch/powerpc/include/asm/time.h index febd581ec9b0..febd581ec9b0 100644 --- a/include/asm-powerpc/time.h +++ b/arch/powerpc/include/asm/time.h | |||
diff --git a/include/asm-powerpc/timex.h b/arch/powerpc/include/asm/timex.h index c55e14f7ef44..c55e14f7ef44 100644 --- a/include/asm-powerpc/timex.h +++ b/arch/powerpc/include/asm/timex.h | |||
diff --git a/include/asm-powerpc/tlb.h b/arch/powerpc/include/asm/tlb.h index e20ff7541f36..e20ff7541f36 100644 --- a/include/asm-powerpc/tlb.h +++ b/arch/powerpc/include/asm/tlb.h | |||
diff --git a/include/asm-powerpc/tlbflush.h b/arch/powerpc/include/asm/tlbflush.h index 361cd5c7a32b..361cd5c7a32b 100644 --- a/include/asm-powerpc/tlbflush.h +++ b/arch/powerpc/include/asm/tlbflush.h | |||
diff --git a/include/asm-powerpc/topology.h b/arch/powerpc/include/asm/topology.h index c32da6f97999..c32da6f97999 100644 --- a/include/asm-powerpc/topology.h +++ b/arch/powerpc/include/asm/topology.h | |||
diff --git a/include/asm-powerpc/tsi108.h b/arch/powerpc/include/asm/tsi108.h index f8b60793b7a9..f8b60793b7a9 100644 --- a/include/asm-powerpc/tsi108.h +++ b/arch/powerpc/include/asm/tsi108.h | |||
diff --git a/include/asm-powerpc/tsi108_irq.h b/arch/powerpc/include/asm/tsi108_irq.h index 6ed93979fbe4..6ed93979fbe4 100644 --- a/include/asm-powerpc/tsi108_irq.h +++ b/arch/powerpc/include/asm/tsi108_irq.h | |||
diff --git a/include/asm-powerpc/tsi108_pci.h b/arch/powerpc/include/asm/tsi108_pci.h index 5653d7cc3e24..5653d7cc3e24 100644 --- a/include/asm-powerpc/tsi108_pci.h +++ b/arch/powerpc/include/asm/tsi108_pci.h | |||
diff --git a/include/asm-powerpc/types.h b/arch/powerpc/include/asm/types.h index d3374bc865ba..d3374bc865ba 100644 --- a/include/asm-powerpc/types.h +++ b/arch/powerpc/include/asm/types.h | |||
diff --git a/include/asm-powerpc/uaccess.h b/arch/powerpc/include/asm/uaccess.h index bd0fb8495154..bd0fb8495154 100644 --- a/include/asm-powerpc/uaccess.h +++ b/arch/powerpc/include/asm/uaccess.h | |||
diff --git a/include/asm-powerpc/ucc.h b/arch/powerpc/include/asm/ucc.h index 46b09ba6bead..46b09ba6bead 100644 --- a/include/asm-powerpc/ucc.h +++ b/arch/powerpc/include/asm/ucc.h | |||
diff --git a/include/asm-powerpc/ucc_fast.h b/arch/powerpc/include/asm/ucc_fast.h index fce16abe7ee1..839aab8bf37d 100644 --- a/include/asm-powerpc/ucc_fast.h +++ b/arch/powerpc/include/asm/ucc_fast.h | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-powerpc/ucc_fast.h | ||
3 | * | ||
4 | * Internal header file for UCC FAST unit routines. | 2 | * Internal header file for UCC FAST unit routines. |
5 | * | 3 | * |
6 | * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved. | 4 | * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved. |
diff --git a/include/asm-powerpc/ucc_slow.h b/arch/powerpc/include/asm/ucc_slow.h index 0980e6ad335b..0980e6ad335b 100644 --- a/include/asm-powerpc/ucc_slow.h +++ b/arch/powerpc/include/asm/ucc_slow.h | |||
diff --git a/include/asm-powerpc/ucontext.h b/arch/powerpc/include/asm/ucontext.h index d9a4ddf0cc86..d9a4ddf0cc86 100644 --- a/include/asm-powerpc/ucontext.h +++ b/arch/powerpc/include/asm/ucontext.h | |||
diff --git a/include/asm-powerpc/udbg.h b/arch/powerpc/include/asm/udbg.h index 6418ceea44b7..6418ceea44b7 100644 --- a/include/asm-powerpc/udbg.h +++ b/arch/powerpc/include/asm/udbg.h | |||
diff --git a/include/asm-powerpc/uic.h b/arch/powerpc/include/asm/uic.h index 970eb7e2186a..597edfcae3d6 100644 --- a/include/asm-powerpc/uic.h +++ b/arch/powerpc/include/asm/uic.h | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-powerpc/uic.h | ||
3 | * | ||
4 | * IBM PPC4xx UIC external definitions and structure. | 2 | * IBM PPC4xx UIC external definitions and structure. |
5 | * | 3 | * |
6 | * Maintainer: David Gibson <dwg@au1.ibm.com> | 4 | * Maintainer: David Gibson <dwg@au1.ibm.com> |
diff --git a/include/asm-powerpc/unaligned.h b/arch/powerpc/include/asm/unaligned.h index 5f1b1e3c2137..5f1b1e3c2137 100644 --- a/include/asm-powerpc/unaligned.h +++ b/arch/powerpc/include/asm/unaligned.h | |||
diff --git a/include/asm-powerpc/uninorth.h b/arch/powerpc/include/asm/uninorth.h index f737732c3861..f737732c3861 100644 --- a/include/asm-powerpc/uninorth.h +++ b/arch/powerpc/include/asm/uninorth.h | |||
diff --git a/include/asm-powerpc/unistd.h b/arch/powerpc/include/asm/unistd.h index e07d0c76ed77..e07d0c76ed77 100644 --- a/include/asm-powerpc/unistd.h +++ b/arch/powerpc/include/asm/unistd.h | |||
diff --git a/include/asm-powerpc/user.h b/arch/powerpc/include/asm/user.h index 3fd4545dd74e..3fd4545dd74e 100644 --- a/include/asm-powerpc/user.h +++ b/arch/powerpc/include/asm/user.h | |||
diff --git a/include/asm-powerpc/vdso.h b/arch/powerpc/include/asm/vdso.h index 26fc449bd989..26fc449bd989 100644 --- a/include/asm-powerpc/vdso.h +++ b/arch/powerpc/include/asm/vdso.h | |||
diff --git a/include/asm-powerpc/vdso_datapage.h b/arch/powerpc/include/asm/vdso_datapage.h index f01393224b52..f01393224b52 100644 --- a/include/asm-powerpc/vdso_datapage.h +++ b/arch/powerpc/include/asm/vdso_datapage.h | |||
diff --git a/include/asm-powerpc/vga.h b/arch/powerpc/include/asm/vga.h index a2eac409c1ec..a2eac409c1ec 100644 --- a/include/asm-powerpc/vga.h +++ b/arch/powerpc/include/asm/vga.h | |||
diff --git a/include/asm-powerpc/vio.h b/arch/powerpc/include/asm/vio.h index 0a290a195946..0a290a195946 100644 --- a/include/asm-powerpc/vio.h +++ b/arch/powerpc/include/asm/vio.h | |||
diff --git a/include/asm-powerpc/xilinx_intc.h b/arch/powerpc/include/asm/xilinx_intc.h index 343612f8fece..343612f8fece 100644 --- a/include/asm-powerpc/xilinx_intc.h +++ b/arch/powerpc/include/asm/xilinx_intc.h | |||
diff --git a/include/asm-powerpc/xmon.h b/arch/powerpc/include/asm/xmon.h index 5eb8e599e5cc..5eb8e599e5cc 100644 --- a/include/asm-powerpc/xmon.h +++ b/arch/powerpc/include/asm/xmon.h | |||
diff --git a/include/asm-powerpc/xor.h b/arch/powerpc/include/asm/xor.h index c82eb12a5b18..c82eb12a5b18 100644 --- a/include/asm-powerpc/xor.h +++ b/arch/powerpc/include/asm/xor.h | |||
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 1a4094704b1f..64f5948ebc9d 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
@@ -59,8 +59,6 @@ obj64-$(CONFIG_HIBERNATION) += swsusp_asm64.o | |||
59 | obj-$(CONFIG_MODULES) += module.o module_$(CONFIG_WORD_SIZE).o | 59 | obj-$(CONFIG_MODULES) += module.o module_$(CONFIG_WORD_SIZE).o |
60 | obj-$(CONFIG_44x) += cpu_setup_44x.o | 60 | obj-$(CONFIG_44x) += cpu_setup_44x.o |
61 | 61 | ||
62 | ifeq ($(CONFIG_PPC_MERGE),y) | ||
63 | |||
64 | extra-$(CONFIG_PPC_STD_MMU) := head_32.o | 62 | extra-$(CONFIG_PPC_STD_MMU) := head_32.o |
65 | extra-$(CONFIG_PPC64) := head_64.o | 63 | extra-$(CONFIG_PPC64) := head_64.o |
66 | extra-$(CONFIG_40x) := head_40x.o | 64 | extra-$(CONFIG_40x) := head_40x.o |
@@ -100,12 +98,6 @@ ifneq ($(CONFIG_PPC_INDIRECT_IO),y) | |||
100 | obj-y += iomap.o | 98 | obj-y += iomap.o |
101 | endif | 99 | endif |
102 | 100 | ||
103 | else | ||
104 | # stuff used from here for ARCH=ppc | ||
105 | smpobj-$(CONFIG_SMP) += smp.o | ||
106 | |||
107 | endif | ||
108 | |||
109 | obj-$(CONFIG_PPC64) += $(obj64-y) | 101 | obj-$(CONFIG_PPC64) += $(obj64-y) |
110 | 102 | ||
111 | extra-$(CONFIG_PPC_FPU) += fpu.o | 103 | extra-$(CONFIG_PPC_FPU) += fpu.o |
@@ -121,9 +113,6 @@ PHONY += systbl_chk | |||
121 | systbl_chk: $(src)/systbl_chk.sh $(obj)/systbl_chk.i | 113 | systbl_chk: $(src)/systbl_chk.sh $(obj)/systbl_chk.i |
122 | $(call cmd,systbl_chk) | 114 | $(call cmd,systbl_chk) |
123 | 115 | ||
124 | |||
125 | ifeq ($(CONFIG_PPC_MERGE),y) | ||
126 | |||
127 | $(obj)/built-in.o: prom_init_check | 116 | $(obj)/built-in.o: prom_init_check |
128 | 117 | ||
129 | quiet_cmd_prom_init_check = CALL $< | 118 | quiet_cmd_prom_init_check = CALL $< |
@@ -133,7 +122,4 @@ PHONY += prom_init_check | |||
133 | prom_init_check: $(src)/prom_init_check.sh $(obj)/prom_init.o | 122 | prom_init_check: $(src)/prom_init_check.sh $(obj)/prom_init.o |
134 | $(call cmd,prom_init_check) | 123 | $(call cmd,prom_init_check) |
135 | 124 | ||
136 | endif | ||
137 | |||
138 | |||
139 | clean-files := vmlinux.lds | 125 | clean-files := vmlinux.lds |
diff --git a/arch/powerpc/kernel/cpu_setup_44x.S b/arch/powerpc/kernel/cpu_setup_44x.S index 5465e8de0e61..80cac984d85d 100644 --- a/arch/powerpc/kernel/cpu_setup_44x.S +++ b/arch/powerpc/kernel/cpu_setup_44x.S | |||
@@ -39,12 +39,6 @@ _GLOBAL(__setup_cpu_440gx) | |||
39 | _GLOBAL(__setup_cpu_440spe) | 39 | _GLOBAL(__setup_cpu_440spe) |
40 | b __fixup_440A_mcheck | 40 | b __fixup_440A_mcheck |
41 | 41 | ||
42 | /* Temporary fixup for arch/ppc until we kill the whole thing */ | ||
43 | #ifndef CONFIG_PPC_MERGE | ||
44 | _GLOBAL(__fixup_440A_mcheck) | ||
45 | blr | ||
46 | #endif | ||
47 | |||
48 | /* enable APU between CPU and FPU */ | 42 | /* enable APU between CPU and FPU */ |
49 | _GLOBAL(__init_fpu_44x) | 43 | _GLOBAL(__init_fpu_44x) |
50 | mfspr r3,SPRN_CCR0 | 44 | mfspr r3,SPRN_CCR0 |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 6ac8612da3c3..d972decf0324 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -77,22 +77,12 @@ static int ppc_spurious_interrupts; | |||
77 | EXPORT_SYMBOL(__irq_offset_value); | 77 | EXPORT_SYMBOL(__irq_offset_value); |
78 | atomic_t ppc_n_lost_interrupts; | 78 | atomic_t ppc_n_lost_interrupts; |
79 | 79 | ||
80 | #ifndef CONFIG_PPC_MERGE | ||
81 | #define NR_MASK_WORDS ((NR_IRQS + 31) / 32) | ||
82 | unsigned long ppc_cached_irq_mask[NR_MASK_WORDS]; | ||
83 | #endif | ||
84 | |||
85 | #ifdef CONFIG_TAU_INT | 80 | #ifdef CONFIG_TAU_INT |
86 | extern int tau_initialized; | 81 | extern int tau_initialized; |
87 | extern int tau_interrupts(int); | 82 | extern int tau_interrupts(int); |
88 | #endif | 83 | #endif |
89 | #endif /* CONFIG_PPC32 */ | 84 | #endif /* CONFIG_PPC32 */ |
90 | 85 | ||
91 | #if defined(CONFIG_SMP) && !defined(CONFIG_PPC_MERGE) | ||
92 | extern atomic_t ipi_recv; | ||
93 | extern atomic_t ipi_sent; | ||
94 | #endif | ||
95 | |||
96 | #ifdef CONFIG_PPC64 | 86 | #ifdef CONFIG_PPC64 |
97 | EXPORT_SYMBOL(irq_desc); | 87 | EXPORT_SYMBOL(irq_desc); |
98 | 88 | ||
@@ -216,21 +206,14 @@ int show_interrupts(struct seq_file *p, void *v) | |||
216 | skip: | 206 | skip: |
217 | spin_unlock_irqrestore(&desc->lock, flags); | 207 | spin_unlock_irqrestore(&desc->lock, flags); |
218 | } else if (i == NR_IRQS) { | 208 | } else if (i == NR_IRQS) { |
219 | #ifdef CONFIG_PPC32 | 209 | #if defined(CONFIG_PPC32) && defined(CONFIG_TAU_INT) |
220 | #ifdef CONFIG_TAU_INT | ||
221 | if (tau_initialized){ | 210 | if (tau_initialized){ |
222 | seq_puts(p, "TAU: "); | 211 | seq_puts(p, "TAU: "); |
223 | for_each_online_cpu(j) | 212 | for_each_online_cpu(j) |
224 | seq_printf(p, "%10u ", tau_interrupts(j)); | 213 | seq_printf(p, "%10u ", tau_interrupts(j)); |
225 | seq_puts(p, " PowerPC Thermal Assist (cpu temp)\n"); | 214 | seq_puts(p, " PowerPC Thermal Assist (cpu temp)\n"); |
226 | } | 215 | } |
227 | #endif | 216 | #endif /* CONFIG_PPC32 && CONFIG_TAU_INT*/ |
228 | #if defined(CONFIG_SMP) && !defined(CONFIG_PPC_MERGE) | ||
229 | /* should this be per processor send/receive? */ | ||
230 | seq_printf(p, "IPI (recv/sent): %10u/%u\n", | ||
231 | atomic_read(&ipi_recv), atomic_read(&ipi_sent)); | ||
232 | #endif | ||
233 | #endif /* CONFIG_PPC32 */ | ||
234 | seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts); | 217 | seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts); |
235 | } | 218 | } |
236 | return 0; | 219 | return 0; |
@@ -454,8 +437,6 @@ void do_softirq(void) | |||
454 | * IRQ controller and virtual interrupts | 437 | * IRQ controller and virtual interrupts |
455 | */ | 438 | */ |
456 | 439 | ||
457 | #ifdef CONFIG_PPC_MERGE | ||
458 | |||
459 | static LIST_HEAD(irq_hosts); | 440 | static LIST_HEAD(irq_hosts); |
460 | static DEFINE_SPINLOCK(irq_big_lock); | 441 | static DEFINE_SPINLOCK(irq_big_lock); |
461 | static DEFINE_PER_CPU(unsigned int, irq_radix_reader); | 442 | static DEFINE_PER_CPU(unsigned int, irq_radix_reader); |
@@ -1114,8 +1095,6 @@ static int __init irq_debugfs_init(void) | |||
1114 | __initcall(irq_debugfs_init); | 1095 | __initcall(irq_debugfs_init); |
1115 | #endif /* CONFIG_VIRQ_DEBUG */ | 1096 | #endif /* CONFIG_VIRQ_DEBUG */ |
1116 | 1097 | ||
1117 | #endif /* CONFIG_PPC_MERGE */ | ||
1118 | |||
1119 | #ifdef CONFIG_PPC64 | 1098 | #ifdef CONFIG_PPC64 |
1120 | static int __init setup_noirqdistrib(char *str) | 1099 | static int __init setup_noirqdistrib(char *str) |
1121 | { | 1100 | { |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index e030f3bd5024..957bded0020d 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -276,10 +276,8 @@ int set_dabr(unsigned long dabr) | |||
276 | { | 276 | { |
277 | __get_cpu_var(current_dabr) = dabr; | 277 | __get_cpu_var(current_dabr) = dabr; |
278 | 278 | ||
279 | #ifdef CONFIG_PPC_MERGE /* XXX for now */ | ||
280 | if (ppc_md.set_dabr) | 279 | if (ppc_md.set_dabr) |
281 | return ppc_md.set_dabr(dabr); | 280 | return ppc_md.set_dabr(dabr); |
282 | #endif | ||
283 | 281 | ||
284 | /* XXX should we have a CPU_FTR_HAS_DABR ? */ | 282 | /* XXX should we have a CPU_FTR_HAS_DABR ? */ |
285 | #if defined(CONFIG_PPC64) || defined(CONFIG_6xx) | 283 | #if defined(CONFIG_PPC64) || defined(CONFIG_6xx) |
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c index f177c60ea766..65639a43e644 100644 --- a/arch/powerpc/kernel/vdso.c +++ b/arch/powerpc/kernel/vdso.c | |||
@@ -788,9 +788,7 @@ static int __init vdso_init(void) | |||
788 | 788 | ||
789 | return 0; | 789 | return 0; |
790 | } | 790 | } |
791 | #ifdef CONFIG_PPC_MERGE | ||
792 | arch_initcall(vdso_init); | 791 | arch_initcall(vdso_init); |
793 | #endif | ||
794 | 792 | ||
795 | int in_gate_area_no_task(unsigned long addr) | 793 | int in_gate_area_no_task(unsigned long addr) |
796 | { | 794 | { |
diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile index 2a88e8b9a3c6..d69912c07ce7 100644 --- a/arch/powerpc/lib/Makefile +++ b/arch/powerpc/lib/Makefile | |||
@@ -6,12 +6,10 @@ ifeq ($(CONFIG_PPC64),y) | |||
6 | EXTRA_CFLAGS += -mno-minimal-toc | 6 | EXTRA_CFLAGS += -mno-minimal-toc |
7 | endif | 7 | endif |
8 | 8 | ||
9 | ifeq ($(CONFIG_PPC_MERGE),y) | ||
10 | obj-y := string.o alloc.o \ | 9 | obj-y := string.o alloc.o \ |
11 | checksum_$(CONFIG_WORD_SIZE).o | 10 | checksum_$(CONFIG_WORD_SIZE).o |
12 | obj-$(CONFIG_PPC32) += div64.o copy_32.o crtsavres.o | 11 | obj-$(CONFIG_PPC32) += div64.o copy_32.o crtsavres.o |
13 | obj-$(CONFIG_HAS_IOMEM) += devres.o | 12 | obj-$(CONFIG_HAS_IOMEM) += devres.o |
14 | endif | ||
15 | 13 | ||
16 | obj-$(CONFIG_PPC64) += copypage_64.o copyuser_64.o \ | 14 | obj-$(CONFIG_PPC64) += copypage_64.o copyuser_64.o \ |
17 | memcpy_64.o usercopy_64.o mem_64.o string.o | 15 | memcpy_64.o usercopy_64.o mem_64.o string.o |
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 702691cb9e82..1c93c255873b 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
@@ -311,7 +311,7 @@ void __init paging_init(void) | |||
311 | #endif /* CONFIG_HIGHMEM */ | 311 | #endif /* CONFIG_HIGHMEM */ |
312 | 312 | ||
313 | printk(KERN_DEBUG "Top of RAM: 0x%llx, Total RAM: 0x%lx\n", | 313 | printk(KERN_DEBUG "Top of RAM: 0x%llx, Total RAM: 0x%lx\n", |
314 | (u64)top_of_ram, total_ram); | 314 | (unsigned long long)top_of_ram, total_ram); |
315 | printk(KERN_DEBUG "Memory hole size: %ldMB\n", | 315 | printk(KERN_DEBUG "Memory hole size: %ldMB\n", |
316 | (long int)((top_of_ram - total_ram) >> 20)); | 316 | (long int)((top_of_ram - total_ram) >> 20)); |
317 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); | 317 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); |
diff --git a/arch/powerpc/mm/ppc_mmu_32.c b/arch/powerpc/mm/ppc_mmu_32.c index c53145f61942..6aa120813775 100644 --- a/arch/powerpc/mm/ppc_mmu_32.c +++ b/arch/powerpc/mm/ppc_mmu_32.c | |||
@@ -236,8 +236,8 @@ void __init MMU_init_hw(void) | |||
236 | 236 | ||
237 | Hash_end = (struct hash_pte *) ((unsigned long)Hash + Hash_size); | 237 | Hash_end = (struct hash_pte *) ((unsigned long)Hash + Hash_size); |
238 | 238 | ||
239 | printk("Total memory = %ldMB; using %ldkB for hash table (at %p)\n", | 239 | printk("Total memory = %lldMB; using %ldkB for hash table (at %p)\n", |
240 | total_memory >> 20, Hash_size >> 10, Hash); | 240 | (unsigned long long)(total_memory >> 20), Hash_size >> 10, Hash); |
241 | 241 | ||
242 | 242 | ||
243 | /* | 243 | /* |
diff --git a/arch/powerpc/mm/tlb_64.c b/arch/powerpc/mm/tlb_64.c index 409fcc7b63ce..be7dd422c0fa 100644 --- a/arch/powerpc/mm/tlb_64.c +++ b/arch/powerpc/mm/tlb_64.c | |||
@@ -34,7 +34,7 @@ | |||
34 | DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch); | 34 | DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch); |
35 | 35 | ||
36 | /* This is declared as we are using the more or less generic | 36 | /* This is declared as we are using the more or less generic |
37 | * include/asm-powerpc/tlb.h file -- tgall | 37 | * arch/powerpc/include/asm/tlb.h file -- tgall |
38 | */ | 38 | */ |
39 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 39 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
40 | static DEFINE_PER_CPU(struct pte_freelist_batch *, pte_freelist_cur); | 40 | static DEFINE_PER_CPU(struct pte_freelist_batch *, pte_freelist_cur); |
diff --git a/arch/powerpc/platforms/52xx/Makefile b/arch/powerpc/platforms/52xx/Makefile index daf0e1568d6d..b8a52062738a 100644 --- a/arch/powerpc/platforms/52xx/Makefile +++ b/arch/powerpc/platforms/52xx/Makefile | |||
@@ -1,10 +1,8 @@ | |||
1 | # | 1 | # |
2 | # Makefile for 52xx based boards | 2 | # Makefile for 52xx based boards |
3 | # | 3 | # |
4 | ifeq ($(CONFIG_PPC_MERGE),y) | ||
5 | obj-y += mpc52xx_pic.o mpc52xx_common.o | 4 | obj-y += mpc52xx_pic.o mpc52xx_common.o |
6 | obj-$(CONFIG_PCI) += mpc52xx_pci.o | 5 | obj-$(CONFIG_PCI) += mpc52xx_pci.o |
7 | endif | ||
8 | 6 | ||
9 | obj-$(CONFIG_PPC_MPC5200_SIMPLE) += mpc5200_simple.o | 7 | obj-$(CONFIG_PPC_MPC5200_SIMPLE) += mpc5200_simple.o |
10 | obj-$(CONFIG_PPC_EFIKA) += efika.o | 8 | obj-$(CONFIG_PPC_EFIKA) += efika.o |
@@ -15,4 +13,4 @@ ifeq ($(CONFIG_PPC_LITE5200),y) | |||
15 | obj-$(CONFIG_PM) += lite5200_sleep.o lite5200_pm.o | 13 | obj-$(CONFIG_PM) += lite5200_sleep.o lite5200_pm.o |
16 | endif | 14 | endif |
17 | 15 | ||
18 | obj-$(CONFIG_PPC_MPC5200_GPIO) += mpc52xx_gpio.o \ No newline at end of file | 16 | obj-$(CONFIG_PPC_MPC5200_GPIO) += mpc52xx_gpio.o |
diff --git a/arch/powerpc/platforms/86xx/mpc86xx_smp.c b/arch/powerpc/platforms/86xx/mpc86xx_smp.c index 835f2dc24dc9..014e26cda08d 100644 --- a/arch/powerpc/platforms/86xx/mpc86xx_smp.c +++ b/arch/powerpc/platforms/86xx/mpc86xx_smp.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <asm/page.h> | 19 | #include <asm/page.h> |
20 | #include <asm/pgtable.h> | 20 | #include <asm/pgtable.h> |
21 | #include <asm/pci-bridge.h> | 21 | #include <asm/pci-bridge.h> |
22 | #include <asm-powerpc/mpic.h> | 22 | #include <asm/mpic.h> |
23 | #include <asm/mpc86xx.h> | 23 | #include <asm/mpc86xx.h> |
24 | #include <asm/cacheflush.h> | 24 | #include <asm/cacheflush.h> |
25 | 25 | ||
diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile index 423a0234dc31..8079e0b4fd69 100644 --- a/arch/powerpc/platforms/Makefile +++ b/arch/powerpc/platforms/Makefile | |||
@@ -1,13 +1,7 @@ | |||
1 | 1 | ||
2 | obj-$(CONFIG_FSL_ULI1575) += fsl_uli1575.o | 2 | obj-$(CONFIG_FSL_ULI1575) += fsl_uli1575.o |
3 | 3 | ||
4 | ifeq ($(CONFIG_PPC_MERGE),y) | ||
5 | obj-$(CONFIG_PPC_PMAC) += powermac/ | 4 | obj-$(CONFIG_PPC_PMAC) += powermac/ |
6 | else | ||
7 | ifeq ($(CONFIG_PPC64),y) | ||
8 | obj-$(CONFIG_PPC_PMAC) += powermac/ | ||
9 | endif | ||
10 | endif | ||
11 | obj-$(CONFIG_PPC_CHRP) += chrp/ | 5 | obj-$(CONFIG_PPC_CHRP) += chrp/ |
12 | obj-$(CONFIG_40x) += 40x/ | 6 | obj-$(CONFIG_40x) += 40x/ |
13 | obj-$(CONFIG_44x) += 44x/ | 7 | obj-$(CONFIG_44x) += 44x/ |
diff --git a/arch/powerpc/platforms/powermac/Makefile b/arch/powerpc/platforms/powermac/Makefile index 89774177b209..58ecdd72630f 100644 --- a/arch/powerpc/platforms/powermac/Makefile +++ b/arch/powerpc/platforms/powermac/Makefile | |||
@@ -7,7 +7,7 @@ endif | |||
7 | 7 | ||
8 | obj-y += pic.o setup.o time.o feature.o pci.o \ | 8 | obj-y += pic.o setup.o time.o feature.o pci.o \ |
9 | sleep.o low_i2c.o cache.o pfunc_core.o \ | 9 | sleep.o low_i2c.o cache.o pfunc_core.o \ |
10 | pfunc_base.o | 10 | pfunc_base.o udbg_scc.o udbg_adb.o |
11 | obj-$(CONFIG_PMAC_BACKLIGHT) += backlight.o | 11 | obj-$(CONFIG_PMAC_BACKLIGHT) += backlight.o |
12 | obj-$(CONFIG_CPU_FREQ_PMAC) += cpufreq_32.o | 12 | obj-$(CONFIG_CPU_FREQ_PMAC) += cpufreq_32.o |
13 | obj-$(CONFIG_CPU_FREQ_PMAC64) += cpufreq_64.o | 13 | obj-$(CONFIG_CPU_FREQ_PMAC64) += cpufreq_64.o |
@@ -19,4 +19,3 @@ obj-$(CONFIG_NVRAM:m=y) += nvram.o | |||
19 | obj-$(CONFIG_PPC64) += nvram.o | 19 | obj-$(CONFIG_PPC64) += nvram.o |
20 | obj-$(CONFIG_PPC32) += bootx_init.o | 20 | obj-$(CONFIG_PPC32) += bootx_init.o |
21 | obj-$(CONFIG_SMP) += smp.o | 21 | obj-$(CONFIG_SMP) += smp.o |
22 | obj-$(CONFIG_PPC_MERGE) += udbg_scc.o udbg_adb.o | ||
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile index 16a0ed28eb00..a90054b56d5c 100644 --- a/arch/powerpc/sysdev/Makefile +++ b/arch/powerpc/sysdev/Makefile | |||
@@ -25,7 +25,6 @@ obj-$(CONFIG_MV64X60) += $(mv64x60-y) mv64x60_pic.o mv64x60_dev.o \ | |||
25 | obj-$(CONFIG_RTC_DRV_CMOS) += rtc_cmos_setup.o | 25 | obj-$(CONFIG_RTC_DRV_CMOS) += rtc_cmos_setup.o |
26 | obj-$(CONFIG_AXON_RAM) += axonram.o | 26 | obj-$(CONFIG_AXON_RAM) += axonram.o |
27 | 27 | ||
28 | ifeq ($(CONFIG_PPC_MERGE),y) | ||
29 | obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o | 28 | obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o |
30 | obj-$(CONFIG_PPC_I8259) += i8259.o | 29 | obj-$(CONFIG_PPC_I8259) += i8259.o |
31 | obj-$(CONFIG_IPIC) += ipic.o | 30 | obj-$(CONFIG_IPIC) += ipic.o |
@@ -36,7 +35,6 @@ obj-$(CONFIG_OF_RTC) += of_rtc.o | |||
36 | ifeq ($(CONFIG_PCI),y) | 35 | ifeq ($(CONFIG_PCI),y) |
37 | obj-$(CONFIG_4xx) += ppc4xx_pci.o | 36 | obj-$(CONFIG_4xx) += ppc4xx_pci.o |
38 | endif | 37 | endif |
39 | endif | ||
40 | 38 | ||
41 | # Temporary hack until we have migrated to asm-powerpc | 39 | # Temporary hack until we have migrated to asm-powerpc |
42 | ifeq ($(ARCH),powerpc) | 40 | ifeq ($(ARCH),powerpc) |
diff --git a/include/asm-s390/Kbuild b/arch/s390/include/asm/Kbuild index 63a23415fba6..63a23415fba6 100644 --- a/include/asm-s390/Kbuild +++ b/arch/s390/include/asm/Kbuild | |||
diff --git a/include/asm-s390/airq.h b/arch/s390/include/asm/airq.h index 1ac80d6b0588..1ac80d6b0588 100644 --- a/include/asm-s390/airq.h +++ b/arch/s390/include/asm/airq.h | |||
diff --git a/include/asm-s390/appldata.h b/arch/s390/include/asm/appldata.h index 79283dac8281..79283dac8281 100644 --- a/include/asm-s390/appldata.h +++ b/arch/s390/include/asm/appldata.h | |||
diff --git a/include/asm-s390/atomic.h b/arch/s390/include/asm/atomic.h index 2d184655bc5d..2d184655bc5d 100644 --- a/include/asm-s390/atomic.h +++ b/arch/s390/include/asm/atomic.h | |||
diff --git a/include/asm-s390/auxvec.h b/arch/s390/include/asm/auxvec.h index 0d340720fd99..0d340720fd99 100644 --- a/include/asm-s390/auxvec.h +++ b/arch/s390/include/asm/auxvec.h | |||
diff --git a/include/asm-s390/bitops.h b/arch/s390/include/asm/bitops.h index b4eb24ab5af9..b4eb24ab5af9 100644 --- a/include/asm-s390/bitops.h +++ b/arch/s390/include/asm/bitops.h | |||
diff --git a/include/asm-s390/bug.h b/arch/s390/include/asm/bug.h index 384e3621e341..384e3621e341 100644 --- a/include/asm-s390/bug.h +++ b/arch/s390/include/asm/bug.h | |||
diff --git a/include/asm-s390/bugs.h b/arch/s390/include/asm/bugs.h index 011f1e6a2a6c..011f1e6a2a6c 100644 --- a/include/asm-s390/bugs.h +++ b/arch/s390/include/asm/bugs.h | |||
diff --git a/include/asm-s390/byteorder.h b/arch/s390/include/asm/byteorder.h index 1fe2492baa8d..1fe2492baa8d 100644 --- a/include/asm-s390/byteorder.h +++ b/arch/s390/include/asm/byteorder.h | |||
diff --git a/include/asm-s390/cache.h b/arch/s390/include/asm/cache.h index 9b866816863c..9b866816863c 100644 --- a/include/asm-s390/cache.h +++ b/arch/s390/include/asm/cache.h | |||
diff --git a/include/asm-s390/cacheflush.h b/arch/s390/include/asm/cacheflush.h index 49d5af916d01..49d5af916d01 100644 --- a/include/asm-s390/cacheflush.h +++ b/arch/s390/include/asm/cacheflush.h | |||
diff --git a/include/asm-s390/ccwdev.h b/arch/s390/include/asm/ccwdev.h index ba007d8df941..ba007d8df941 100644 --- a/include/asm-s390/ccwdev.h +++ b/arch/s390/include/asm/ccwdev.h | |||
diff --git a/include/asm-s390/ccwgroup.h b/arch/s390/include/asm/ccwgroup.h index a27f68985a79..a27f68985a79 100644 --- a/include/asm-s390/ccwgroup.h +++ b/arch/s390/include/asm/ccwgroup.h | |||
diff --git a/include/asm-s390/checksum.h b/arch/s390/include/asm/checksum.h index d5a8e7c1477c..d5a8e7c1477c 100644 --- a/include/asm-s390/checksum.h +++ b/arch/s390/include/asm/checksum.h | |||
diff --git a/include/asm-s390/chpid.h b/arch/s390/include/asm/chpid.h index dfe3c7f3439a..dfe3c7f3439a 100644 --- a/include/asm-s390/chpid.h +++ b/arch/s390/include/asm/chpid.h | |||
diff --git a/include/asm-s390/chsc.h b/arch/s390/include/asm/chsc.h index d38d0cf62d4b..d38d0cf62d4b 100644 --- a/include/asm-s390/chsc.h +++ b/arch/s390/include/asm/chsc.h | |||
diff --git a/include/asm-s390/cio.h b/arch/s390/include/asm/cio.h index 6dccb071aec3..6dccb071aec3 100644 --- a/include/asm-s390/cio.h +++ b/arch/s390/include/asm/cio.h | |||
diff --git a/include/asm-s390/cmb.h b/arch/s390/include/asm/cmb.h index 50196857d27a..50196857d27a 100644 --- a/include/asm-s390/cmb.h +++ b/arch/s390/include/asm/cmb.h | |||
diff --git a/include/asm-s390/compat.h b/arch/s390/include/asm/compat.h index de065b32381a..de065b32381a 100644 --- a/include/asm-s390/compat.h +++ b/arch/s390/include/asm/compat.h | |||
diff --git a/include/asm-s390/cpcmd.h b/arch/s390/include/asm/cpcmd.h index 48a9eab16429..48a9eab16429 100644 --- a/include/asm-s390/cpcmd.h +++ b/arch/s390/include/asm/cpcmd.h | |||
diff --git a/include/asm-s390/cpu.h b/arch/s390/include/asm/cpu.h index e5a6a9ba3adf..e5a6a9ba3adf 100644 --- a/include/asm-s390/cpu.h +++ b/arch/s390/include/asm/cpu.h | |||
diff --git a/include/asm-s390/cputime.h b/arch/s390/include/asm/cputime.h index 133ce054fc89..133ce054fc89 100644 --- a/include/asm-s390/cputime.h +++ b/arch/s390/include/asm/cputime.h | |||
diff --git a/include/asm-s390/current.h b/arch/s390/include/asm/current.h index 83cf36cde2da..83cf36cde2da 100644 --- a/include/asm-s390/current.h +++ b/arch/s390/include/asm/current.h | |||
diff --git a/include/asm-s390/dasd.h b/arch/s390/include/asm/dasd.h index 3f002e13d024..3f002e13d024 100644 --- a/include/asm-s390/dasd.h +++ b/arch/s390/include/asm/dasd.h | |||
diff --git a/include/asm-s390/debug.h b/arch/s390/include/asm/debug.h index 9450ce6e32de..9450ce6e32de 100644 --- a/include/asm-s390/debug.h +++ b/arch/s390/include/asm/debug.h | |||
diff --git a/include/asm-s390/delay.h b/arch/s390/include/asm/delay.h index 78357314c450..78357314c450 100644 --- a/include/asm-s390/delay.h +++ b/arch/s390/include/asm/delay.h | |||
diff --git a/include/asm-s390/device.h b/arch/s390/include/asm/device.h index d8f9872b0e2d..d8f9872b0e2d 100644 --- a/include/asm-s390/device.h +++ b/arch/s390/include/asm/device.h | |||
diff --git a/include/asm-s390/diag.h b/arch/s390/include/asm/diag.h index 72b2e2f2d32d..72b2e2f2d32d 100644 --- a/include/asm-s390/diag.h +++ b/arch/s390/include/asm/diag.h | |||
diff --git a/include/asm-s390/div64.h b/arch/s390/include/asm/div64.h index 6cd978cefb28..6cd978cefb28 100644 --- a/include/asm-s390/div64.h +++ b/arch/s390/include/asm/div64.h | |||
diff --git a/include/asm-s390/dma.h b/arch/s390/include/asm/dma.h index 7425c6af6cd4..7425c6af6cd4 100644 --- a/include/asm-s390/dma.h +++ b/arch/s390/include/asm/dma.h | |||
diff --git a/include/asm-s390/ebcdic.h b/arch/s390/include/asm/ebcdic.h index 7f6f641d32f4..7f6f641d32f4 100644 --- a/include/asm-s390/ebcdic.h +++ b/arch/s390/include/asm/ebcdic.h | |||
diff --git a/include/asm-s390/elf.h b/arch/s390/include/asm/elf.h index 3cad56923815..3cad56923815 100644 --- a/include/asm-s390/elf.h +++ b/arch/s390/include/asm/elf.h | |||
diff --git a/include/asm-s390/emergency-restart.h b/arch/s390/include/asm/emergency-restart.h index 108d8c48e42e..108d8c48e42e 100644 --- a/include/asm-s390/emergency-restart.h +++ b/arch/s390/include/asm/emergency-restart.h | |||
diff --git a/include/asm-s390/errno.h b/arch/s390/include/asm/errno.h index e41d5b37c4d6..e41d5b37c4d6 100644 --- a/include/asm-s390/errno.h +++ b/arch/s390/include/asm/errno.h | |||
diff --git a/include/asm-s390/etr.h b/arch/s390/include/asm/etr.h index 80ef58c61970..80ef58c61970 100644 --- a/include/asm-s390/etr.h +++ b/arch/s390/include/asm/etr.h | |||
diff --git a/include/asm-s390/extmem.h b/arch/s390/include/asm/extmem.h index 33837d756184..33837d756184 100644 --- a/include/asm-s390/extmem.h +++ b/arch/s390/include/asm/extmem.h | |||
diff --git a/include/asm-s390/fb.h b/arch/s390/include/asm/fb.h index c7df38030992..c7df38030992 100644 --- a/include/asm-s390/fb.h +++ b/arch/s390/include/asm/fb.h | |||
diff --git a/include/asm-s390/fcntl.h b/arch/s390/include/asm/fcntl.h index 46ab12db5739..46ab12db5739 100644 --- a/include/asm-s390/fcntl.h +++ b/arch/s390/include/asm/fcntl.h | |||
diff --git a/include/asm-s390/fcx.h b/arch/s390/include/asm/fcx.h index 8be1f3a58042..8be1f3a58042 100644 --- a/include/asm-s390/fcx.h +++ b/arch/s390/include/asm/fcx.h | |||
diff --git a/include/asm-s390/futex.h b/arch/s390/include/asm/futex.h index 5c5d02de49e9..5c5d02de49e9 100644 --- a/include/asm-s390/futex.h +++ b/arch/s390/include/asm/futex.h | |||
diff --git a/include/asm-s390/hardirq.h b/arch/s390/include/asm/hardirq.h index 89ec7056da28..89ec7056da28 100644 --- a/include/asm-s390/hardirq.h +++ b/arch/s390/include/asm/hardirq.h | |||
diff --git a/include/asm-s390/hugetlb.h b/arch/s390/include/asm/hugetlb.h index 670a1d1745d2..670a1d1745d2 100644 --- a/include/asm-s390/hugetlb.h +++ b/arch/s390/include/asm/hugetlb.h | |||
diff --git a/include/asm-s390/idals.h b/arch/s390/include/asm/idals.h index e82c10efe65a..e82c10efe65a 100644 --- a/include/asm-s390/idals.h +++ b/arch/s390/include/asm/idals.h | |||
diff --git a/include/asm-s390/io.h b/arch/s390/include/asm/io.h index b7ff6afc3caa..b7ff6afc3caa 100644 --- a/include/asm-s390/io.h +++ b/arch/s390/include/asm/io.h | |||
diff --git a/include/asm-s390/ioctl.h b/arch/s390/include/asm/ioctl.h index b279fe06dfe5..b279fe06dfe5 100644 --- a/include/asm-s390/ioctl.h +++ b/arch/s390/include/asm/ioctl.h | |||
diff --git a/include/asm-s390/ioctls.h b/arch/s390/include/asm/ioctls.h index 40e481b1b461..40e481b1b461 100644 --- a/include/asm-s390/ioctls.h +++ b/arch/s390/include/asm/ioctls.h | |||
diff --git a/include/asm-s390/ipcbuf.h b/arch/s390/include/asm/ipcbuf.h index 37f293d12c8f..37f293d12c8f 100644 --- a/include/asm-s390/ipcbuf.h +++ b/arch/s390/include/asm/ipcbuf.h | |||
diff --git a/include/asm-s390/ipl.h b/arch/s390/include/asm/ipl.h index 1171e6d144a3..1171e6d144a3 100644 --- a/include/asm-s390/ipl.h +++ b/arch/s390/include/asm/ipl.h | |||
diff --git a/include/asm-s390/irq.h b/arch/s390/include/asm/irq.h index 7da991a858f8..7da991a858f8 100644 --- a/include/asm-s390/irq.h +++ b/arch/s390/include/asm/irq.h | |||
diff --git a/include/asm-s390/irq_regs.h b/arch/s390/include/asm/irq_regs.h index 3dd9c0b70270..3dd9c0b70270 100644 --- a/include/asm-s390/irq_regs.h +++ b/arch/s390/include/asm/irq_regs.h | |||
diff --git a/include/asm-s390/irqflags.h b/arch/s390/include/asm/irqflags.h index 3f26131120b7..3f26131120b7 100644 --- a/include/asm-s390/irqflags.h +++ b/arch/s390/include/asm/irqflags.h | |||
diff --git a/include/asm-s390/isc.h b/arch/s390/include/asm/isc.h index 34bb8916db4f..34bb8916db4f 100644 --- a/include/asm-s390/isc.h +++ b/arch/s390/include/asm/isc.h | |||
diff --git a/include/asm-s390/itcw.h b/arch/s390/include/asm/itcw.h index a9bc5c36b32a..a9bc5c36b32a 100644 --- a/include/asm-s390/itcw.h +++ b/arch/s390/include/asm/itcw.h | |||
diff --git a/include/asm-s390/kdebug.h b/arch/s390/include/asm/kdebug.h index 40db27cd6e60..40db27cd6e60 100644 --- a/include/asm-s390/kdebug.h +++ b/arch/s390/include/asm/kdebug.h | |||
diff --git a/include/asm-s390/kexec.h b/arch/s390/include/asm/kexec.h index f219c6411e0b..f219c6411e0b 100644 --- a/include/asm-s390/kexec.h +++ b/arch/s390/include/asm/kexec.h | |||
diff --git a/include/asm-s390/kmap_types.h b/arch/s390/include/asm/kmap_types.h index fd1574648223..fd1574648223 100644 --- a/include/asm-s390/kmap_types.h +++ b/arch/s390/include/asm/kmap_types.h | |||
diff --git a/include/asm-s390/kprobes.h b/arch/s390/include/asm/kprobes.h index 330f68caffe4..330f68caffe4 100644 --- a/include/asm-s390/kprobes.h +++ b/arch/s390/include/asm/kprobes.h | |||
diff --git a/include/asm-s390/kvm.h b/arch/s390/include/asm/kvm.h index d74002f95794..d74002f95794 100644 --- a/include/asm-s390/kvm.h +++ b/arch/s390/include/asm/kvm.h | |||
diff --git a/include/asm-s390/kvm_host.h b/arch/s390/include/asm/kvm_host.h index 3c55e4107dcc..3c55e4107dcc 100644 --- a/include/asm-s390/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h | |||
diff --git a/include/asm-s390/kvm_para.h b/arch/s390/include/asm/kvm_para.h index 2c503796b619..2c503796b619 100644 --- a/include/asm-s390/kvm_para.h +++ b/arch/s390/include/asm/kvm_para.h | |||
diff --git a/include/asm-s390/kvm_virtio.h b/arch/s390/include/asm/kvm_virtio.h index 146100224def..146100224def 100644 --- a/include/asm-s390/kvm_virtio.h +++ b/arch/s390/include/asm/kvm_virtio.h | |||
diff --git a/include/asm-s390/linkage.h b/arch/s390/include/asm/linkage.h index 291c2d01c44f..291c2d01c44f 100644 --- a/include/asm-s390/linkage.h +++ b/arch/s390/include/asm/linkage.h | |||
diff --git a/include/asm-s390/local.h b/arch/s390/include/asm/local.h index c11c530f74d0..c11c530f74d0 100644 --- a/include/asm-s390/local.h +++ b/arch/s390/include/asm/local.h | |||
diff --git a/include/asm-s390/lowcore.h b/arch/s390/include/asm/lowcore.h index 0bc51d52a899..0bc51d52a899 100644 --- a/include/asm-s390/lowcore.h +++ b/arch/s390/include/asm/lowcore.h | |||
diff --git a/include/asm-s390/mathemu.h b/arch/s390/include/asm/mathemu.h index e8dd1ba8edb0..e8dd1ba8edb0 100644 --- a/include/asm-s390/mathemu.h +++ b/arch/s390/include/asm/mathemu.h | |||
diff --git a/include/asm-s390/mman.h b/arch/s390/include/asm/mman.h index 7839767d837e..7839767d837e 100644 --- a/include/asm-s390/mman.h +++ b/arch/s390/include/asm/mman.h | |||
diff --git a/include/asm-s390/mmu.h b/arch/s390/include/asm/mmu.h index 5dd5e7b3476f..5dd5e7b3476f 100644 --- a/include/asm-s390/mmu.h +++ b/arch/s390/include/asm/mmu.h | |||
diff --git a/include/asm-s390/mmu_context.h b/arch/s390/include/asm/mmu_context.h index 4c2fbf48c9c4..4c2fbf48c9c4 100644 --- a/include/asm-s390/mmu_context.h +++ b/arch/s390/include/asm/mmu_context.h | |||
diff --git a/include/asm-s390/module.h b/arch/s390/include/asm/module.h index 1cc1c5af705a..1cc1c5af705a 100644 --- a/include/asm-s390/module.h +++ b/arch/s390/include/asm/module.h | |||
diff --git a/include/asm-s390/monwriter.h b/arch/s390/include/asm/monwriter.h index f0cbf96c52e6..f0cbf96c52e6 100644 --- a/include/asm-s390/monwriter.h +++ b/arch/s390/include/asm/monwriter.h | |||
diff --git a/include/asm-s390/msgbuf.h b/arch/s390/include/asm/msgbuf.h index 1bbdee927924..1bbdee927924 100644 --- a/include/asm-s390/msgbuf.h +++ b/arch/s390/include/asm/msgbuf.h | |||
diff --git a/include/asm-s390/mutex.h b/arch/s390/include/asm/mutex.h index 458c1f7fbc18..458c1f7fbc18 100644 --- a/include/asm-s390/mutex.h +++ b/arch/s390/include/asm/mutex.h | |||
diff --git a/include/asm-s390/page.h b/arch/s390/include/asm/page.h index 991ba939408c..991ba939408c 100644 --- a/include/asm-s390/page.h +++ b/arch/s390/include/asm/page.h | |||
diff --git a/include/asm-s390/param.h b/arch/s390/include/asm/param.h index 34aaa4603347..34aaa4603347 100644 --- a/include/asm-s390/param.h +++ b/arch/s390/include/asm/param.h | |||
diff --git a/include/asm-s390/pci.h b/arch/s390/include/asm/pci.h index 42a145c9ddd6..42a145c9ddd6 100644 --- a/include/asm-s390/pci.h +++ b/arch/s390/include/asm/pci.h | |||
diff --git a/include/asm-s390/percpu.h b/arch/s390/include/asm/percpu.h index 408d60b4f75b..408d60b4f75b 100644 --- a/include/asm-s390/percpu.h +++ b/arch/s390/include/asm/percpu.h | |||
diff --git a/include/asm-s390/pgalloc.h b/arch/s390/include/asm/pgalloc.h index f5b2bf3d7c1d..f5b2bf3d7c1d 100644 --- a/include/asm-s390/pgalloc.h +++ b/arch/s390/include/asm/pgalloc.h | |||
diff --git a/include/asm-s390/pgtable.h b/arch/s390/include/asm/pgtable.h index 0bdb704ae051..0bdb704ae051 100644 --- a/include/asm-s390/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
diff --git a/include/asm-s390/poll.h b/arch/s390/include/asm/poll.h index c98509d3149e..c98509d3149e 100644 --- a/include/asm-s390/poll.h +++ b/arch/s390/include/asm/poll.h | |||
diff --git a/include/asm-s390/posix_types.h b/arch/s390/include/asm/posix_types.h index 397d93fba3a7..397d93fba3a7 100644 --- a/include/asm-s390/posix_types.h +++ b/arch/s390/include/asm/posix_types.h | |||
diff --git a/include/asm-s390/processor.h b/arch/s390/include/asm/processor.h index 4af80af2a88f..4af80af2a88f 100644 --- a/include/asm-s390/processor.h +++ b/arch/s390/include/asm/processor.h | |||
diff --git a/include/asm-s390/ptrace.h b/arch/s390/include/asm/ptrace.h index af2c9ac28a07..af2c9ac28a07 100644 --- a/include/asm-s390/ptrace.h +++ b/arch/s390/include/asm/ptrace.h | |||
diff --git a/include/asm-s390/qdio.h b/arch/s390/include/asm/qdio.h index 6813772171f2..6813772171f2 100644 --- a/include/asm-s390/qdio.h +++ b/arch/s390/include/asm/qdio.h | |||
diff --git a/include/asm-s390/qeth.h b/arch/s390/include/asm/qeth.h index 930d378ef75a..930d378ef75a 100644 --- a/include/asm-s390/qeth.h +++ b/arch/s390/include/asm/qeth.h | |||
diff --git a/include/asm-s390/reset.h b/arch/s390/include/asm/reset.h index f584f4a52581..f584f4a52581 100644 --- a/include/asm-s390/reset.h +++ b/arch/s390/include/asm/reset.h | |||
diff --git a/include/asm-s390/resource.h b/arch/s390/include/asm/resource.h index 366c01de04f2..366c01de04f2 100644 --- a/include/asm-s390/resource.h +++ b/arch/s390/include/asm/resource.h | |||
diff --git a/include/asm-s390/rwsem.h b/arch/s390/include/asm/rwsem.h index 9d2a17971805..9d2a17971805 100644 --- a/include/asm-s390/rwsem.h +++ b/arch/s390/include/asm/rwsem.h | |||
diff --git a/include/asm-s390/s390_ext.h b/arch/s390/include/asm/s390_ext.h index 2afc060266a2..2afc060266a2 100644 --- a/include/asm-s390/s390_ext.h +++ b/arch/s390/include/asm/s390_ext.h | |||
diff --git a/include/asm-s390/s390_rdev.h b/arch/s390/include/asm/s390_rdev.h index 6fa20442a48c..6fa20442a48c 100644 --- a/include/asm-s390/s390_rdev.h +++ b/arch/s390/include/asm/s390_rdev.h | |||
diff --git a/include/asm-s390/scatterlist.h b/arch/s390/include/asm/scatterlist.h index 29ec8e28c8df..29ec8e28c8df 100644 --- a/include/asm-s390/scatterlist.h +++ b/arch/s390/include/asm/scatterlist.h | |||
diff --git a/include/asm-s390/schid.h b/arch/s390/include/asm/schid.h index 825503cf3dc2..825503cf3dc2 100644 --- a/include/asm-s390/schid.h +++ b/arch/s390/include/asm/schid.h | |||
diff --git a/include/asm-s390/sclp.h b/arch/s390/include/asm/sclp.h index fed7bee650a0..fed7bee650a0 100644 --- a/include/asm-s390/sclp.h +++ b/arch/s390/include/asm/sclp.h | |||
diff --git a/include/asm-s390/sections.h b/arch/s390/include/asm/sections.h index fbd9116eb17b..fbd9116eb17b 100644 --- a/include/asm-s390/sections.h +++ b/arch/s390/include/asm/sections.h | |||
diff --git a/include/asm-s390/segment.h b/arch/s390/include/asm/segment.h index 8bfce3475b1c..8bfce3475b1c 100644 --- a/include/asm-s390/segment.h +++ b/arch/s390/include/asm/segment.h | |||
diff --git a/include/asm-s390/sembuf.h b/arch/s390/include/asm/sembuf.h index 32626b0cac4b..32626b0cac4b 100644 --- a/include/asm-s390/sembuf.h +++ b/arch/s390/include/asm/sembuf.h | |||
diff --git a/include/asm-s390/setup.h b/arch/s390/include/asm/setup.h index 2bd9faeb3919..2bd9faeb3919 100644 --- a/include/asm-s390/setup.h +++ b/arch/s390/include/asm/setup.h | |||
diff --git a/include/asm-s390/sfp-machine.h b/arch/s390/include/asm/sfp-machine.h index 4e16aede4b06..4e16aede4b06 100644 --- a/include/asm-s390/sfp-machine.h +++ b/arch/s390/include/asm/sfp-machine.h | |||
diff --git a/include/asm-s390/sfp-util.h b/arch/s390/include/asm/sfp-util.h index 0addc6466d95..0addc6466d95 100644 --- a/include/asm-s390/sfp-util.h +++ b/arch/s390/include/asm/sfp-util.h | |||
diff --git a/include/asm-s390/shmbuf.h b/arch/s390/include/asm/shmbuf.h index eed2e280ce37..eed2e280ce37 100644 --- a/include/asm-s390/shmbuf.h +++ b/arch/s390/include/asm/shmbuf.h | |||
diff --git a/include/asm-s390/shmparam.h b/arch/s390/include/asm/shmparam.h index c2e0c0508e73..c2e0c0508e73 100644 --- a/include/asm-s390/shmparam.h +++ b/arch/s390/include/asm/shmparam.h | |||
diff --git a/include/asm-s390/sigcontext.h b/arch/s390/include/asm/sigcontext.h index aeb6e0b13329..aeb6e0b13329 100644 --- a/include/asm-s390/sigcontext.h +++ b/arch/s390/include/asm/sigcontext.h | |||
diff --git a/include/asm-s390/siginfo.h b/arch/s390/include/asm/siginfo.h index e0ff1ab054be..e0ff1ab054be 100644 --- a/include/asm-s390/siginfo.h +++ b/arch/s390/include/asm/siginfo.h | |||
diff --git a/include/asm-s390/signal.h b/arch/s390/include/asm/signal.h index f6cfddb278cb..f6cfddb278cb 100644 --- a/include/asm-s390/signal.h +++ b/arch/s390/include/asm/signal.h | |||
diff --git a/include/asm-s390/sigp.h b/arch/s390/include/asm/sigp.h index e16d56f8dfe1..e16d56f8dfe1 100644 --- a/include/asm-s390/sigp.h +++ b/arch/s390/include/asm/sigp.h | |||
diff --git a/include/asm-s390/smp.h b/arch/s390/include/asm/smp.h index ae89cf2478fc..ae89cf2478fc 100644 --- a/include/asm-s390/smp.h +++ b/arch/s390/include/asm/smp.h | |||
diff --git a/include/asm-s390/socket.h b/arch/s390/include/asm/socket.h index c786ab623b2d..c786ab623b2d 100644 --- a/include/asm-s390/socket.h +++ b/arch/s390/include/asm/socket.h | |||
diff --git a/include/asm-s390/sockios.h b/arch/s390/include/asm/sockios.h index f4fc16c7da59..f4fc16c7da59 100644 --- a/include/asm-s390/sockios.h +++ b/arch/s390/include/asm/sockios.h | |||
diff --git a/include/asm-s390/sparsemem.h b/arch/s390/include/asm/sparsemem.h index 545d219e6a2d..545d219e6a2d 100644 --- a/include/asm-s390/sparsemem.h +++ b/arch/s390/include/asm/sparsemem.h | |||
diff --git a/include/asm-s390/spinlock.h b/arch/s390/include/asm/spinlock.h index df84ae96915f..df84ae96915f 100644 --- a/include/asm-s390/spinlock.h +++ b/arch/s390/include/asm/spinlock.h | |||
diff --git a/include/asm-s390/spinlock_types.h b/arch/s390/include/asm/spinlock_types.h index 654abc40de04..654abc40de04 100644 --- a/include/asm-s390/spinlock_types.h +++ b/arch/s390/include/asm/spinlock_types.h | |||
diff --git a/include/asm-s390/stat.h b/arch/s390/include/asm/stat.h index d92959eebb65..d92959eebb65 100644 --- a/include/asm-s390/stat.h +++ b/arch/s390/include/asm/stat.h | |||
diff --git a/include/asm-s390/statfs.h b/arch/s390/include/asm/statfs.h index 099a45579190..099a45579190 100644 --- a/include/asm-s390/statfs.h +++ b/arch/s390/include/asm/statfs.h | |||
diff --git a/include/asm-s390/string.h b/arch/s390/include/asm/string.h index d074673a6d9b..d074673a6d9b 100644 --- a/include/asm-s390/string.h +++ b/arch/s390/include/asm/string.h | |||
diff --git a/include/asm-s390/suspend.h b/arch/s390/include/asm/suspend.h index 1f34580e67a7..1f34580e67a7 100644 --- a/include/asm-s390/suspend.h +++ b/arch/s390/include/asm/suspend.h | |||
diff --git a/include/asm-s390/sysinfo.h b/arch/s390/include/asm/sysinfo.h index 79d01343f8b0..79d01343f8b0 100644 --- a/include/asm-s390/sysinfo.h +++ b/arch/s390/include/asm/sysinfo.h | |||
diff --git a/include/asm-s390/system.h b/arch/s390/include/asm/system.h index 819e7d99ca0c..819e7d99ca0c 100644 --- a/include/asm-s390/system.h +++ b/arch/s390/include/asm/system.h | |||
diff --git a/include/asm-s390/tape390.h b/arch/s390/include/asm/tape390.h index 884fba48f1ff..884fba48f1ff 100644 --- a/include/asm-s390/tape390.h +++ b/arch/s390/include/asm/tape390.h | |||
diff --git a/include/asm-s390/termbits.h b/arch/s390/include/asm/termbits.h index 58731853d529..58731853d529 100644 --- a/include/asm-s390/termbits.h +++ b/arch/s390/include/asm/termbits.h | |||
diff --git a/include/asm-s390/termios.h b/arch/s390/include/asm/termios.h index 67f66278f533..67f66278f533 100644 --- a/include/asm-s390/termios.h +++ b/arch/s390/include/asm/termios.h | |||
diff --git a/include/asm-s390/thread_info.h b/arch/s390/include/asm/thread_info.h index 91a8f93ad355..91a8f93ad355 100644 --- a/include/asm-s390/thread_info.h +++ b/arch/s390/include/asm/thread_info.h | |||
diff --git a/include/asm-s390/timer.h b/arch/s390/include/asm/timer.h index d98d79e35cd6..d98d79e35cd6 100644 --- a/include/asm-s390/timer.h +++ b/arch/s390/include/asm/timer.h | |||
diff --git a/include/asm-s390/timex.h b/arch/s390/include/asm/timex.h index d744c3d62de5..d744c3d62de5 100644 --- a/include/asm-s390/timex.h +++ b/arch/s390/include/asm/timex.h | |||
diff --git a/include/asm-s390/tlb.h b/arch/s390/include/asm/tlb.h index 3d8a96d39d9d..3d8a96d39d9d 100644 --- a/include/asm-s390/tlb.h +++ b/arch/s390/include/asm/tlb.h | |||
diff --git a/include/asm-s390/tlbflush.h b/arch/s390/include/asm/tlbflush.h index d60394b9745e..d60394b9745e 100644 --- a/include/asm-s390/tlbflush.h +++ b/arch/s390/include/asm/tlbflush.h | |||
diff --git a/include/asm-s390/todclk.h b/arch/s390/include/asm/todclk.h index c7f62055488a..c7f62055488a 100644 --- a/include/asm-s390/todclk.h +++ b/arch/s390/include/asm/todclk.h | |||
diff --git a/include/asm-s390/topology.h b/arch/s390/include/asm/topology.h index d96c91643458..d96c91643458 100644 --- a/include/asm-s390/topology.h +++ b/arch/s390/include/asm/topology.h | |||
diff --git a/include/asm-s390/types.h b/arch/s390/include/asm/types.h index 41c547656130..41c547656130 100644 --- a/include/asm-s390/types.h +++ b/arch/s390/include/asm/types.h | |||
diff --git a/include/asm-s390/uaccess.h b/arch/s390/include/asm/uaccess.h index 0235970278f0..0235970278f0 100644 --- a/include/asm-s390/uaccess.h +++ b/arch/s390/include/asm/uaccess.h | |||
diff --git a/include/asm-s390/ucontext.h b/arch/s390/include/asm/ucontext.h index d69bec0b03f5..d69bec0b03f5 100644 --- a/include/asm-s390/ucontext.h +++ b/arch/s390/include/asm/ucontext.h | |||
diff --git a/include/asm-s390/unaligned.h b/arch/s390/include/asm/unaligned.h index da9627afe5d8..da9627afe5d8 100644 --- a/include/asm-s390/unaligned.h +++ b/arch/s390/include/asm/unaligned.h | |||
diff --git a/include/asm-s390/unistd.h b/arch/s390/include/asm/unistd.h index c8ad350d1444..c8ad350d1444 100644 --- a/include/asm-s390/unistd.h +++ b/arch/s390/include/asm/unistd.h | |||
diff --git a/include/asm-s390/user.h b/arch/s390/include/asm/user.h index 1b050e35fdc6..1b050e35fdc6 100644 --- a/include/asm-s390/user.h +++ b/arch/s390/include/asm/user.h | |||
diff --git a/include/asm-s390/vtoc.h b/arch/s390/include/asm/vtoc.h index 3a5267d90d29..3a5267d90d29 100644 --- a/include/asm-s390/vtoc.h +++ b/arch/s390/include/asm/vtoc.h | |||
diff --git a/include/asm-s390/xor.h b/arch/s390/include/asm/xor.h index c82eb12a5b18..c82eb12a5b18 100644 --- a/include/asm-s390/xor.h +++ b/arch/s390/include/asm/xor.h | |||
diff --git a/include/asm-s390/zcrypt.h b/arch/s390/include/asm/zcrypt.h index 00d3bbd44117..00d3bbd44117 100644 --- a/include/asm-s390/zcrypt.h +++ b/arch/s390/include/asm/zcrypt.h | |||
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index cb992c3d6b71..5131d50f851a 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -48,6 +48,9 @@ config GENERIC_HWEIGHT | |||
48 | config GENERIC_HARDIRQS | 48 | config GENERIC_HARDIRQS |
49 | def_bool y | 49 | def_bool y |
50 | 50 | ||
51 | config GENERIC_HARDIRQS_NO__DO_IRQ | ||
52 | def_bool y | ||
53 | |||
51 | config GENERIC_IRQ_PROBE | 54 | config GENERIC_IRQ_PROBE |
52 | def_bool y | 55 | def_bool y |
53 | 56 | ||
@@ -63,6 +66,10 @@ config GENERIC_TIME | |||
63 | config GENERIC_CLOCKEVENTS | 66 | config GENERIC_CLOCKEVENTS |
64 | def_bool n | 67 | def_bool n |
65 | 68 | ||
69 | config GENERIC_LOCKBREAK | ||
70 | def_bool y | ||
71 | depends on SMP && PREEMPT | ||
72 | |||
66 | config SYS_SUPPORTS_PM | 73 | config SYS_SUPPORTS_PM |
67 | bool | 74 | bool |
68 | 75 | ||
@@ -94,9 +101,6 @@ config ARCH_HAS_ILOG2_U64 | |||
94 | config ARCH_NO_VIRT_TO_BUS | 101 | config ARCH_NO_VIRT_TO_BUS |
95 | def_bool y | 102 | def_bool y |
96 | 103 | ||
97 | config ARCH_SUPPORTS_AOUT | ||
98 | def_bool y | ||
99 | |||
100 | config IO_TRAPPED | 104 | config IO_TRAPPED |
101 | bool | 105 | bool |
102 | 106 | ||
@@ -483,6 +487,23 @@ config CRASH_DUMP | |||
483 | 487 | ||
484 | For more details see Documentation/kdump/kdump.txt | 488 | For more details see Documentation/kdump/kdump.txt |
485 | 489 | ||
490 | config SECCOMP | ||
491 | bool "Enable seccomp to safely compute untrusted bytecode" | ||
492 | depends on PROC_FS | ||
493 | default y | ||
494 | help | ||
495 | This kernel feature is useful for number crunching applications | ||
496 | that may need to compute untrusted bytecode during their | ||
497 | execution. By using pipes or other transports made available to | ||
498 | the process as file descriptors supporting the read/write | ||
499 | syscalls, it's possible to isolate those applications in | ||
500 | their own address space using seccomp. Once seccomp is | ||
501 | enabled via prctl, it cannot be disabled and the task is only | ||
502 | allowed to execute a few safe syscalls defined by each seccomp | ||
503 | mode. | ||
504 | |||
505 | If unsure, say N. | ||
506 | |||
486 | config SMP | 507 | config SMP |
487 | bool "Symmetric multi-processing support" | 508 | bool "Symmetric multi-processing support" |
488 | depends on SYS_SUPPORTS_SMP | 509 | depends on SYS_SUPPORTS_SMP |
diff --git a/arch/sh/Kconfig.debug b/arch/sh/Kconfig.debug index 36f4b1f7066d..4d2d102e00d5 100644 --- a/arch/sh/Kconfig.debug +++ b/arch/sh/Kconfig.debug | |||
@@ -182,7 +182,7 @@ if SUPERH64 | |||
182 | 182 | ||
183 | config SH64_PROC_ASIDS | 183 | config SH64_PROC_ASIDS |
184 | bool "Debug: report ASIDs through /proc/asids" | 184 | bool "Debug: report ASIDs through /proc/asids" |
185 | depends on PROC_FS | 185 | depends on PROC_FS && MMU |
186 | 186 | ||
187 | config SH64_SR_WATCH | 187 | config SH64_SR_WATCH |
188 | bool "Debug: set SR.WATCH to enable hardware watchpoints and trace" | 188 | bool "Debug: set SR.WATCH to enable hardware watchpoints and trace" |
diff --git a/arch/sh/Makefile b/arch/sh/Makefile index 25659ce74baa..01d85c74481d 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile | |||
@@ -95,8 +95,6 @@ head-y := arch/sh/kernel/init_task.o | |||
95 | head-$(CONFIG_SUPERH32) += arch/sh/kernel/head_32.o | 95 | head-$(CONFIG_SUPERH32) += arch/sh/kernel/head_32.o |
96 | head-$(CONFIG_SUPERH64) += arch/sh/kernel/head_64.o | 96 | head-$(CONFIG_SUPERH64) += arch/sh/kernel/head_64.o |
97 | 97 | ||
98 | LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) | ||
99 | |||
100 | core-y += arch/sh/kernel/ arch/sh/mm/ arch/sh/boards/ | 98 | core-y += arch/sh/kernel/ arch/sh/mm/ arch/sh/boards/ |
101 | core-$(CONFIG_SH_FPU_EMU) += arch/sh/math-emu/ | 99 | core-$(CONFIG_SH_FPU_EMU) += arch/sh/math-emu/ |
102 | 100 | ||
@@ -145,10 +143,6 @@ cpuincdir-$(CONFIG_CPU_SH4) += cpu-sh4 | |||
145 | cpuincdir-$(CONFIG_CPU_SH5) += cpu-sh5 | 143 | cpuincdir-$(CONFIG_CPU_SH5) += cpu-sh5 |
146 | cpuincdir-y += cpu-common # Must be last | 144 | cpuincdir-y += cpu-common # Must be last |
147 | 145 | ||
148 | libs-$(CONFIG_SUPERH32) := arch/sh/lib/ $(libs-y) | ||
149 | libs-$(CONFIG_SUPERH64) := arch/sh/lib64/ $(libs-y) | ||
150 | libs-y += $(LIBGCC) | ||
151 | |||
152 | drivers-y += arch/sh/drivers/ | 146 | drivers-y += arch/sh/drivers/ |
153 | drivers-$(CONFIG_OPROFILE) += arch/sh/oprofile/ | 147 | drivers-$(CONFIG_OPROFILE) += arch/sh/oprofile/ |
154 | 148 | ||
@@ -161,10 +155,16 @@ KBUILD_CFLAGS += -pipe $(cflags-y) | |||
161 | KBUILD_CPPFLAGS += $(cflags-y) | 155 | KBUILD_CPPFLAGS += $(cflags-y) |
162 | KBUILD_AFLAGS += $(cflags-y) | 156 | KBUILD_AFLAGS += $(cflags-y) |
163 | 157 | ||
158 | LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) | ||
159 | |||
160 | libs-$(CONFIG_SUPERH32) := arch/sh/lib/ $(libs-y) | ||
161 | libs-$(CONFIG_SUPERH64) := arch/sh/lib64/ $(libs-y) | ||
162 | libs-y += $(LIBGCC) | ||
163 | |||
164 | PHONY += maketools FORCE | 164 | PHONY += maketools FORCE |
165 | 165 | ||
166 | maketools: include/linux/version.h FORCE | 166 | maketools: include/linux/version.h FORCE |
167 | $(Q)$(MAKE) $(build)=arch/sh/tools arch/sh/include/asm/machtypes.h | 167 | $(Q)$(MAKE) $(build)=arch/sh/tools include/asm-sh/machtypes.h |
168 | 168 | ||
169 | all: $(KBUILD_IMAGE) | 169 | all: $(KBUILD_IMAGE) |
170 | 170 | ||
@@ -215,4 +215,4 @@ arch/sh/lib64/syscalltab.h: arch/sh/kernel/syscalls_64.S | |||
215 | $(call filechk,gen-syscalltab) | 215 | $(call filechk,gen-syscalltab) |
216 | 216 | ||
217 | CLEAN_FILES += arch/sh/lib64/syscalltab.h \ | 217 | CLEAN_FILES += arch/sh/lib64/syscalltab.h \ |
218 | arch/sh/include/asm/machtypes.h | 218 | include/asm-sh/machtypes.h |
diff --git a/arch/sh/boards/Makefile b/arch/sh/boards/Makefile index ff9b93c5a91b..463022c7df3c 100644 --- a/arch/sh/boards/Makefile +++ b/arch/sh/boards/Makefile | |||
@@ -5,4 +5,4 @@ obj-$(CONFIG_SH_AP325RXA) += board-ap325rxa.o | |||
5 | obj-$(CONFIG_SH_MAGIC_PANEL_R2) += board-magicpanelr2.o | 5 | obj-$(CONFIG_SH_MAGIC_PANEL_R2) += board-magicpanelr2.o |
6 | obj-$(CONFIG_SH_RSK7203) += board-rsk7203.o | 6 | obj-$(CONFIG_SH_RSK7203) += board-rsk7203.o |
7 | obj-$(CONFIG_SH_SH7785LCR) += board-sh7785lcr.o | 7 | obj-$(CONFIG_SH_SH7785LCR) += board-sh7785lcr.o |
8 | obj-$(CONFIG_SH_SHMIN) += board-shmin..o | 8 | obj-$(CONFIG_SH_SHMIN) += board-shmin.o |
diff --git a/arch/sh/boards/board-ap325rxa.c b/arch/sh/boards/board-ap325rxa.c index 9c71603d29a2..025d4fe55a58 100644 --- a/arch/sh/boards/board-ap325rxa.c +++ b/arch/sh/boards/board-ap325rxa.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/mtd/physmap.h> | 17 | #include <linux/mtd/physmap.h> |
18 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
19 | #include <linux/i2c.h> | 19 | #include <linux/i2c.h> |
20 | #include <linux/delay.h> | ||
21 | #include <linux/smc911x.h> | 20 | #include <linux/smc911x.h> |
22 | #include <media/soc_camera_platform.h> | 21 | #include <media/soc_camera_platform.h> |
23 | #include <media/sh_mobile_ceu.h> | 22 | #include <media/sh_mobile_ceu.h> |
diff --git a/arch/sh/boards/mach-se/7343/irq.c b/arch/sh/boards/mach-se/7343/irq.c index 5d96e2eef82a..051c29d4eae0 100644 --- a/arch/sh/boards/mach-se/7343/irq.c +++ b/arch/sh/boards/mach-se/7343/irq.c | |||
@@ -13,7 +13,6 @@ | |||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/irq.h> | 14 | #include <linux/irq.h> |
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | #include <linux/irq.h> | ||
17 | #include <linux/io.h> | 16 | #include <linux/io.h> |
18 | #include <mach-se/mach/se7343.h> | 17 | #include <mach-se/mach/se7343.h> |
19 | 18 | ||
diff --git a/arch/sh/boards/mach-systemh/irq.c b/arch/sh/boards/mach-systemh/irq.c index 0ba2fe674c47..601c9c8cdbec 100644 --- a/arch/sh/boards/mach-systemh/irq.c +++ b/arch/sh/boards/mach-systemh/irq.c | |||
@@ -11,9 +11,8 @@ | |||
11 | 11 | ||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | #include <linux/interrupt.h> | ||
14 | 15 | ||
15 | #include <linux/hdreg.h> | ||
16 | #include <linux/ide.h> | ||
17 | #include <asm/io.h> | 16 | #include <asm/io.h> |
18 | #include <asm/systemh7751.h> | 17 | #include <asm/systemh7751.h> |
19 | #include <asm/smc37c93x.h> | 18 | #include <asm/smc37c93x.h> |
diff --git a/arch/sh/configs/dreamcast_defconfig b/arch/sh/configs/dreamcast_defconfig index d4075283956d..3dc1cbd8a981 100644 --- a/arch/sh/configs/dreamcast_defconfig +++ b/arch/sh/configs/dreamcast_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.26 | 3 | # Linux kernel version: 2.6.27-rc1 |
4 | # Wed Jul 30 01:34:24 2008 | 4 | # Mon Aug 4 16:49:13 2008 |
5 | # | 5 | # |
6 | CONFIG_SUPERH=y | 6 | CONFIG_SUPERH=y |
7 | CONFIG_SUPERH32=y | 7 | CONFIG_SUPERH32=y |
@@ -11,6 +11,7 @@ CONFIG_GENERIC_BUG=y | |||
11 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 11 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
12 | CONFIG_GENERIC_HWEIGHT=y | 12 | CONFIG_GENERIC_HWEIGHT=y |
13 | CONFIG_GENERIC_HARDIRQS=y | 13 | CONFIG_GENERIC_HARDIRQS=y |
14 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
14 | CONFIG_GENERIC_IRQ_PROBE=y | 15 | CONFIG_GENERIC_IRQ_PROBE=y |
15 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 16 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
16 | CONFIG_GENERIC_TIME=y | 17 | CONFIG_GENERIC_TIME=y |
@@ -21,7 +22,6 @@ CONFIG_LOCKDEP_SUPPORT=y | |||
21 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | 22 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set |
22 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 23 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
23 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | 24 | CONFIG_ARCH_NO_VIRT_TO_BUS=y |
24 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
25 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 25 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
26 | 26 | ||
27 | # | 27 | # |
@@ -87,6 +87,7 @@ CONFIG_HAVE_OPROFILE=y | |||
87 | # CONFIG_USE_GENERIC_SMP_HELPERS is not set | 87 | # CONFIG_USE_GENERIC_SMP_HELPERS is not set |
88 | CONFIG_HAVE_CLK=y | 88 | CONFIG_HAVE_CLK=y |
89 | CONFIG_PROC_PAGE_MONITOR=y | 89 | CONFIG_PROC_PAGE_MONITOR=y |
90 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||
90 | CONFIG_SLABINFO=y | 91 | CONFIG_SLABINFO=y |
91 | CONFIG_RT_MUTEXES=y | 92 | CONFIG_RT_MUTEXES=y |
92 | # CONFIG_TINY_SHMEM is not set | 93 | # CONFIG_TINY_SHMEM is not set |
@@ -284,6 +285,7 @@ CONFIG_HZ=250 | |||
284 | # CONFIG_SCHED_HRTICK is not set | 285 | # CONFIG_SCHED_HRTICK is not set |
285 | # CONFIG_KEXEC is not set | 286 | # CONFIG_KEXEC is not set |
286 | # CONFIG_CRASH_DUMP is not set | 287 | # CONFIG_CRASH_DUMP is not set |
288 | CONFIG_SECCOMP=y | ||
287 | # CONFIG_PREEMPT_NONE is not set | 289 | # CONFIG_PREEMPT_NONE is not set |
288 | # CONFIG_PREEMPT_VOLUNTARY is not set | 290 | # CONFIG_PREEMPT_VOLUNTARY is not set |
289 | CONFIG_PREEMPT=y | 291 | CONFIG_PREEMPT=y |
@@ -317,10 +319,6 @@ CONFIG_PCI_LEGACY=y | |||
317 | # | 319 | # |
318 | CONFIG_BINFMT_ELF=y | 320 | CONFIG_BINFMT_ELF=y |
319 | # CONFIG_BINFMT_MISC is not set | 321 | # CONFIG_BINFMT_MISC is not set |
320 | |||
321 | # | ||
322 | # Networking | ||
323 | # | ||
324 | CONFIG_NET=y | 322 | CONFIG_NET=y |
325 | 323 | ||
326 | # | 324 | # |
@@ -555,7 +553,7 @@ CONFIG_INPUT_KEYBOARD=y | |||
555 | # CONFIG_KEYBOARD_XTKBD is not set | 553 | # CONFIG_KEYBOARD_XTKBD is not set |
556 | # CONFIG_KEYBOARD_NEWTON is not set | 554 | # CONFIG_KEYBOARD_NEWTON is not set |
557 | # CONFIG_KEYBOARD_STOWAWAY is not set | 555 | # CONFIG_KEYBOARD_STOWAWAY is not set |
558 | # CONFIG_KEYBOARD_MAPLE is not set | 556 | CONFIG_KEYBOARD_MAPLE=y |
559 | # CONFIG_KEYBOARD_SH_KEYSC is not set | 557 | # CONFIG_KEYBOARD_SH_KEYSC is not set |
560 | CONFIG_INPUT_MOUSE=y | 558 | CONFIG_INPUT_MOUSE=y |
561 | # CONFIG_MOUSE_PS2 is not set | 559 | # CONFIG_MOUSE_PS2 is not set |
diff --git a/arch/sh/include/asm/a.out.h b/arch/sh/include/asm/a.out.h deleted file mode 100644 index 1f93130e179c..000000000000 --- a/arch/sh/include/asm/a.out.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | #ifndef __ASM_SH_A_OUT_H | ||
2 | #define __ASM_SH_A_OUT_H | ||
3 | |||
4 | struct exec | ||
5 | { | ||
6 | unsigned long a_info; /* Use macros N_MAGIC, etc for access */ | ||
7 | unsigned a_text; /* length of text, in bytes */ | ||
8 | unsigned a_data; /* length of data, in bytes */ | ||
9 | unsigned a_bss; /* length of uninitialized data area for file, in bytes */ | ||
10 | unsigned a_syms; /* length of symbol table data in file, in bytes */ | ||
11 | unsigned a_entry; /* start address */ | ||
12 | unsigned a_trsize; /* length of relocation info for text, in bytes */ | ||
13 | unsigned a_drsize; /* length of relocation info for data, in bytes */ | ||
14 | }; | ||
15 | |||
16 | #define N_TRSIZE(a) ((a).a_trsize) | ||
17 | #define N_DRSIZE(a) ((a).a_drsize) | ||
18 | #define N_SYMSIZE(a) ((a).a_syms) | ||
19 | |||
20 | #endif /* __ASM_SH_A_OUT_H */ | ||
diff --git a/arch/sh/include/asm/ptrace.h b/arch/sh/include/asm/ptrace.h index 643ab5a7cf3b..b86aeabba61a 100644 --- a/arch/sh/include/asm/ptrace.h +++ b/arch/sh/include/asm/ptrace.h | |||
@@ -104,6 +104,15 @@ struct pt_dspregs { | |||
104 | 104 | ||
105 | extern void show_regs(struct pt_regs *); | 105 | extern void show_regs(struct pt_regs *); |
106 | 106 | ||
107 | /* | ||
108 | * These are defined as per linux/ptrace.h. | ||
109 | */ | ||
110 | struct task_struct; | ||
111 | |||
112 | #define arch_has_single_step() (1) | ||
113 | extern void user_enable_single_step(struct task_struct *); | ||
114 | extern void user_disable_single_step(struct task_struct *); | ||
115 | |||
107 | #ifdef CONFIG_SH_DSP | 116 | #ifdef CONFIG_SH_DSP |
108 | #define task_pt_regs(task) \ | 117 | #define task_pt_regs(task) \ |
109 | ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \ | 118 | ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \ |
diff --git a/arch/sh/include/asm/seccomp.h b/arch/sh/include/asm/seccomp.h new file mode 100644 index 000000000000..3280ed3802ef --- /dev/null +++ b/arch/sh/include/asm/seccomp.h | |||
@@ -0,0 +1,10 @@ | |||
1 | #ifndef __ASM_SECCOMP_H | ||
2 | |||
3 | #include <linux/unistd.h> | ||
4 | |||
5 | #define __NR_seccomp_read __NR_read | ||
6 | #define __NR_seccomp_write __NR_write | ||
7 | #define __NR_seccomp_exit __NR_exit | ||
8 | #define __NR_seccomp_sigreturn __NR_rt_sigreturn | ||
9 | |||
10 | #endif /* __ASM_SECCOMP_H */ | ||
diff --git a/arch/sh/include/asm/thread_info.h b/arch/sh/include/asm/thread_info.h index eeb4c747119e..0a894cafb1dd 100644 --- a/arch/sh/include/asm/thread_info.h +++ b/arch/sh/include/asm/thread_info.h | |||
@@ -117,24 +117,45 @@ static inline struct thread_info *current_thread_info(void) | |||
117 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ | 117 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ |
118 | #define TIF_RESTORE_SIGMASK 3 /* restore signal mask in do_signal() */ | 118 | #define TIF_RESTORE_SIGMASK 3 /* restore signal mask in do_signal() */ |
119 | #define TIF_SINGLESTEP 4 /* singlestepping active */ | 119 | #define TIF_SINGLESTEP 4 /* singlestepping active */ |
120 | #define TIF_SYSCALL_AUDIT 5 | 120 | #define TIF_SYSCALL_AUDIT 5 /* syscall auditing active */ |
121 | #define TIF_SECCOMP 6 /* secure computing */ | ||
122 | #define TIF_NOTIFY_RESUME 7 /* callback before returning to user */ | ||
121 | #define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */ | 123 | #define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */ |
122 | #define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */ | 124 | #define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */ |
123 | #define TIF_MEMDIE 18 | 125 | #define TIF_MEMDIE 18 |
124 | #define TIF_FREEZE 19 | 126 | #define TIF_FREEZE 19 /* Freezing for suspend */ |
125 | 127 | ||
126 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | 128 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) |
127 | #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) | 129 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) |
128 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) | 130 | #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) |
129 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) | 131 | #define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) |
130 | #define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) | 132 | #define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) |
131 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) | 133 | #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) |
132 | #define _TIF_USEDFPU (1<<TIF_USEDFPU) | 134 | #define _TIF_SECCOMP (1 << TIF_SECCOMP) |
133 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | 135 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) |
134 | #define _TIF_FREEZE (1<<TIF_FREEZE) | 136 | #define _TIF_USEDFPU (1 << TIF_USEDFPU) |
135 | 137 | #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) | |
136 | #define _TIF_WORK_MASK 0x000000FE /* work to do on interrupt/exception return */ | 138 | #define _TIF_FREEZE (1 << TIF_FREEZE) |
137 | #define _TIF_ALLWORK_MASK 0x000000FF /* work to do on any return to u-space */ | 139 | |
140 | /* | ||
141 | * _TIF_ALLWORK_MASK and _TIF_WORK_MASK need to fit within a byte, or we | ||
142 | * blow the tst immediate size constraints and need to fix up | ||
143 | * arch/sh/kernel/entry-common.S. | ||
144 | */ | ||
145 | |||
146 | /* work to do in syscall trace */ | ||
147 | #define _TIF_WORK_SYSCALL_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \ | ||
148 | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP) | ||
149 | |||
150 | /* work to do on any return to u-space */ | ||
151 | #define _TIF_ALLWORK_MASK (_TIF_SYSCALL_TRACE | _TIF_SIGPENDING | \ | ||
152 | _TIF_NEED_RESCHED | _TIF_SYSCALL_AUDIT | \ | ||
153 | _TIF_SINGLESTEP | _TIF_RESTORE_SIGMASK | \ | ||
154 | _TIF_NOTIFY_RESUME) | ||
155 | |||
156 | /* work to do on interrupt/exception return */ | ||
157 | #define _TIF_WORK_MASK (_TIF_ALLWORK_MASK & ~(_TIF_SYSCALL_TRACE | \ | ||
158 | _TIF_SYSCALL_AUDIT | _TIF_SINGLESTEP)) | ||
138 | 159 | ||
139 | #endif /* __KERNEL__ */ | 160 | #endif /* __KERNEL__ */ |
140 | 161 | ||
diff --git a/arch/sh/include/asm/tlb_64.h b/arch/sh/include/asm/tlb_64.h index 0a96f3af69e3..ef0ae2a28f23 100644 --- a/arch/sh/include/asm/tlb_64.h +++ b/arch/sh/include/asm/tlb_64.h | |||
@@ -21,11 +21,9 @@ | |||
21 | #ifndef __ASSEMBLY__ | 21 | #ifndef __ASSEMBLY__ |
22 | 22 | ||
23 | /** | 23 | /** |
24 | * for_each_dtlb_entry | 24 | * for_each_dtlb_entry - Iterate over free (non-wired) DTLB entries |
25 | * | 25 | * |
26 | * @tlb: TLB entry | 26 | * @tlb: TLB entry |
27 | * | ||
28 | * Iterate over free (non-wired) DTLB entries | ||
29 | */ | 27 | */ |
30 | #define for_each_dtlb_entry(tlb) \ | 28 | #define for_each_dtlb_entry(tlb) \ |
31 | for (tlb = cpu_data->dtlb.first; \ | 29 | for (tlb = cpu_data->dtlb.first; \ |
@@ -33,11 +31,9 @@ | |||
33 | tlb += cpu_data->dtlb.step) | 31 | tlb += cpu_data->dtlb.step) |
34 | 32 | ||
35 | /** | 33 | /** |
36 | * for_each_itlb_entry | 34 | * for_each_itlb_entry - Iterate over free (non-wired) ITLB entries |
37 | * | 35 | * |
38 | * @tlb: TLB entry | 36 | * @tlb: TLB entry |
39 | * | ||
40 | * Iterate over free (non-wired) ITLB entries | ||
41 | */ | 37 | */ |
42 | #define for_each_itlb_entry(tlb) \ | 38 | #define for_each_itlb_entry(tlb) \ |
43 | for (tlb = cpu_data->itlb.first; \ | 39 | for (tlb = cpu_data->itlb.first; \ |
@@ -45,11 +41,9 @@ | |||
45 | tlb += cpu_data->itlb.step) | 41 | tlb += cpu_data->itlb.step) |
46 | 42 | ||
47 | /** | 43 | /** |
48 | * __flush_tlb_slot | 44 | * __flush_tlb_slot - Flushes TLB slot @slot. |
49 | * | 45 | * |
50 | * @slot: Address of TLB slot. | 46 | * @slot: Address of TLB slot. |
51 | * | ||
52 | * Flushes TLB slot @slot. | ||
53 | */ | 47 | */ |
54 | static inline void __flush_tlb_slot(unsigned long long slot) | 48 | static inline void __flush_tlb_slot(unsigned long long slot) |
55 | { | 49 | { |
diff --git a/arch/sh/include/cpu-sh2/cpu/cache.h b/arch/sh/include/cpu-sh2/cpu/cache.h index 4e0b16500686..673515bc4135 100644 --- a/arch/sh/include/cpu-sh2/cpu/cache.h +++ b/arch/sh/include/cpu-sh2/cpu/cache.h | |||
@@ -21,11 +21,11 @@ | |||
21 | #define CCR 0xffffffec | 21 | #define CCR 0xffffffec |
22 | 22 | ||
23 | #define CCR_CACHE_CE 0x01 /* Cache enable */ | 23 | #define CCR_CACHE_CE 0x01 /* Cache enable */ |
24 | #define CCR_CACHE_WT 0x06 /* CCR[bit1=1,bit2=1] */ | 24 | #define CCR_CACHE_WT 0x02 /* CCR[bit1=1,bit2=1] */ |
25 | /* 0x00000000-0x7fffffff: Write-through */ | 25 | /* 0x00000000-0x7fffffff: Write-through */ |
26 | /* 0x80000000-0x9fffffff: Write-back */ | 26 | /* 0x80000000-0x9fffffff: Write-back */ |
27 | /* 0xc0000000-0xdfffffff: Write-through */ | 27 | /* 0xc0000000-0xdfffffff: Write-through */ |
28 | #define CCR_CACHE_CB 0x00 /* CCR[bit1=0,bit2=0] */ | 28 | #define CCR_CACHE_CB 0x04 /* CCR[bit1=0,bit2=0] */ |
29 | /* 0x00000000-0x7fffffff: Write-back */ | 29 | /* 0x00000000-0x7fffffff: Write-back */ |
30 | /* 0x80000000-0x9fffffff: Write-through */ | 30 | /* 0x80000000-0x9fffffff: Write-through */ |
31 | /* 0xc0000000-0xdfffffff: Write-back */ | 31 | /* 0xc0000000-0xdfffffff: Write-back */ |
@@ -36,6 +36,8 @@ | |||
36 | 36 | ||
37 | #define CCR_CACHE_ENABLE CCR_CACHE_CE | 37 | #define CCR_CACHE_ENABLE CCR_CACHE_CE |
38 | #define CCR_CACHE_INVALIDATE CCR_CACHE_CF | 38 | #define CCR_CACHE_INVALIDATE CCR_CACHE_CF |
39 | #define CACHE_PHYSADDR_MASK 0x1ffffc00 | ||
40 | |||
39 | #endif | 41 | #endif |
40 | 42 | ||
41 | #endif /* __ASM_CPU_SH2_CACHE_H */ | 43 | #endif /* __ASM_CPU_SH2_CACHE_H */ |
diff --git a/arch/sh/include/cpu-sh2a/cpu/addrspace.h b/arch/sh/include/cpu-sh2a/cpu/addrspace.h new file mode 100644 index 000000000000..31eb4b58aa6d --- /dev/null +++ b/arch/sh/include/cpu-sh2a/cpu/addrspace.h | |||
@@ -0,0 +1,10 @@ | |||
1 | #ifndef __ASM_SH_CPU_SH2A_ADDRSPACE_H | ||
2 | #define __ASM_SH_CPU_SH2A_ADDRSPACE_H | ||
3 | |||
4 | #define P0SEG 0x00000000 | ||
5 | #define P1SEG 0x00000000 | ||
6 | #define P2SEG 0x20000000 | ||
7 | #define P3SEG 0x40000000 | ||
8 | #define P4SEG 0x60000000 | ||
9 | |||
10 | #endif /* __ASM_SH_CPU_SH2A_ADDRSPACE_H */ | ||
diff --git a/arch/sh/include/cpu-sh2a/cpu/cache.h b/arch/sh/include/cpu-sh2a/cpu/cache.h index afe228b3f493..defb0baa5a06 100644 --- a/arch/sh/include/cpu-sh2a/cpu/cache.h +++ b/arch/sh/include/cpu-sh2a/cpu/cache.h | |||
@@ -36,5 +36,8 @@ | |||
36 | 36 | ||
37 | #define CCR_CACHE_ENABLE (CCR_CACHE_OCE | CCR_CACHE_ICE) | 37 | #define CCR_CACHE_ENABLE (CCR_CACHE_OCE | CCR_CACHE_ICE) |
38 | #define CCR_CACHE_INVALIDATE (CCR_CACHE_OCI | CCR_CACHE_ICI) | 38 | #define CCR_CACHE_INVALIDATE (CCR_CACHE_OCI | CCR_CACHE_ICI) |
39 | #define CCR_ICACHE_INVALIDATE CCR_CACHE_ICI | ||
40 | #define CCR_OCACHE_INVALIDATE CCR_CACHE_OCI | ||
41 | #define CACHE_PHYSADDR_MASK 0x1ffffc00 | ||
39 | 42 | ||
40 | #endif /* __ASM_CPU_SH2A_CACHE_H */ | 43 | #endif /* __ASM_CPU_SH2A_CACHE_H */ |
diff --git a/arch/sh/include/cpu-sh2a/cpu/cacheflush.h b/arch/sh/include/cpu-sh2a/cpu/cacheflush.h new file mode 100644 index 000000000000..3d3b9205d2ac --- /dev/null +++ b/arch/sh/include/cpu-sh2a/cpu/cacheflush.h | |||
@@ -0,0 +1,34 @@ | |||
1 | #ifndef __ASM_CPU_SH2A_CACHEFLUSH_H | ||
2 | #define __ASM_CPU_SH2A_CACHEFLUSH_H | ||
3 | |||
4 | /* | ||
5 | * Cache flushing: | ||
6 | * | ||
7 | * - flush_cache_all() flushes entire cache | ||
8 | * - flush_cache_mm(mm) flushes the specified mm context's cache lines | ||
9 | * - flush_cache_dup mm(mm) handles cache flushing when forking | ||
10 | * - flush_cache_page(mm, vmaddr, pfn) flushes a single page | ||
11 | * - flush_cache_range(vma, start, end) flushes a range of pages | ||
12 | * | ||
13 | * - flush_dcache_page(pg) flushes(wback&invalidates) a page for dcache | ||
14 | * - flush_icache_range(start, end) flushes(invalidates) a range for icache | ||
15 | * - flush_icache_page(vma, pg) flushes(invalidates) a page for icache | ||
16 | * | ||
17 | * Caches are indexed (effectively) by physical address on SH-2, so | ||
18 | * we don't need them. | ||
19 | */ | ||
20 | #define flush_cache_all() do { } while (0) | ||
21 | #define flush_cache_mm(mm) do { } while (0) | ||
22 | #define flush_cache_dup_mm(mm) do { } while (0) | ||
23 | #define flush_cache_range(vma, start, end) do { } while (0) | ||
24 | #define flush_cache_page(vma, vmaddr, pfn) do { } while (0) | ||
25 | #define flush_dcache_page(page) do { } while (0) | ||
26 | #define flush_dcache_mmap_lock(mapping) do { } while (0) | ||
27 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) | ||
28 | void flush_icache_range(unsigned long start, unsigned long end); | ||
29 | #define flush_icache_page(vma,pg) do { } while (0) | ||
30 | #define flush_icache_user_range(vma,pg,adr,len) do { } while (0) | ||
31 | #define flush_cache_sigtramp(vaddr) do { } while (0) | ||
32 | |||
33 | #define p3_cache_init() do { } while (0) | ||
34 | #endif /* __ASM_CPU_SH2A_CACHEFLUSH_H */ | ||
diff --git a/arch/sh/kernel/cpu/sh4/sq.c b/arch/sh/kernel/cpu/sh4/sq.c index dcdf959a3d44..8a8a993f55ea 100644 --- a/arch/sh/kernel/cpu/sh4/sq.c +++ b/arch/sh/kernel/cpu/sh4/sq.c | |||
@@ -199,7 +199,7 @@ EXPORT_SYMBOL(sq_remap); | |||
199 | 199 | ||
200 | /** | 200 | /** |
201 | * sq_unmap - Unmap a Store Queue allocation | 201 | * sq_unmap - Unmap a Store Queue allocation |
202 | * @map: Pre-allocated Store Queue mapping. | 202 | * @vaddr: Pre-allocated Store Queue mapping. |
203 | * | 203 | * |
204 | * Unmaps the store queue allocation @map that was previously created by | 204 | * Unmaps the store queue allocation @map that was previously created by |
205 | * sq_remap(). Also frees up the pte that was previously inserted into | 205 | * sq_remap(). Also frees up the pte that was previously inserted into |
diff --git a/arch/sh/kernel/cpu/sh5/entry.S b/arch/sh/kernel/cpu/sh5/entry.S index ca08e7f26a3a..04c7da968146 100644 --- a/arch/sh/kernel/cpu/sh5/entry.S +++ b/arch/sh/kernel/cpu/sh5/entry.S | |||
@@ -987,11 +987,11 @@ work_resched: | |||
987 | work_notifysig: | 987 | work_notifysig: |
988 | gettr tr1, LINK | 988 | gettr tr1, LINK |
989 | 989 | ||
990 | movi do_signal, r6 | 990 | movi do_notify_resume, r6 |
991 | ptabs r6, tr0 | 991 | ptabs r6, tr0 |
992 | or SP, ZERO, r2 | 992 | or SP, ZERO, r2 |
993 | or ZERO, ZERO, r3 | 993 | or r7, ZERO, r3 |
994 | blink tr0, LINK /* Call do_signal(regs, 0), return here */ | 994 | blink tr0, LINK /* Call do_notify_resume(regs, current_thread_info->flags), return here */ |
995 | 995 | ||
996 | restore_all: | 996 | restore_all: |
997 | /* Do prefetches */ | 997 | /* Do prefetches */ |
@@ -1300,18 +1300,20 @@ syscall_allowed: | |||
1300 | 1300 | ||
1301 | getcon KCR0, r2 | 1301 | getcon KCR0, r2 |
1302 | ld.l r2, TI_FLAGS, r4 | 1302 | ld.l r2, TI_FLAGS, r4 |
1303 | movi (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | _TIF_SYSCALL_AUDIT), r6 | 1303 | movi _TIF_WORK_SYSCALL_MASK, r6 |
1304 | and r6, r4, r6 | 1304 | and r6, r4, r6 |
1305 | beq/l r6, ZERO, tr0 | 1305 | beq/l r6, ZERO, tr0 |
1306 | 1306 | ||
1307 | /* Trace it by calling syscall_trace before and after */ | 1307 | /* Trace it by calling syscall_trace before and after */ |
1308 | movi syscall_trace, r4 | 1308 | movi do_syscall_trace_enter, r4 |
1309 | or SP, ZERO, r2 | 1309 | or SP, ZERO, r2 |
1310 | or ZERO, ZERO, r3 | ||
1311 | ptabs r4, tr0 | 1310 | ptabs r4, tr0 |
1312 | blink tr0, LINK | 1311 | blink tr0, LINK |
1313 | 1312 | ||
1314 | /* Reload syscall number as r5 is trashed by syscall_trace */ | 1313 | /* Save the retval */ |
1314 | st.q SP, FRAME_R(2), r2 | ||
1315 | |||
1316 | /* Reload syscall number as r5 is trashed by do_syscall_trace_enter */ | ||
1315 | ld.q SP, FRAME_S(FSYSCALL_ID), r5 | 1317 | ld.q SP, FRAME_S(FSYSCALL_ID), r5 |
1316 | andi r5, 0x1ff, r5 | 1318 | andi r5, 0x1ff, r5 |
1317 | 1319 | ||
@@ -1343,9 +1345,8 @@ syscall_ret_trace: | |||
1343 | /* We get back here only if under trace */ | 1345 | /* We get back here only if under trace */ |
1344 | st.q SP, FRAME_R(9), r2 /* Save return value */ | 1346 | st.q SP, FRAME_R(9), r2 /* Save return value */ |
1345 | 1347 | ||
1346 | movi syscall_trace, LINK | 1348 | movi do_syscall_trace_leave, LINK |
1347 | or SP, ZERO, r2 | 1349 | or SP, ZERO, r2 |
1348 | movi 1, r3 | ||
1349 | ptabs LINK, tr0 | 1350 | ptabs LINK, tr0 |
1350 | blink tr0, LINK | 1351 | blink tr0, LINK |
1351 | 1352 | ||
diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S index 5e0dd1933847..0bc17def55a7 100644 --- a/arch/sh/kernel/entry-common.S +++ b/arch/sh/kernel/entry-common.S | |||
@@ -202,7 +202,7 @@ work_resched: | |||
202 | syscall_exit_work: | 202 | syscall_exit_work: |
203 | ! r0: current_thread_info->flags | 203 | ! r0: current_thread_info->flags |
204 | ! r8: current_thread_info | 204 | ! r8: current_thread_info |
205 | tst #_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | _TIF_SYSCALL_AUDIT, r0 | 205 | tst #_TIF_WORK_SYSCALL_MASK, r0 |
206 | bt/s work_pending | 206 | bt/s work_pending |
207 | tst #_TIF_NEED_RESCHED, r0 | 207 | tst #_TIF_NEED_RESCHED, r0 |
208 | #ifdef CONFIG_TRACE_IRQFLAGS | 208 | #ifdef CONFIG_TRACE_IRQFLAGS |
@@ -211,10 +211,8 @@ syscall_exit_work: | |||
211 | nop | 211 | nop |
212 | #endif | 212 | #endif |
213 | sti | 213 | sti |
214 | ! XXX setup arguments... | ||
215 | mov r15, r4 | 214 | mov r15, r4 |
216 | mov #1, r5 | 215 | mov.l 8f, r0 ! do_syscall_trace_leave |
217 | mov.l 4f, r0 ! do_syscall_trace | ||
218 | jsr @r0 | 216 | jsr @r0 |
219 | nop | 217 | nop |
220 | bra resume_userspace | 218 | bra resume_userspace |
@@ -223,12 +221,11 @@ syscall_exit_work: | |||
223 | .align 2 | 221 | .align 2 |
224 | syscall_trace_entry: | 222 | syscall_trace_entry: |
225 | ! Yes it is traced. | 223 | ! Yes it is traced. |
226 | ! XXX setup arguments... | ||
227 | mov r15, r4 | 224 | mov r15, r4 |
228 | mov #0, r5 | 225 | mov.l 7f, r11 ! Call do_syscall_trace_enter which notifies |
229 | mov.l 4f, r11 ! Call do_syscall_trace which notifies | ||
230 | jsr @r11 ! superior (will chomp R[0-7]) | 226 | jsr @r11 ! superior (will chomp R[0-7]) |
231 | nop | 227 | nop |
228 | mov.l r0, @(OFF_R0,r15) ! Save return value | ||
232 | ! Reload R0-R4 from kernel stack, where the | 229 | ! Reload R0-R4 from kernel stack, where the |
233 | ! parent may have modified them using | 230 | ! parent may have modified them using |
234 | ! ptrace(POKEUSR). (Note that R0-R2 are | 231 | ! ptrace(POKEUSR). (Note that R0-R2 are |
@@ -351,7 +348,7 @@ ENTRY(system_call) | |||
351 | ! | 348 | ! |
352 | get_current_thread_info r8, r10 | 349 | get_current_thread_info r8, r10 |
353 | mov.l @(TI_FLAGS,r8), r8 | 350 | mov.l @(TI_FLAGS,r8), r8 |
354 | mov #(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT), r10 | 351 | mov #_TIF_WORK_SYSCALL_MASK, r10 |
355 | tst r10, r8 | 352 | tst r10, r8 |
356 | bf syscall_trace_entry | 353 | bf syscall_trace_entry |
357 | ! | 354 | ! |
@@ -389,8 +386,9 @@ syscall_exit: | |||
389 | #endif | 386 | #endif |
390 | 2: .long NR_syscalls | 387 | 2: .long NR_syscalls |
391 | 3: .long sys_call_table | 388 | 3: .long sys_call_table |
392 | 4: .long do_syscall_trace | ||
393 | #ifdef CONFIG_TRACE_IRQFLAGS | 389 | #ifdef CONFIG_TRACE_IRQFLAGS |
394 | 5: .long trace_hardirqs_on | 390 | 5: .long trace_hardirqs_on |
395 | 6: .long trace_hardirqs_off | 391 | 6: .long trace_hardirqs_off |
396 | #endif | 392 | #endif |
393 | 7: .long do_syscall_trace_enter | ||
394 | 8: .long do_syscall_trace_leave | ||
diff --git a/arch/sh/kernel/machine_kexec.c b/arch/sh/kernel/machine_kexec.c index ec1eadce4aaa..4703dff174d5 100644 --- a/arch/sh/kernel/machine_kexec.c +++ b/arch/sh/kernel/machine_kexec.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/kexec.h> | 13 | #include <linux/kexec.h> |
14 | #include <linux/delay.h> | 14 | #include <linux/delay.h> |
15 | #include <linux/reboot.h> | 15 | #include <linux/reboot.h> |
16 | #include <linux/numa.h> | ||
16 | #include <asm/pgtable.h> | 17 | #include <asm/pgtable.h> |
17 | #include <asm/pgalloc.h> | 18 | #include <asm/pgalloc.h> |
18 | #include <asm/mmu_context.h> | 19 | #include <asm/mmu_context.h> |
@@ -104,3 +105,10 @@ void machine_kexec(struct kimage *image) | |||
104 | (*rnk)(page_list, reboot_code_buffer, image->start, vbr_reg); | 105 | (*rnk)(page_list, reboot_code_buffer, image->start, vbr_reg); |
105 | } | 106 | } |
106 | 107 | ||
108 | void arch_crash_save_vmcoreinfo(void) | ||
109 | { | ||
110 | #ifdef CONFIG_NUMA | ||
111 | VMCOREINFO_SYMBOL(node_data); | ||
112 | VMCOREINFO_LENGTH(node_data, MAX_NUMNODES); | ||
113 | #endif | ||
114 | } | ||
diff --git a/arch/sh/kernel/module.c b/arch/sh/kernel/module.c index 5482e65375a9..c43081039dd5 100644 --- a/arch/sh/kernel/module.c +++ b/arch/sh/kernel/module.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/moduleloader.h> | 27 | #include <linux/moduleloader.h> |
28 | #include <linux/elf.h> | 28 | #include <linux/elf.h> |
29 | #include <linux/vmalloc.h> | 29 | #include <linux/vmalloc.h> |
30 | #include <linux/bug.h> | ||
30 | #include <linux/fs.h> | 31 | #include <linux/fs.h> |
31 | #include <linux/string.h> | 32 | #include <linux/string.h> |
32 | #include <linux/kernel.h> | 33 | #include <linux/kernel.h> |
@@ -36,7 +37,8 @@ void *module_alloc(unsigned long size) | |||
36 | { | 37 | { |
37 | if (size == 0) | 38 | if (size == 0) |
38 | return NULL; | 39 | return NULL; |
39 | return vmalloc(size); | 40 | |
41 | return vmalloc_exec(size); | ||
40 | } | 42 | } |
41 | 43 | ||
42 | 44 | ||
@@ -145,9 +147,10 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
145 | const Elf_Shdr *sechdrs, | 147 | const Elf_Shdr *sechdrs, |
146 | struct module *me) | 148 | struct module *me) |
147 | { | 149 | { |
148 | return 0; | 150 | return module_bug_finalize(hdr, sechdrs, me); |
149 | } | 151 | } |
150 | 152 | ||
151 | void module_arch_cleanup(struct module *mod) | 153 | void module_arch_cleanup(struct module *mod) |
152 | { | 154 | { |
155 | module_bug_cleanup(mod); | ||
153 | } | 156 | } |
diff --git a/arch/sh/kernel/ptrace_32.c b/arch/sh/kernel/ptrace_32.c index 2bc72def5cf8..035cb300d3dc 100644 --- a/arch/sh/kernel/ptrace_32.c +++ b/arch/sh/kernel/ptrace_32.c | |||
@@ -20,6 +20,8 @@ | |||
20 | #include <linux/signal.h> | 20 | #include <linux/signal.h> |
21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
22 | #include <linux/audit.h> | 22 | #include <linux/audit.h> |
23 | #include <linux/seccomp.h> | ||
24 | #include <linux/tracehook.h> | ||
23 | #include <asm/uaccess.h> | 25 | #include <asm/uaccess.h> |
24 | #include <asm/pgtable.h> | 26 | #include <asm/pgtable.h> |
25 | #include <asm/system.h> | 27 | #include <asm/system.h> |
@@ -57,7 +59,23 @@ static inline int put_stack_long(struct task_struct *task, int offset, | |||
57 | return 0; | 59 | return 0; |
58 | } | 60 | } |
59 | 61 | ||
60 | static void ptrace_disable_singlestep(struct task_struct *child) | 62 | void user_enable_single_step(struct task_struct *child) |
63 | { | ||
64 | struct pt_regs *regs = task_pt_regs(child); | ||
65 | long pc; | ||
66 | |||
67 | pc = get_stack_long(child, (long)®s->pc); | ||
68 | |||
69 | /* Next scheduling will set up UBC */ | ||
70 | if (child->thread.ubc_pc == 0) | ||
71 | ubc_usercnt += 1; | ||
72 | |||
73 | child->thread.ubc_pc = pc; | ||
74 | |||
75 | set_tsk_thread_flag(child, TIF_SINGLESTEP); | ||
76 | } | ||
77 | |||
78 | void user_disable_single_step(struct task_struct *child) | ||
61 | { | 79 | { |
62 | clear_tsk_thread_flag(child, TIF_SINGLESTEP); | 80 | clear_tsk_thread_flag(child, TIF_SINGLESTEP); |
63 | 81 | ||
@@ -81,7 +99,7 @@ static void ptrace_disable_singlestep(struct task_struct *child) | |||
81 | */ | 99 | */ |
82 | void ptrace_disable(struct task_struct *child) | 100 | void ptrace_disable(struct task_struct *child) |
83 | { | 101 | { |
84 | ptrace_disable_singlestep(child); | 102 | user_disable_single_step(child); |
85 | } | 103 | } |
86 | 104 | ||
87 | long arch_ptrace(struct task_struct *child, long request, long addr, long data) | 105 | long arch_ptrace(struct task_struct *child, long request, long addr, long data) |
@@ -90,12 +108,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
90 | int ret; | 108 | int ret; |
91 | 109 | ||
92 | switch (request) { | 110 | switch (request) { |
93 | /* when I and D space are separate, these will need to be fixed. */ | ||
94 | case PTRACE_PEEKTEXT: /* read word at location addr. */ | ||
95 | case PTRACE_PEEKDATA: | ||
96 | ret = generic_ptrace_peekdata(child, addr, data); | ||
97 | break; | ||
98 | |||
99 | /* read the word at location addr in the USER area. */ | 111 | /* read the word at location addr in the USER area. */ |
100 | case PTRACE_PEEKUSR: { | 112 | case PTRACE_PEEKUSR: { |
101 | unsigned long tmp; | 113 | unsigned long tmp; |
@@ -125,12 +137,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
125 | break; | 137 | break; |
126 | } | 138 | } |
127 | 139 | ||
128 | /* when I and D space are separate, this will have to be fixed. */ | ||
129 | case PTRACE_POKETEXT: /* write the word at location addr. */ | ||
130 | case PTRACE_POKEDATA: | ||
131 | ret = generic_ptrace_pokedata(child, addr, data); | ||
132 | break; | ||
133 | |||
134 | case PTRACE_POKEUSR: /* write the word at location addr in the USER area */ | 140 | case PTRACE_POKEUSR: /* write the word at location addr in the USER area */ |
135 | ret = -EIO; | 141 | ret = -EIO; |
136 | if ((addr & 3) || addr < 0 || | 142 | if ((addr & 3) || addr < 0 || |
@@ -151,67 +157,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
151 | } | 157 | } |
152 | break; | 158 | break; |
153 | 159 | ||
154 | case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */ | ||
155 | case PTRACE_CONT: { /* restart after signal. */ | ||
156 | ret = -EIO; | ||
157 | if (!valid_signal(data)) | ||
158 | break; | ||
159 | if (request == PTRACE_SYSCALL) | ||
160 | set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
161 | else | ||
162 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
163 | |||
164 | ptrace_disable_singlestep(child); | ||
165 | |||
166 | child->exit_code = data; | ||
167 | wake_up_process(child); | ||
168 | ret = 0; | ||
169 | break; | ||
170 | } | ||
171 | |||
172 | /* | ||
173 | * make the child exit. Best I can do is send it a sigkill. | ||
174 | * perhaps it should be put in the status that it wants to | ||
175 | * exit. | ||
176 | */ | ||
177 | case PTRACE_KILL: { | ||
178 | ret = 0; | ||
179 | if (child->exit_state == EXIT_ZOMBIE) /* already dead */ | ||
180 | break; | ||
181 | ptrace_disable_singlestep(child); | ||
182 | child->exit_code = SIGKILL; | ||
183 | wake_up_process(child); | ||
184 | break; | ||
185 | } | ||
186 | |||
187 | case PTRACE_SINGLESTEP: { /* set the trap flag. */ | ||
188 | long pc; | ||
189 | struct pt_regs *regs = NULL; | ||
190 | |||
191 | ret = -EIO; | ||
192 | if (!valid_signal(data)) | ||
193 | break; | ||
194 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
195 | if ((child->ptrace & PT_DTRACE) == 0) { | ||
196 | /* Spurious delayed TF traps may occur */ | ||
197 | child->ptrace |= PT_DTRACE; | ||
198 | } | ||
199 | |||
200 | pc = get_stack_long(child, (long)®s->pc); | ||
201 | |||
202 | /* Next scheduling will set up UBC */ | ||
203 | if (child->thread.ubc_pc == 0) | ||
204 | ubc_usercnt += 1; | ||
205 | child->thread.ubc_pc = pc; | ||
206 | |||
207 | set_tsk_thread_flag(child, TIF_SINGLESTEP); | ||
208 | child->exit_code = data; | ||
209 | /* give it a chance to run. */ | ||
210 | wake_up_process(child); | ||
211 | ret = 0; | ||
212 | break; | ||
213 | } | ||
214 | |||
215 | #ifdef CONFIG_SH_DSP | 160 | #ifdef CONFIG_SH_DSP |
216 | case PTRACE_GETDSPREGS: { | 161 | case PTRACE_GETDSPREGS: { |
217 | unsigned long dp; | 162 | unsigned long dp; |
@@ -272,39 +217,49 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
272 | return ret; | 217 | return ret; |
273 | } | 218 | } |
274 | 219 | ||
275 | asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit) | 220 | static inline int audit_arch(void) |
276 | { | 221 | { |
277 | struct task_struct *tsk = current; | 222 | int arch = EM_SH; |
278 | 223 | ||
279 | if (unlikely(current->audit_context) && entryexit) | 224 | #ifdef CONFIG_CPU_LITTLE_ENDIAN |
280 | audit_syscall_exit(AUDITSC_RESULT(regs->regs[0]), | 225 | arch |= __AUDIT_ARCH_LE; |
281 | regs->regs[0]); | 226 | #endif |
282 | 227 | ||
283 | if (!test_thread_flag(TIF_SYSCALL_TRACE) && | 228 | return arch; |
284 | !test_thread_flag(TIF_SINGLESTEP)) | 229 | } |
285 | goto out; | ||
286 | if (!(tsk->ptrace & PT_PTRACED)) | ||
287 | goto out; | ||
288 | 230 | ||
289 | /* the 0x80 provides a way for the tracing parent to distinguish | 231 | asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) |
290 | between a syscall stop and SIGTRAP delivery */ | 232 | { |
291 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) && | 233 | long ret = 0; |
292 | !test_thread_flag(TIF_SINGLESTEP) ? 0x80 : 0)); | ||
293 | 234 | ||
294 | /* | 235 | secure_computing(regs->regs[0]); |
295 | * this isn't the same as continuing with a signal, but it will do | 236 | |
296 | * for normal use. strace only continues with a signal if the | 237 | if (test_thread_flag(TIF_SYSCALL_TRACE) && |
297 | * stopping signal is not SIGTRAP. -brl | 238 | tracehook_report_syscall_entry(regs)) |
298 | */ | 239 | /* |
299 | if (tsk->exit_code) { | 240 | * Tracing decided this syscall should not happen. |
300 | send_sig(tsk->exit_code, tsk, 1); | 241 | * We'll return a bogus call number to get an ENOSYS |
301 | tsk->exit_code = 0; | 242 | * error, but leave the original number in regs->regs[0]. |
302 | } | 243 | */ |
244 | ret = -1L; | ||
303 | 245 | ||
304 | out: | 246 | if (unlikely(current->audit_context)) |
305 | if (unlikely(current->audit_context) && !entryexit) | 247 | audit_syscall_entry(audit_arch(), regs->regs[3], |
306 | audit_syscall_entry(AUDIT_ARCH_SH, regs->regs[3], | ||
307 | regs->regs[4], regs->regs[5], | 248 | regs->regs[4], regs->regs[5], |
308 | regs->regs[6], regs->regs[7]); | 249 | regs->regs[6], regs->regs[7]); |
309 | 250 | ||
251 | return ret ?: regs->regs[0]; | ||
252 | } | ||
253 | |||
254 | asmlinkage void do_syscall_trace_leave(struct pt_regs *regs) | ||
255 | { | ||
256 | int step; | ||
257 | |||
258 | if (unlikely(current->audit_context)) | ||
259 | audit_syscall_exit(AUDITSC_RESULT(regs->regs[0]), | ||
260 | regs->regs[0]); | ||
261 | |||
262 | step = test_thread_flag(TIF_SINGLESTEP); | ||
263 | if (step || test_thread_flag(TIF_SYSCALL_TRACE)) | ||
264 | tracehook_report_syscall_exit(regs, step); | ||
310 | } | 265 | } |
diff --git a/arch/sh/kernel/ptrace_64.c b/arch/sh/kernel/ptrace_64.c index d453c47dc522..5922edd416db 100644 --- a/arch/sh/kernel/ptrace_64.c +++ b/arch/sh/kernel/ptrace_64.c | |||
@@ -27,6 +27,8 @@ | |||
27 | #include <linux/signal.h> | 27 | #include <linux/signal.h> |
28 | #include <linux/syscalls.h> | 28 | #include <linux/syscalls.h> |
29 | #include <linux/audit.h> | 29 | #include <linux/audit.h> |
30 | #include <linux/seccomp.h> | ||
31 | #include <linux/tracehook.h> | ||
30 | #include <asm/io.h> | 32 | #include <asm/io.h> |
31 | #include <asm/uaccess.h> | 33 | #include <asm/uaccess.h> |
32 | #include <asm/pgtable.h> | 34 | #include <asm/pgtable.h> |
@@ -120,18 +122,23 @@ put_fpu_long(struct task_struct *task, unsigned long addr, unsigned long data) | |||
120 | return 0; | 122 | return 0; |
121 | } | 123 | } |
122 | 124 | ||
125 | void user_enable_single_step(struct task_struct *child) | ||
126 | { | ||
127 | struct pt_regs *regs = child->thread.uregs; | ||
128 | |||
129 | regs->sr |= SR_SSTEP; /* auto-resetting upon exception */ | ||
130 | } | ||
131 | |||
132 | void user_disable_single_step(struct task_struct *child) | ||
133 | { | ||
134 | regs->sr &= ~SR_SSTEP; | ||
135 | } | ||
123 | 136 | ||
124 | long arch_ptrace(struct task_struct *child, long request, long addr, long data) | 137 | long arch_ptrace(struct task_struct *child, long request, long addr, long data) |
125 | { | 138 | { |
126 | int ret; | 139 | int ret; |
127 | 140 | ||
128 | switch (request) { | 141 | switch (request) { |
129 | /* when I and D space are separate, these will need to be fixed. */ | ||
130 | case PTRACE_PEEKTEXT: /* read word at location addr. */ | ||
131 | case PTRACE_PEEKDATA: | ||
132 | ret = generic_ptrace_peekdata(child, addr, data); | ||
133 | break; | ||
134 | |||
135 | /* read the word at location addr in the USER area. */ | 142 | /* read the word at location addr in the USER area. */ |
136 | case PTRACE_PEEKUSR: { | 143 | case PTRACE_PEEKUSR: { |
137 | unsigned long tmp; | 144 | unsigned long tmp; |
@@ -154,12 +161,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
154 | break; | 161 | break; |
155 | } | 162 | } |
156 | 163 | ||
157 | /* when I and D space are separate, this will have to be fixed. */ | ||
158 | case PTRACE_POKETEXT: /* write the word at location addr. */ | ||
159 | case PTRACE_POKEDATA: | ||
160 | ret = generic_ptrace_pokedata(child, addr, data); | ||
161 | break; | ||
162 | |||
163 | case PTRACE_POKEUSR: | 164 | case PTRACE_POKEUSR: |
164 | /* write the word at location addr in the USER area. We must | 165 | /* write the word at location addr in the USER area. We must |
165 | disallow any changes to certain SR bits or u_fpvalid, since | 166 | disallow any changes to certain SR bits or u_fpvalid, since |
@@ -191,58 +192,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
191 | } | 192 | } |
192 | break; | 193 | break; |
193 | 194 | ||
194 | case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */ | ||
195 | case PTRACE_CONT: { /* restart after signal. */ | ||
196 | ret = -EIO; | ||
197 | if (!valid_signal(data)) | ||
198 | break; | ||
199 | if (request == PTRACE_SYSCALL) | ||
200 | set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
201 | else | ||
202 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
203 | child->exit_code = data; | ||
204 | wake_up_process(child); | ||
205 | ret = 0; | ||
206 | break; | ||
207 | } | ||
208 | |||
209 | /* | ||
210 | * make the child exit. Best I can do is send it a sigkill. | ||
211 | * perhaps it should be put in the status that it wants to | ||
212 | * exit. | ||
213 | */ | ||
214 | case PTRACE_KILL: { | ||
215 | ret = 0; | ||
216 | if (child->exit_state == EXIT_ZOMBIE) /* already dead */ | ||
217 | break; | ||
218 | child->exit_code = SIGKILL; | ||
219 | wake_up_process(child); | ||
220 | break; | ||
221 | } | ||
222 | |||
223 | case PTRACE_SINGLESTEP: { /* set the trap flag. */ | ||
224 | struct pt_regs *regs; | ||
225 | |||
226 | ret = -EIO; | ||
227 | if (!valid_signal(data)) | ||
228 | break; | ||
229 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
230 | if ((child->ptrace & PT_DTRACE) == 0) { | ||
231 | /* Spurious delayed TF traps may occur */ | ||
232 | child->ptrace |= PT_DTRACE; | ||
233 | } | ||
234 | |||
235 | regs = child->thread.uregs; | ||
236 | |||
237 | regs->sr |= SR_SSTEP; /* auto-resetting upon exception */ | ||
238 | |||
239 | child->exit_code = data; | ||
240 | /* give it a chance to run. */ | ||
241 | wake_up_process(child); | ||
242 | ret = 0; | ||
243 | break; | ||
244 | } | ||
245 | |||
246 | default: | 195 | default: |
247 | ret = ptrace_request(child, request, addr, data); | 196 | ret = ptrace_request(child, request, addr, data); |
248 | break; | 197 | break; |
@@ -273,38 +222,51 @@ asmlinkage int sh64_ptrace(long request, long pid, long addr, long data) | |||
273 | return sys_ptrace(request, pid, addr, data); | 222 | return sys_ptrace(request, pid, addr, data); |
274 | } | 223 | } |
275 | 224 | ||
276 | asmlinkage void syscall_trace(struct pt_regs *regs, int entryexit) | 225 | static inline int audit_arch(void) |
277 | { | 226 | { |
278 | struct task_struct *tsk = current; | 227 | int arch = EM_SH; |
279 | 228 | ||
280 | if (unlikely(current->audit_context) && entryexit) | 229 | #ifdef CONFIG_64BIT |
281 | audit_syscall_exit(AUDITSC_RESULT(regs->regs[9]), | 230 | arch |= __AUDIT_ARCH_64BIT; |
282 | regs->regs[9]); | 231 | #endif |
232 | #ifdef CONFIG_CPU_LITTLE_ENDIAN | ||
233 | arch |= __AUDIT_ARCH_LE; | ||
234 | #endif | ||
283 | 235 | ||
284 | if (!test_thread_flag(TIF_SYSCALL_TRACE) && | 236 | return arch; |
285 | !test_thread_flag(TIF_SINGLESTEP)) | 237 | } |
286 | goto out; | ||
287 | if (!(tsk->ptrace & PT_PTRACED)) | ||
288 | goto out; | ||
289 | |||
290 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) && | ||
291 | !test_thread_flag(TIF_SINGLESTEP) ? 0x80 : 0)); | ||
292 | |||
293 | /* | ||
294 | * this isn't the same as continuing with a signal, but it will do | ||
295 | * for normal use. strace only continues with a signal if the | ||
296 | * stopping signal is not SIGTRAP. -brl | ||
297 | */ | ||
298 | if (tsk->exit_code) { | ||
299 | send_sig(tsk->exit_code, tsk, 1); | ||
300 | tsk->exit_code = 0; | ||
301 | } | ||
302 | 238 | ||
303 | out: | 239 | asmlinkage long long do_syscall_trace_enter(struct pt_regs *regs) |
304 | if (unlikely(current->audit_context) && !entryexit) | 240 | { |
305 | audit_syscall_entry(AUDIT_ARCH_SH, regs->regs[1], | 241 | long long ret = 0; |
242 | |||
243 | secure_computing(regs->regs[9]); | ||
244 | |||
245 | if (test_thread_flag(TIF_SYSCALL_TRACE) && | ||
246 | tracehook_report_syscall_entry(regs)) | ||
247 | /* | ||
248 | * Tracing decided this syscall should not happen. | ||
249 | * We'll return a bogus call number to get an ENOSYS | ||
250 | * error, but leave the original number in regs->regs[0]. | ||
251 | */ | ||
252 | ret = -1LL; | ||
253 | |||
254 | if (unlikely(current->audit_context)) | ||
255 | audit_syscall_entry(audit_arch(), regs->regs[1], | ||
306 | regs->regs[2], regs->regs[3], | 256 | regs->regs[2], regs->regs[3], |
307 | regs->regs[4], regs->regs[5]); | 257 | regs->regs[4], regs->regs[5]); |
258 | |||
259 | return ret ?: regs->regs[9]; | ||
260 | } | ||
261 | |||
262 | asmlinkage void do_syscall_trace_leave(struct pt_regs *regs) | ||
263 | { | ||
264 | if (unlikely(current->audit_context)) | ||
265 | audit_syscall_exit(AUDITSC_RESULT(regs->regs[9]), | ||
266 | regs->regs[9]); | ||
267 | |||
268 | if (test_thread_flag(TIF_SYSCALL_TRACE)) | ||
269 | tracehook_report_syscall_exit(regs, 0); | ||
308 | } | 270 | } |
309 | 271 | ||
310 | /* Called with interrupts disabled */ | 272 | /* Called with interrupts disabled */ |
@@ -338,5 +300,5 @@ asmlinkage void do_software_break_point(unsigned long long vec, | |||
338 | */ | 300 | */ |
339 | void ptrace_disable(struct task_struct *child) | 301 | void ptrace_disable(struct task_struct *child) |
340 | { | 302 | { |
341 | /* nothing to do.. */ | 303 | user_disable_single_step(child); |
342 | } | 304 | } |
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index 6339d0c95715..a35207655e7b 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/smp.h> | 25 | #include <linux/smp.h> |
26 | #include <linux/err.h> | 26 | #include <linux/err.h> |
27 | #include <linux/debugfs.h> | 27 | #include <linux/debugfs.h> |
28 | #include <linux/crash_dump.h> | ||
28 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
29 | #include <asm/io.h> | 30 | #include <asm/io.h> |
30 | #include <asm/page.h> | 31 | #include <asm/page.h> |
@@ -286,6 +287,25 @@ static void __init setup_memory(void) | |||
286 | extern void __init setup_memory(void); | 287 | extern void __init setup_memory(void); |
287 | #endif | 288 | #endif |
288 | 289 | ||
290 | /* | ||
291 | * Note: elfcorehdr_addr is not just limited to vmcore. It is also used by | ||
292 | * is_kdump_kernel() to determine if we are booting after a panic. Hence | ||
293 | * ifdef it under CONFIG_CRASH_DUMP and not CONFIG_PROC_VMCORE. | ||
294 | */ | ||
295 | #ifdef CONFIG_CRASH_DUMP | ||
296 | /* elfcorehdr= specifies the location of elf core header | ||
297 | * stored by the crashed kernel. | ||
298 | */ | ||
299 | static int __init parse_elfcorehdr(char *arg) | ||
300 | { | ||
301 | if (!arg) | ||
302 | return -EINVAL; | ||
303 | elfcorehdr_addr = memparse(arg, &arg); | ||
304 | return 0; | ||
305 | } | ||
306 | early_param("elfcorehdr", parse_elfcorehdr); | ||
307 | #endif | ||
308 | |||
289 | void __init setup_arch(char **cmdline_p) | 309 | void __init setup_arch(char **cmdline_p) |
290 | { | 310 | { |
291 | enable_mmu(); | 311 | enable_mmu(); |
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c index 4bbbde895a53..51689d29ad45 100644 --- a/arch/sh/kernel/signal_32.c +++ b/arch/sh/kernel/signal_32.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/binfmts.h> | 24 | #include <linux/binfmts.h> |
25 | #include <linux/freezer.h> | 25 | #include <linux/freezer.h> |
26 | #include <linux/io.h> | 26 | #include <linux/io.h> |
27 | #include <linux/tracehook.h> | ||
27 | #include <asm/system.h> | 28 | #include <asm/system.h> |
28 | #include <asm/ucontext.h> | 29 | #include <asm/ucontext.h> |
29 | #include <asm/uaccess.h> | 30 | #include <asm/uaccess.h> |
@@ -507,14 +508,13 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
507 | switch (regs->regs[0]) { | 508 | switch (regs->regs[0]) { |
508 | case -ERESTART_RESTARTBLOCK: | 509 | case -ERESTART_RESTARTBLOCK: |
509 | case -ERESTARTNOHAND: | 510 | case -ERESTARTNOHAND: |
511 | no_system_call_restart: | ||
510 | regs->regs[0] = -EINTR; | 512 | regs->regs[0] = -EINTR; |
511 | break; | 513 | break; |
512 | 514 | ||
513 | case -ERESTARTSYS: | 515 | case -ERESTARTSYS: |
514 | if (!(ka->sa.sa_flags & SA_RESTART)) { | 516 | if (!(ka->sa.sa_flags & SA_RESTART)) |
515 | regs->regs[0] = -EINTR; | 517 | goto no_system_call_restart; |
516 | break; | ||
517 | } | ||
518 | /* fallthrough */ | 518 | /* fallthrough */ |
519 | case -ERESTARTNOINTR: | 519 | case -ERESTARTNOINTR: |
520 | regs->regs[0] = save_r0; | 520 | regs->regs[0] = save_r0; |
@@ -589,12 +589,15 @@ static void do_signal(struct pt_regs *regs, unsigned int save_r0) | |||
589 | * clear the TIF_RESTORE_SIGMASK flag */ | 589 | * clear the TIF_RESTORE_SIGMASK flag */ |
590 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 590 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
591 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 591 | clear_thread_flag(TIF_RESTORE_SIGMASK); |
592 | |||
593 | tracehook_signal_handler(signr, &info, &ka, regs, | ||
594 | test_thread_flag(TIF_SINGLESTEP)); | ||
592 | } | 595 | } |
593 | 596 | ||
594 | return; | 597 | return; |
595 | } | 598 | } |
596 | 599 | ||
597 | no_signal: | 600 | no_signal: |
598 | /* Did we come from a system call? */ | 601 | /* Did we come from a system call? */ |
599 | if (regs->tra >= 0) { | 602 | if (regs->tra >= 0) { |
600 | /* Restart the system call - no handlers present */ | 603 | /* Restart the system call - no handlers present */ |
@@ -618,9 +621,14 @@ static void do_signal(struct pt_regs *regs, unsigned int save_r0) | |||
618 | } | 621 | } |
619 | 622 | ||
620 | asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned int save_r0, | 623 | asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned int save_r0, |
621 | __u32 thread_info_flags) | 624 | unsigned long thread_info_flags) |
622 | { | 625 | { |
623 | /* deal with pending signal delivery */ | 626 | /* deal with pending signal delivery */ |
624 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) | 627 | if (thread_info_flags & _TIF_SIGPENDING) |
625 | do_signal(regs, save_r0); | 628 | do_signal(regs, save_r0); |
629 | |||
630 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | ||
631 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
632 | tracehook_notify_resume(regs); | ||
633 | } | ||
626 | } | 634 | } |
diff --git a/arch/sh/kernel/signal_64.c b/arch/sh/kernel/signal_64.c index 552eb810cd85..1d62dfef77f1 100644 --- a/arch/sh/kernel/signal_64.c +++ b/arch/sh/kernel/signal_64.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/ptrace.h> | 22 | #include <linux/ptrace.h> |
23 | #include <linux/unistd.h> | 23 | #include <linux/unistd.h> |
24 | #include <linux/stddef.h> | 24 | #include <linux/stddef.h> |
25 | #include <linux/tracehook.h> | ||
25 | #include <asm/ucontext.h> | 26 | #include <asm/ucontext.h> |
26 | #include <asm/uaccess.h> | 27 | #include <asm/uaccess.h> |
27 | #include <asm/pgtable.h> | 28 | #include <asm/pgtable.h> |
@@ -42,7 +43,84 @@ | |||
42 | 43 | ||
43 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 44 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) |
44 | 45 | ||
45 | asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset); | 46 | /* |
47 | * Note that 'init' is a special process: it doesn't get signals it doesn't | ||
48 | * want to handle. Thus you cannot kill init even with a SIGKILL even by | ||
49 | * mistake. | ||
50 | * | ||
51 | * Note that we go through the signals twice: once to check the signals that | ||
52 | * the kernel can handle, and then we build all the user-level signal handling | ||
53 | * stack-frames in one go after that. | ||
54 | */ | ||
55 | static int do_signal(struct pt_regs *regs, sigset_t *oldset) | ||
56 | { | ||
57 | siginfo_t info; | ||
58 | int signr; | ||
59 | struct k_sigaction ka; | ||
60 | |||
61 | /* | ||
62 | * We want the common case to go fast, which | ||
63 | * is why we may in certain cases get here from | ||
64 | * kernel mode. Just return without doing anything | ||
65 | * if so. | ||
66 | */ | ||
67 | if (!user_mode(regs)) | ||
68 | return 1; | ||
69 | |||
70 | if (try_to_freeze()) | ||
71 | goto no_signal; | ||
72 | |||
73 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
74 | oldset = ¤t->saved_sigmask; | ||
75 | else if (!oldset) | ||
76 | oldset = ¤t->blocked; | ||
77 | |||
78 | signr = get_signal_to_deliver(&info, &ka, regs, 0); | ||
79 | |||
80 | if (signr > 0) { | ||
81 | /* Whee! Actually deliver the signal. */ | ||
82 | handle_signal(signr, &info, &ka, oldset, regs); | ||
83 | |||
84 | /* | ||
85 | * If a signal was successfully delivered, the saved sigmask | ||
86 | * is in its frame, and we can clear the TIF_RESTORE_SIGMASK | ||
87 | * flag. | ||
88 | */ | ||
89 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
90 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
91 | |||
92 | tracehook_signal_handler(signr, &info, &ka, regs, 0); | ||
93 | return 1; | ||
94 | } | ||
95 | |||
96 | no_signal: | ||
97 | /* Did we come from a system call? */ | ||
98 | if (regs->syscall_nr >= 0) { | ||
99 | /* Restart the system call - no handlers present */ | ||
100 | switch (regs->regs[REG_RET]) { | ||
101 | case -ERESTARTNOHAND: | ||
102 | case -ERESTARTSYS: | ||
103 | case -ERESTARTNOINTR: | ||
104 | /* Decode Syscall # */ | ||
105 | regs->regs[REG_RET] = regs->syscall_nr; | ||
106 | regs->pc -= 4; | ||
107 | break; | ||
108 | |||
109 | case -ERESTART_RESTARTBLOCK: | ||
110 | regs->regs[REG_RET] = __NR_restart_syscall; | ||
111 | regs->pc -= 4; | ||
112 | break; | ||
113 | } | ||
114 | } | ||
115 | |||
116 | /* No signal to deliver -- put the saved sigmask back */ | ||
117 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | ||
118 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
119 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | ||
120 | } | ||
121 | |||
122 | return 0; | ||
123 | } | ||
46 | 124 | ||
47 | /* | 125 | /* |
48 | * Atomically swap in the new signal mask, and wait for a signal. | 126 | * Atomically swap in the new signal mask, and wait for a signal. |
@@ -643,14 +721,13 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
643 | switch (regs->regs[REG_RET]) { | 721 | switch (regs->regs[REG_RET]) { |
644 | case -ERESTART_RESTARTBLOCK: | 722 | case -ERESTART_RESTARTBLOCK: |
645 | case -ERESTARTNOHAND: | 723 | case -ERESTARTNOHAND: |
724 | no_system_call_restart: | ||
646 | regs->regs[REG_RET] = -EINTR; | 725 | regs->regs[REG_RET] = -EINTR; |
647 | break; | 726 | break; |
648 | 727 | ||
649 | case -ERESTARTSYS: | 728 | case -ERESTARTSYS: |
650 | if (!(ka->sa.sa_flags & SA_RESTART)) { | 729 | if (!(ka->sa.sa_flags & SA_RESTART)) |
651 | regs->regs[REG_RET] = -EINTR; | 730 | goto no_system_call_restart; |
652 | break; | ||
653 | } | ||
654 | /* fallthrough */ | 731 | /* fallthrough */ |
655 | case -ERESTARTNOINTR: | 732 | case -ERESTARTNOINTR: |
656 | /* Decode syscall # */ | 733 | /* Decode syscall # */ |
@@ -673,80 +750,13 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
673 | spin_unlock_irq(¤t->sighand->siglock); | 750 | spin_unlock_irq(¤t->sighand->siglock); |
674 | } | 751 | } |
675 | 752 | ||
676 | /* | 753 | asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags) |
677 | * Note that 'init' is a special process: it doesn't get signals it doesn't | ||
678 | * want to handle. Thus you cannot kill init even with a SIGKILL even by | ||
679 | * mistake. | ||
680 | * | ||
681 | * Note that we go through the signals twice: once to check the signals that | ||
682 | * the kernel can handle, and then we build all the user-level signal handling | ||
683 | * stack-frames in one go after that. | ||
684 | */ | ||
685 | int do_signal(struct pt_regs *regs, sigset_t *oldset) | ||
686 | { | 754 | { |
687 | siginfo_t info; | 755 | if (thread_info_flags & _TIF_SIGPENDING) |
688 | int signr; | 756 | do_signal(regs, 0); |
689 | struct k_sigaction ka; | ||
690 | |||
691 | /* | ||
692 | * We want the common case to go fast, which | ||
693 | * is why we may in certain cases get here from | ||
694 | * kernel mode. Just return without doing anything | ||
695 | * if so. | ||
696 | */ | ||
697 | if (!user_mode(regs)) | ||
698 | return 1; | ||
699 | |||
700 | if (try_to_freeze()) | ||
701 | goto no_signal; | ||
702 | |||
703 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
704 | oldset = ¤t->saved_sigmask; | ||
705 | else if (!oldset) | ||
706 | oldset = ¤t->blocked; | ||
707 | |||
708 | signr = get_signal_to_deliver(&info, &ka, regs, 0); | ||
709 | |||
710 | if (signr > 0) { | ||
711 | /* Whee! Actually deliver the signal. */ | ||
712 | handle_signal(signr, &info, &ka, oldset, regs); | ||
713 | 757 | ||
714 | /* | 758 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { |
715 | * If a signal was successfully delivered, the saved sigmask | 759 | clear_thread_flag(TIF_NOTIFY_RESUME); |
716 | * is in its frame, and we can clear the TIF_RESTORE_SIGMASK | 760 | tracehook_notify_resume(regs); |
717 | * flag. | ||
718 | */ | ||
719 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
720 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
721 | |||
722 | return 1; | ||
723 | } | 761 | } |
724 | |||
725 | no_signal: | ||
726 | /* Did we come from a system call? */ | ||
727 | if (regs->syscall_nr >= 0) { | ||
728 | /* Restart the system call - no handlers present */ | ||
729 | switch (regs->regs[REG_RET]) { | ||
730 | case -ERESTARTNOHAND: | ||
731 | case -ERESTARTSYS: | ||
732 | case -ERESTARTNOINTR: | ||
733 | /* Decode Syscall # */ | ||
734 | regs->regs[REG_RET] = regs->syscall_nr; | ||
735 | regs->pc -= 4; | ||
736 | break; | ||
737 | |||
738 | case -ERESTART_RESTARTBLOCK: | ||
739 | regs->regs[REG_RET] = __NR_restart_syscall; | ||
740 | regs->pc -= 4; | ||
741 | break; | ||
742 | } | ||
743 | } | ||
744 | |||
745 | /* No signal to deliver -- put the saved sigmask back */ | ||
746 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | ||
747 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
748 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | ||
749 | } | ||
750 | |||
751 | return 0; | ||
752 | } | 762 | } |
diff --git a/arch/sh/mm/Kconfig b/arch/sh/mm/Kconfig index 56d0a7daa34b..9c131cac91a4 100644 --- a/arch/sh/mm/Kconfig +++ b/arch/sh/mm/Kconfig | |||
@@ -237,7 +237,6 @@ choice | |||
237 | 237 | ||
238 | config CACHE_WRITEBACK | 238 | config CACHE_WRITEBACK |
239 | bool "Write-back" | 239 | bool "Write-back" |
240 | depends on CPU_SH2A || CPU_SH3 || CPU_SH4 || CPU_SH5 | ||
241 | 240 | ||
242 | config CACHE_WRITETHROUGH | 241 | config CACHE_WRITETHROUGH |
243 | bool "Write-through" | 242 | bool "Write-through" |
diff --git a/arch/sh/mm/Makefile_32 b/arch/sh/mm/Makefile_32 index e295db60b91b..70e0906023cc 100644 --- a/arch/sh/mm/Makefile_32 +++ b/arch/sh/mm/Makefile_32 | |||
@@ -5,12 +5,15 @@ | |||
5 | obj-y := init.o extable_32.o consistent.o | 5 | obj-y := init.o extable_32.o consistent.o |
6 | 6 | ||
7 | ifndef CONFIG_CACHE_OFF | 7 | ifndef CONFIG_CACHE_OFF |
8 | obj-$(CONFIG_CPU_SH2) += cache-sh2.o | 8 | cache-$(CONFIG_CPU_SH2) := cache-sh2.o |
9 | obj-$(CONFIG_CPU_SH3) += cache-sh3.o | 9 | cache-$(CONFIG_CPU_SH2A) := cache-sh2a.o |
10 | obj-$(CONFIG_CPU_SH4) += cache-sh4.o | 10 | cache-$(CONFIG_CPU_SH3) := cache-sh3.o |
11 | obj-$(CONFIG_SH7705_CACHE_32KB) += cache-sh7705.o | 11 | cache-$(CONFIG_CPU_SH4) := cache-sh4.o |
12 | cache-$(CONFIG_SH7705_CACHE_32KB) += cache-sh7705.o | ||
12 | endif | 13 | endif |
13 | 14 | ||
15 | obj-y += $(cache-y) | ||
16 | |||
14 | mmu-y := tlb-nommu.o pg-nommu.o | 17 | mmu-y := tlb-nommu.o pg-nommu.o |
15 | mmu-$(CONFIG_MMU) := fault_32.o tlbflush_32.o ioremap_32.o | 18 | mmu-$(CONFIG_MMU) := fault_32.o tlbflush_32.o ioremap_32.o |
16 | 19 | ||
diff --git a/arch/sh/mm/cache-sh2.c b/arch/sh/mm/cache-sh2.c index 6614033f6be9..c4e80d2b764b 100644 --- a/arch/sh/mm/cache-sh2.c +++ b/arch/sh/mm/cache-sh2.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * arch/sh/mm/cache-sh2.c | 2 | * arch/sh/mm/cache-sh2.c |
3 | * | 3 | * |
4 | * Copyright (C) 2002 Paul Mundt | 4 | * Copyright (C) 2002 Paul Mundt |
5 | * Copyright (C) 2008 Yoshinori Sato | ||
5 | * | 6 | * |
6 | * Released under the terms of the GNU GPL v2.0. | 7 | * Released under the terms of the GNU GPL v2.0. |
7 | */ | 8 | */ |
@@ -24,8 +25,15 @@ void __flush_wback_region(void *start, int size) | |||
24 | end = ((unsigned long)start + size + L1_CACHE_BYTES-1) | 25 | end = ((unsigned long)start + size + L1_CACHE_BYTES-1) |
25 | & ~(L1_CACHE_BYTES-1); | 26 | & ~(L1_CACHE_BYTES-1); |
26 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { | 27 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { |
27 | /* FIXME cache purge */ | 28 | unsigned long addr = CACHE_OC_ADDRESS_ARRAY | (v & 0x00000ff0); |
28 | ctrl_outl((v & 0x1ffffc00), (v & 0x00000ff0) | 0x00000008); | 29 | int way; |
30 | for (way = 0; way < 4; way++) { | ||
31 | unsigned long data = ctrl_inl(addr | (way << 12)); | ||
32 | if ((data & CACHE_PHYSADDR_MASK) == (v & CACHE_PHYSADDR_MASK)) { | ||
33 | data &= ~SH_CACHE_UPDATED; | ||
34 | ctrl_outl(data, addr | (way << 12)); | ||
35 | } | ||
36 | } | ||
29 | } | 37 | } |
30 | } | 38 | } |
31 | 39 | ||
@@ -37,21 +45,40 @@ void __flush_purge_region(void *start, int size) | |||
37 | begin = (unsigned long)start & ~(L1_CACHE_BYTES-1); | 45 | begin = (unsigned long)start & ~(L1_CACHE_BYTES-1); |
38 | end = ((unsigned long)start + size + L1_CACHE_BYTES-1) | 46 | end = ((unsigned long)start + size + L1_CACHE_BYTES-1) |
39 | & ~(L1_CACHE_BYTES-1); | 47 | & ~(L1_CACHE_BYTES-1); |
40 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { | 48 | |
41 | ctrl_outl((v & 0x1ffffc00), (v & 0x00000ff0) | 0x00000008); | 49 | for (v = begin; v < end; v+=L1_CACHE_BYTES) |
42 | } | 50 | ctrl_outl((v & CACHE_PHYSADDR_MASK), |
51 | CACHE_OC_ADDRESS_ARRAY | (v & 0x00000ff0) | 0x00000008); | ||
43 | } | 52 | } |
44 | 53 | ||
45 | void __flush_invalidate_region(void *start, int size) | 54 | void __flush_invalidate_region(void *start, int size) |
46 | { | 55 | { |
56 | #ifdef CONFIG_CACHE_WRITEBACK | ||
57 | /* | ||
58 | * SH-2 does not support individual line invalidation, only a | ||
59 | * global invalidate. | ||
60 | */ | ||
61 | unsigned long ccr; | ||
62 | unsigned long flags; | ||
63 | local_irq_save(flags); | ||
64 | jump_to_uncached(); | ||
65 | |||
66 | ccr = ctrl_inl(CCR); | ||
67 | ccr |= CCR_CACHE_INVALIDATE; | ||
68 | ctrl_outl(ccr, CCR); | ||
69 | |||
70 | back_to_cached(); | ||
71 | local_irq_restore(flags); | ||
72 | #else | ||
47 | unsigned long v; | 73 | unsigned long v; |
48 | unsigned long begin, end; | 74 | unsigned long begin, end; |
49 | 75 | ||
50 | begin = (unsigned long)start & ~(L1_CACHE_BYTES-1); | 76 | begin = (unsigned long)start & ~(L1_CACHE_BYTES-1); |
51 | end = ((unsigned long)start + size + L1_CACHE_BYTES-1) | 77 | end = ((unsigned long)start + size + L1_CACHE_BYTES-1) |
52 | & ~(L1_CACHE_BYTES-1); | 78 | & ~(L1_CACHE_BYTES-1); |
53 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { | ||
54 | ctrl_outl((v & 0x1ffffc00), (v & 0x00000ff0) | 0x00000008); | ||
55 | } | ||
56 | } | ||
57 | 79 | ||
80 | for (v = begin; v < end; v+=L1_CACHE_BYTES) | ||
81 | ctrl_outl((v & CACHE_PHYSADDR_MASK), | ||
82 | CACHE_OC_ADDRESS_ARRAY | (v & 0x00000ff0) | 0x00000008); | ||
83 | #endif | ||
84 | } | ||
diff --git a/arch/sh/mm/cache-sh2a.c b/arch/sh/mm/cache-sh2a.c new file mode 100644 index 000000000000..62c0c5f35120 --- /dev/null +++ b/arch/sh/mm/cache-sh2a.c | |||
@@ -0,0 +1,129 @@ | |||
1 | /* | ||
2 | * arch/sh/mm/cache-sh2a.c | ||
3 | * | ||
4 | * Copyright (C) 2008 Yoshinori Sato | ||
5 | * | ||
6 | * Released under the terms of the GNU GPL v2.0. | ||
7 | */ | ||
8 | |||
9 | #include <linux/init.h> | ||
10 | #include <linux/mm.h> | ||
11 | |||
12 | #include <asm/cache.h> | ||
13 | #include <asm/addrspace.h> | ||
14 | #include <asm/processor.h> | ||
15 | #include <asm/cacheflush.h> | ||
16 | #include <asm/io.h> | ||
17 | |||
18 | void __flush_wback_region(void *start, int size) | ||
19 | { | ||
20 | unsigned long v; | ||
21 | unsigned long begin, end; | ||
22 | unsigned long flags; | ||
23 | |||
24 | begin = (unsigned long)start & ~(L1_CACHE_BYTES-1); | ||
25 | end = ((unsigned long)start + size + L1_CACHE_BYTES-1) | ||
26 | & ~(L1_CACHE_BYTES-1); | ||
27 | |||
28 | local_irq_save(flags); | ||
29 | jump_to_uncached(); | ||
30 | |||
31 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { | ||
32 | unsigned long addr = CACHE_OC_ADDRESS_ARRAY | (v & 0x000007f0); | ||
33 | int way; | ||
34 | for (way = 0; way < 4; way++) { | ||
35 | unsigned long data = ctrl_inl(addr | (way << 11)); | ||
36 | if ((data & CACHE_PHYSADDR_MASK) == (v & CACHE_PHYSADDR_MASK)) { | ||
37 | data &= ~SH_CACHE_UPDATED; | ||
38 | ctrl_outl(data, addr | (way << 11)); | ||
39 | } | ||
40 | } | ||
41 | } | ||
42 | |||
43 | back_to_cached(); | ||
44 | local_irq_restore(flags); | ||
45 | } | ||
46 | |||
47 | void __flush_purge_region(void *start, int size) | ||
48 | { | ||
49 | unsigned long v; | ||
50 | unsigned long begin, end; | ||
51 | unsigned long flags; | ||
52 | |||
53 | begin = (unsigned long)start & ~(L1_CACHE_BYTES-1); | ||
54 | end = ((unsigned long)start + size + L1_CACHE_BYTES-1) | ||
55 | & ~(L1_CACHE_BYTES-1); | ||
56 | |||
57 | local_irq_save(flags); | ||
58 | jump_to_uncached(); | ||
59 | |||
60 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { | ||
61 | ctrl_outl((v & CACHE_PHYSADDR_MASK), | ||
62 | CACHE_OC_ADDRESS_ARRAY | (v & 0x000003f0) | 0x00000008); | ||
63 | } | ||
64 | back_to_cached(); | ||
65 | local_irq_restore(flags); | ||
66 | } | ||
67 | |||
68 | void __flush_invalidate_region(void *start, int size) | ||
69 | { | ||
70 | unsigned long v; | ||
71 | unsigned long begin, end; | ||
72 | unsigned long flags; | ||
73 | |||
74 | begin = (unsigned long)start & ~(L1_CACHE_BYTES-1); | ||
75 | end = ((unsigned long)start + size + L1_CACHE_BYTES-1) | ||
76 | & ~(L1_CACHE_BYTES-1); | ||
77 | local_irq_save(flags); | ||
78 | jump_to_uncached(); | ||
79 | |||
80 | #ifdef CONFIG_CACHE_WRITEBACK | ||
81 | ctrl_outl(ctrl_inl(CCR) | CCR_OCACHE_INVALIDATE, CCR); | ||
82 | /* I-cache invalidate */ | ||
83 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { | ||
84 | ctrl_outl((v & CACHE_PHYSADDR_MASK), | ||
85 | CACHE_IC_ADDRESS_ARRAY | (v & 0x000003f0) | 0x00000008); | ||
86 | } | ||
87 | #else | ||
88 | for (v = begin; v < end; v+=L1_CACHE_BYTES) { | ||
89 | ctrl_outl((v & CACHE_PHYSADDR_MASK), | ||
90 | CACHE_IC_ADDRESS_ARRAY | (v & 0x000003f0) | 0x00000008); | ||
91 | ctrl_outl((v & CACHE_PHYSADDR_MASK), | ||
92 | CACHE_OC_ADDRESS_ARRAY | (v & 0x000003f0) | 0x00000008); | ||
93 | } | ||
94 | #endif | ||
95 | back_to_cached(); | ||
96 | local_irq_restore(flags); | ||
97 | } | ||
98 | |||
99 | /* WBack O-Cache and flush I-Cache */ | ||
100 | void flush_icache_range(unsigned long start, unsigned long end) | ||
101 | { | ||
102 | unsigned long v; | ||
103 | unsigned long flags; | ||
104 | |||
105 | start = start & ~(L1_CACHE_BYTES-1); | ||
106 | end = (end + L1_CACHE_BYTES-1) & ~(L1_CACHE_BYTES-1); | ||
107 | |||
108 | local_irq_save(flags); | ||
109 | jump_to_uncached(); | ||
110 | |||
111 | for (v = start; v < end; v+=L1_CACHE_BYTES) { | ||
112 | unsigned long addr = (v & 0x000007f0); | ||
113 | int way; | ||
114 | /* O-Cache writeback */ | ||
115 | for (way = 0; way < 4; way++) { | ||
116 | unsigned long data = ctrl_inl(CACHE_OC_ADDRESS_ARRAY | addr | (way << 11)); | ||
117 | if ((data & CACHE_PHYSADDR_MASK) == (v & CACHE_PHYSADDR_MASK)) { | ||
118 | data &= ~SH_CACHE_UPDATED; | ||
119 | ctrl_outl(data, CACHE_OC_ADDRESS_ARRAY | addr | (way << 11)); | ||
120 | } | ||
121 | } | ||
122 | /* I-Cache invalidate */ | ||
123 | ctrl_outl(addr, | ||
124 | CACHE_IC_ADDRESS_ARRAY | addr | 0x00000008); | ||
125 | } | ||
126 | |||
127 | back_to_cached(); | ||
128 | local_irq_restore(flags); | ||
129 | } | ||
diff --git a/arch/sh/mm/tlb-sh5.c b/arch/sh/mm/tlb-sh5.c index f34274a1ded3..dae131243bcc 100644 --- a/arch/sh/mm/tlb-sh5.c +++ b/arch/sh/mm/tlb-sh5.c | |||
@@ -15,9 +15,7 @@ | |||
15 | #include <asm/mmu_context.h> | 15 | #include <asm/mmu_context.h> |
16 | 16 | ||
17 | /** | 17 | /** |
18 | * sh64_tlb_init | 18 | * sh64_tlb_init - Perform initial setup for the DTLB and ITLB. |
19 | * | ||
20 | * Perform initial setup for the DTLB and ITLB. | ||
21 | */ | 19 | */ |
22 | int __init sh64_tlb_init(void) | 20 | int __init sh64_tlb_init(void) |
23 | { | 21 | { |
@@ -46,9 +44,7 @@ int __init sh64_tlb_init(void) | |||
46 | } | 44 | } |
47 | 45 | ||
48 | /** | 46 | /** |
49 | * sh64_next_free_dtlb_entry | 47 | * sh64_next_free_dtlb_entry - Find the next available DTLB entry |
50 | * | ||
51 | * Find the next available DTLB entry | ||
52 | */ | 48 | */ |
53 | unsigned long long sh64_next_free_dtlb_entry(void) | 49 | unsigned long long sh64_next_free_dtlb_entry(void) |
54 | { | 50 | { |
@@ -56,9 +52,7 @@ unsigned long long sh64_next_free_dtlb_entry(void) | |||
56 | } | 52 | } |
57 | 53 | ||
58 | /** | 54 | /** |
59 | * sh64_get_wired_dtlb_entry | 55 | * sh64_get_wired_dtlb_entry - Allocate a wired (locked-in) entry in the DTLB |
60 | * | ||
61 | * Allocate a wired (locked-in) entry in the DTLB | ||
62 | */ | 56 | */ |
63 | unsigned long long sh64_get_wired_dtlb_entry(void) | 57 | unsigned long long sh64_get_wired_dtlb_entry(void) |
64 | { | 58 | { |
@@ -71,12 +65,10 @@ unsigned long long sh64_get_wired_dtlb_entry(void) | |||
71 | } | 65 | } |
72 | 66 | ||
73 | /** | 67 | /** |
74 | * sh64_put_wired_dtlb_entry | 68 | * sh64_put_wired_dtlb_entry - Free a wired (locked-in) entry in the DTLB. |
75 | * | 69 | * |
76 | * @entry: Address of TLB slot. | 70 | * @entry: Address of TLB slot. |
77 | * | 71 | * |
78 | * Free a wired (locked-in) entry in the DTLB. | ||
79 | * | ||
80 | * Works like a stack, last one to allocate must be first one to free. | 72 | * Works like a stack, last one to allocate must be first one to free. |
81 | */ | 73 | */ |
82 | int sh64_put_wired_dtlb_entry(unsigned long long entry) | 74 | int sh64_put_wired_dtlb_entry(unsigned long long entry) |
@@ -115,7 +107,7 @@ int sh64_put_wired_dtlb_entry(unsigned long long entry) | |||
115 | } | 107 | } |
116 | 108 | ||
117 | /** | 109 | /** |
118 | * sh64_setup_tlb_slot | 110 | * sh64_setup_tlb_slot - Load up a translation in a wired slot. |
119 | * | 111 | * |
120 | * @config_addr: Address of TLB slot. | 112 | * @config_addr: Address of TLB slot. |
121 | * @eaddr: Virtual address. | 113 | * @eaddr: Virtual address. |
@@ -154,7 +146,7 @@ inline void sh64_setup_tlb_slot(unsigned long long config_addr, | |||
154 | } | 146 | } |
155 | 147 | ||
156 | /** | 148 | /** |
157 | * sh64_teardown_tlb_slot | 149 | * sh64_teardown_tlb_slot - Teardown a translation. |
158 | * | 150 | * |
159 | * @config_addr: Address of TLB slot. | 151 | * @config_addr: Address of TLB slot. |
160 | * | 152 | * |
diff --git a/arch/sh/tools/Makefile b/arch/sh/tools/Makefile index b5d202be8206..567516b58acc 100644 --- a/arch/sh/tools/Makefile +++ b/arch/sh/tools/Makefile | |||
@@ -10,7 +10,7 @@ | |||
10 | # Shamelessly cloned from ARM. | 10 | # Shamelessly cloned from ARM. |
11 | # | 11 | # |
12 | 12 | ||
13 | arch/sh/include/asm/machtypes.h: $(src)/gen-mach-types $(src)/mach-types | 13 | include/asm-sh/machtypes.h: $(src)/gen-mach-types $(src)/mach-types |
14 | @echo ' Generating $@' | 14 | @echo ' Generating $@' |
15 | $(Q)if [ ! -d arch/sh/include/asm ]; then mkdir -p arch/sh/include/asm; fi | 15 | $(Q)if [ ! -d include/asm-sh ]; then mkdir -p include/asm-sh; fi |
16 | $(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; } | 16 | $(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; } |
diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c index c481673d249c..ba43d85e8dde 100644 --- a/arch/sparc64/kernel/irq.c +++ b/arch/sparc64/kernel/irq.c | |||
@@ -915,12 +915,18 @@ static void __init sun4v_init_mondo_queues(void) | |||
915 | alloc_one_mondo(&tb->nonresum_mondo_pa, tb->nonresum_qmask); | 915 | alloc_one_mondo(&tb->nonresum_mondo_pa, tb->nonresum_qmask); |
916 | alloc_one_kbuf(&tb->nonresum_kernel_buf_pa, | 916 | alloc_one_kbuf(&tb->nonresum_kernel_buf_pa, |
917 | tb->nonresum_qmask); | 917 | tb->nonresum_qmask); |
918 | } | ||
919 | } | ||
920 | |||
921 | static void __init init_send_mondo_info(void) | ||
922 | { | ||
923 | int cpu; | ||
924 | |||
925 | for_each_possible_cpu(cpu) { | ||
926 | struct trap_per_cpu *tb = &trap_block[cpu]; | ||
918 | 927 | ||
919 | init_cpu_send_mondo_info(tb); | 928 | init_cpu_send_mondo_info(tb); |
920 | } | 929 | } |
921 | |||
922 | /* Load up the boot cpu's entries. */ | ||
923 | sun4v_register_mondo_queues(hard_smp_processor_id()); | ||
924 | } | 930 | } |
925 | 931 | ||
926 | static struct irqaction timer_irq_action = { | 932 | static struct irqaction timer_irq_action = { |
@@ -949,6 +955,13 @@ void __init init_IRQ(void) | |||
949 | if (tlb_type == hypervisor) | 955 | if (tlb_type == hypervisor) |
950 | sun4v_init_mondo_queues(); | 956 | sun4v_init_mondo_queues(); |
951 | 957 | ||
958 | init_send_mondo_info(); | ||
959 | |||
960 | if (tlb_type == hypervisor) { | ||
961 | /* Load up the boot cpu's entries. */ | ||
962 | sun4v_register_mondo_queues(hard_smp_processor_id()); | ||
963 | } | ||
964 | |||
952 | /* We need to clear any IRQ's pending in the soft interrupt | 965 | /* We need to clear any IRQ's pending in the soft interrupt |
953 | * registers, a spurious one could be left around from the | 966 | * registers, a spurious one could be left around from the |
954 | * PROM timer which we just disabled. | 967 | * PROM timer which we just disabled. |
diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c index ca5a6ae3a6e2..ec82d76dc6f2 100644 --- a/arch/sparc64/kernel/signal.c +++ b/arch/sparc64/kernel/signal.c | |||
@@ -23,7 +23,6 @@ | |||
23 | #include <linux/tty.h> | 23 | #include <linux/tty.h> |
24 | #include <linux/binfmts.h> | 24 | #include <linux/binfmts.h> |
25 | #include <linux/bitops.h> | 25 | #include <linux/bitops.h> |
26 | #include <linux/tracehook.h> | ||
27 | 26 | ||
28 | #include <asm/uaccess.h> | 27 | #include <asm/uaccess.h> |
29 | #include <asm/ptrace.h> | 28 | #include <asm/ptrace.h> |
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index 340842e51ce1..27b81775a4de 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
@@ -459,27 +459,35 @@ again: | |||
459 | } | 459 | } |
460 | } | 460 | } |
461 | 461 | ||
462 | static inline void spitfire_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask) | 462 | static void spitfire_xcall_deliver(struct trap_per_cpu *tb, int cnt) |
463 | { | 463 | { |
464 | u64 *mondo, data0, data1, data2; | ||
465 | u16 *cpu_list; | ||
464 | u64 pstate; | 466 | u64 pstate; |
465 | int i; | 467 | int i; |
466 | 468 | ||
467 | __asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate)); | 469 | __asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate)); |
468 | for_each_cpu_mask(i, mask) | 470 | cpu_list = __va(tb->cpu_list_pa); |
469 | spitfire_xcall_helper(data0, data1, data2, pstate, i); | 471 | mondo = __va(tb->cpu_mondo_block_pa); |
472 | data0 = mondo[0]; | ||
473 | data1 = mondo[1]; | ||
474 | data2 = mondo[2]; | ||
475 | for (i = 0; i < cnt; i++) | ||
476 | spitfire_xcall_helper(data0, data1, data2, pstate, cpu_list[i]); | ||
470 | } | 477 | } |
471 | 478 | ||
472 | /* Cheetah now allows to send the whole 64-bytes of data in the interrupt | 479 | /* Cheetah now allows to send the whole 64-bytes of data in the interrupt |
473 | * packet, but we have no use for that. However we do take advantage of | 480 | * packet, but we have no use for that. However we do take advantage of |
474 | * the new pipelining feature (ie. dispatch to multiple cpus simultaneously). | 481 | * the new pipelining feature (ie. dispatch to multiple cpus simultaneously). |
475 | */ | 482 | */ |
476 | static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask) | 483 | static void cheetah_xcall_deliver(struct trap_per_cpu *tb, int cnt) |
477 | { | 484 | { |
478 | u64 pstate, ver, busy_mask; | ||
479 | int nack_busy_id, is_jbus, need_more; | 485 | int nack_busy_id, is_jbus, need_more; |
486 | u64 *mondo, pstate, ver, busy_mask; | ||
487 | u16 *cpu_list; | ||
480 | 488 | ||
481 | if (cpus_empty(mask)) | 489 | cpu_list = __va(tb->cpu_list_pa); |
482 | return; | 490 | mondo = __va(tb->cpu_mondo_block_pa); |
483 | 491 | ||
484 | /* Unfortunately, someone at Sun had the brilliant idea to make the | 492 | /* Unfortunately, someone at Sun had the brilliant idea to make the |
485 | * busy/nack fields hard-coded by ITID number for this Ultra-III | 493 | * busy/nack fields hard-coded by ITID number for this Ultra-III |
@@ -502,7 +510,7 @@ retry: | |||
502 | "stxa %2, [%5] %6\n\t" | 510 | "stxa %2, [%5] %6\n\t" |
503 | "membar #Sync\n\t" | 511 | "membar #Sync\n\t" |
504 | : /* no outputs */ | 512 | : /* no outputs */ |
505 | : "r" (data0), "r" (data1), "r" (data2), | 513 | : "r" (mondo[0]), "r" (mondo[1]), "r" (mondo[2]), |
506 | "r" (0x40), "r" (0x50), "r" (0x60), | 514 | "r" (0x40), "r" (0x50), "r" (0x60), |
507 | "i" (ASI_INTR_W)); | 515 | "i" (ASI_INTR_W)); |
508 | 516 | ||
@@ -511,11 +519,16 @@ retry: | |||
511 | { | 519 | { |
512 | int i; | 520 | int i; |
513 | 521 | ||
514 | for_each_cpu_mask(i, mask) { | 522 | for (i = 0; i < cnt; i++) { |
515 | u64 target = (i << 14) | 0x70; | 523 | u64 target, nr; |
524 | |||
525 | nr = cpu_list[i]; | ||
526 | if (nr == 0xffff) | ||
527 | continue; | ||
516 | 528 | ||
529 | target = (nr << 14) | 0x70; | ||
517 | if (is_jbus) { | 530 | if (is_jbus) { |
518 | busy_mask |= (0x1UL << (i * 2)); | 531 | busy_mask |= (0x1UL << (nr * 2)); |
519 | } else { | 532 | } else { |
520 | target |= (nack_busy_id << 24); | 533 | target |= (nack_busy_id << 24); |
521 | busy_mask |= (0x1UL << | 534 | busy_mask |= (0x1UL << |
@@ -549,11 +562,13 @@ retry: | |||
549 | __asm__ __volatile__("wrpr %0, 0x0, %%pstate" | 562 | __asm__ __volatile__("wrpr %0, 0x0, %%pstate" |
550 | : : "r" (pstate)); | 563 | : : "r" (pstate)); |
551 | if (unlikely(need_more)) { | 564 | if (unlikely(need_more)) { |
552 | int i, cnt = 0; | 565 | int i, this_cnt = 0; |
553 | for_each_cpu_mask(i, mask) { | 566 | for (i = 0; i < cnt; i++) { |
554 | cpu_clear(i, mask); | 567 | if (cpu_list[i] == 0xffff) |
555 | cnt++; | 568 | continue; |
556 | if (cnt == 32) | 569 | cpu_list[i] = 0xffff; |
570 | this_cnt++; | ||
571 | if (this_cnt == 32) | ||
557 | break; | 572 | break; |
558 | } | 573 | } |
559 | goto retry; | 574 | goto retry; |
@@ -584,16 +599,20 @@ retry: | |||
584 | /* Clear out the mask bits for cpus which did not | 599 | /* Clear out the mask bits for cpus which did not |
585 | * NACK us. | 600 | * NACK us. |
586 | */ | 601 | */ |
587 | for_each_cpu_mask(i, mask) { | 602 | for (i = 0; i < cnt; i++) { |
588 | u64 check_mask; | 603 | u64 check_mask, nr; |
604 | |||
605 | nr = cpu_list[i]; | ||
606 | if (nr == 0xffff) | ||
607 | continue; | ||
589 | 608 | ||
590 | if (is_jbus) | 609 | if (is_jbus) |
591 | check_mask = (0x2UL << (2*i)); | 610 | check_mask = (0x2UL << (2*nr)); |
592 | else | 611 | else |
593 | check_mask = (0x2UL << | 612 | check_mask = (0x2UL << |
594 | this_busy_nack); | 613 | this_busy_nack); |
595 | if ((dispatch_stat & check_mask) == 0) | 614 | if ((dispatch_stat & check_mask) == 0) |
596 | cpu_clear(i, mask); | 615 | cpu_list[i] = 0xffff; |
597 | this_busy_nack += 2; | 616 | this_busy_nack += 2; |
598 | if (this_busy_nack == 64) | 617 | if (this_busy_nack == 64) |
599 | break; | 618 | break; |
@@ -605,47 +624,17 @@ retry: | |||
605 | } | 624 | } |
606 | 625 | ||
607 | /* Multi-cpu list version. */ | 626 | /* Multi-cpu list version. */ |
608 | static void hypervisor_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask) | 627 | static void hypervisor_xcall_deliver(struct trap_per_cpu *tb, int cnt) |
609 | { | 628 | { |
610 | struct trap_per_cpu *tb; | 629 | int retries, this_cpu, prev_sent, i, saw_cpu_error; |
630 | unsigned long status; | ||
611 | u16 *cpu_list; | 631 | u16 *cpu_list; |
612 | u64 *mondo; | ||
613 | cpumask_t error_mask; | ||
614 | unsigned long flags, status; | ||
615 | int cnt, retries, this_cpu, prev_sent, i; | ||
616 | |||
617 | if (cpus_empty(mask)) | ||
618 | return; | ||
619 | |||
620 | /* We have to do this whole thing with interrupts fully disabled. | ||
621 | * Otherwise if we send an xcall from interrupt context it will | ||
622 | * corrupt both our mondo block and cpu list state. | ||
623 | * | ||
624 | * One consequence of this is that we cannot use timeout mechanisms | ||
625 | * that depend upon interrupts being delivered locally. So, for | ||
626 | * example, we cannot sample jiffies and expect it to advance. | ||
627 | * | ||
628 | * Fortunately, udelay() uses %stick/%tick so we can use that. | ||
629 | */ | ||
630 | local_irq_save(flags); | ||
631 | 632 | ||
632 | this_cpu = smp_processor_id(); | 633 | this_cpu = smp_processor_id(); |
633 | tb = &trap_block[this_cpu]; | ||
634 | |||
635 | mondo = __va(tb->cpu_mondo_block_pa); | ||
636 | mondo[0] = data0; | ||
637 | mondo[1] = data1; | ||
638 | mondo[2] = data2; | ||
639 | wmb(); | ||
640 | 634 | ||
641 | cpu_list = __va(tb->cpu_list_pa); | 635 | cpu_list = __va(tb->cpu_list_pa); |
642 | 636 | ||
643 | /* Setup the initial cpu list. */ | 637 | saw_cpu_error = 0; |
644 | cnt = 0; | ||
645 | for_each_cpu_mask(i, mask) | ||
646 | cpu_list[cnt++] = i; | ||
647 | |||
648 | cpus_clear(error_mask); | ||
649 | retries = 0; | 638 | retries = 0; |
650 | prev_sent = 0; | 639 | prev_sent = 0; |
651 | do { | 640 | do { |
@@ -690,10 +679,9 @@ static void hypervisor_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t | |||
690 | continue; | 679 | continue; |
691 | 680 | ||
692 | err = sun4v_cpu_state(cpu); | 681 | err = sun4v_cpu_state(cpu); |
693 | if (err >= 0 && | 682 | if (err == HV_CPU_STATE_ERROR) { |
694 | err == HV_CPU_STATE_ERROR) { | 683 | saw_cpu_error = (cpu + 1); |
695 | cpu_list[i] = 0xffff; | 684 | cpu_list[i] = 0xffff; |
696 | cpu_set(cpu, error_mask); | ||
697 | } | 685 | } |
698 | } | 686 | } |
699 | } else if (unlikely(status != HV_EWOULDBLOCK)) | 687 | } else if (unlikely(status != HV_EWOULDBLOCK)) |
@@ -717,32 +705,24 @@ static void hypervisor_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t | |||
717 | } | 705 | } |
718 | } while (1); | 706 | } while (1); |
719 | 707 | ||
720 | local_irq_restore(flags); | 708 | if (unlikely(saw_cpu_error)) |
721 | |||
722 | if (unlikely(!cpus_empty(error_mask))) | ||
723 | goto fatal_mondo_cpu_error; | 709 | goto fatal_mondo_cpu_error; |
724 | 710 | ||
725 | return; | 711 | return; |
726 | 712 | ||
727 | fatal_mondo_cpu_error: | 713 | fatal_mondo_cpu_error: |
728 | printk(KERN_CRIT "CPU[%d]: SUN4V mondo cpu error, some target cpus " | 714 | printk(KERN_CRIT "CPU[%d]: SUN4V mondo cpu error, some target cpus " |
729 | "were in error state\n", | 715 | "(including %d) were in error state\n", |
730 | this_cpu); | 716 | this_cpu, saw_cpu_error - 1); |
731 | printk(KERN_CRIT "CPU[%d]: Error mask [ ", this_cpu); | ||
732 | for_each_cpu_mask(i, error_mask) | ||
733 | printk("%d ", i); | ||
734 | printk("]\n"); | ||
735 | return; | 717 | return; |
736 | 718 | ||
737 | fatal_mondo_timeout: | 719 | fatal_mondo_timeout: |
738 | local_irq_restore(flags); | ||
739 | printk(KERN_CRIT "CPU[%d]: SUN4V mondo timeout, no forward " | 720 | printk(KERN_CRIT "CPU[%d]: SUN4V mondo timeout, no forward " |
740 | " progress after %d retries.\n", | 721 | " progress after %d retries.\n", |
741 | this_cpu, retries); | 722 | this_cpu, retries); |
742 | goto dump_cpu_list_and_out; | 723 | goto dump_cpu_list_and_out; |
743 | 724 | ||
744 | fatal_mondo_error: | 725 | fatal_mondo_error: |
745 | local_irq_restore(flags); | ||
746 | printk(KERN_CRIT "CPU[%d]: Unexpected SUN4V mondo error %lu\n", | 726 | printk(KERN_CRIT "CPU[%d]: Unexpected SUN4V mondo error %lu\n", |
747 | this_cpu, status); | 727 | this_cpu, status); |
748 | printk(KERN_CRIT "CPU[%d]: Args were cnt(%d) cpulist_pa(%lx) " | 728 | printk(KERN_CRIT "CPU[%d]: Args were cnt(%d) cpulist_pa(%lx) " |
@@ -756,58 +736,93 @@ dump_cpu_list_and_out: | |||
756 | printk("]\n"); | 736 | printk("]\n"); |
757 | } | 737 | } |
758 | 738 | ||
759 | /* Send cross call to all processors mentioned in MASK | 739 | static void (*xcall_deliver_impl)(struct trap_per_cpu *, int); |
760 | * except self. | 740 | |
741 | static void xcall_deliver(u64 data0, u64 data1, u64 data2, const cpumask_t *mask) | ||
742 | { | ||
743 | struct trap_per_cpu *tb; | ||
744 | int this_cpu, i, cnt; | ||
745 | unsigned long flags; | ||
746 | u16 *cpu_list; | ||
747 | u64 *mondo; | ||
748 | |||
749 | /* We have to do this whole thing with interrupts fully disabled. | ||
750 | * Otherwise if we send an xcall from interrupt context it will | ||
751 | * corrupt both our mondo block and cpu list state. | ||
752 | * | ||
753 | * One consequence of this is that we cannot use timeout mechanisms | ||
754 | * that depend upon interrupts being delivered locally. So, for | ||
755 | * example, we cannot sample jiffies and expect it to advance. | ||
756 | * | ||
757 | * Fortunately, udelay() uses %stick/%tick so we can use that. | ||
758 | */ | ||
759 | local_irq_save(flags); | ||
760 | |||
761 | this_cpu = smp_processor_id(); | ||
762 | tb = &trap_block[this_cpu]; | ||
763 | |||
764 | mondo = __va(tb->cpu_mondo_block_pa); | ||
765 | mondo[0] = data0; | ||
766 | mondo[1] = data1; | ||
767 | mondo[2] = data2; | ||
768 | wmb(); | ||
769 | |||
770 | cpu_list = __va(tb->cpu_list_pa); | ||
771 | |||
772 | /* Setup the initial cpu list. */ | ||
773 | cnt = 0; | ||
774 | for_each_cpu_mask_nr(i, *mask) { | ||
775 | if (i == this_cpu || !cpu_online(i)) | ||
776 | continue; | ||
777 | cpu_list[cnt++] = i; | ||
778 | } | ||
779 | |||
780 | if (cnt) | ||
781 | xcall_deliver_impl(tb, cnt); | ||
782 | |||
783 | local_irq_restore(flags); | ||
784 | } | ||
785 | |||
786 | /* Send cross call to all processors mentioned in MASK_P | ||
787 | * except self. Really, there are only two cases currently, | ||
788 | * "&cpu_online_map" and "&mm->cpu_vm_mask". | ||
761 | */ | 789 | */ |
762 | static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 data2, cpumask_t mask) | 790 | static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 data2, const cpumask_t *mask) |
763 | { | 791 | { |
764 | u64 data0 = (((u64)ctx)<<32 | (((u64)func) & 0xffffffff)); | 792 | u64 data0 = (((u64)ctx)<<32 | (((u64)func) & 0xffffffff)); |
765 | int this_cpu = get_cpu(); | ||
766 | 793 | ||
767 | cpus_and(mask, mask, cpu_online_map); | 794 | xcall_deliver(data0, data1, data2, mask); |
768 | cpu_clear(this_cpu, mask); | 795 | } |
769 | |||
770 | if (tlb_type == spitfire) | ||
771 | spitfire_xcall_deliver(data0, data1, data2, mask); | ||
772 | else if (tlb_type == cheetah || tlb_type == cheetah_plus) | ||
773 | cheetah_xcall_deliver(data0, data1, data2, mask); | ||
774 | else | ||
775 | hypervisor_xcall_deliver(data0, data1, data2, mask); | ||
776 | /* NOTE: Caller runs local copy on master. */ | ||
777 | 796 | ||
778 | put_cpu(); | 797 | /* Send cross call to all processors except self. */ |
798 | static void smp_cross_call(unsigned long *func, u32 ctx, u64 data1, u64 data2) | ||
799 | { | ||
800 | smp_cross_call_masked(func, ctx, data1, data2, &cpu_online_map); | ||
779 | } | 801 | } |
780 | 802 | ||
781 | extern unsigned long xcall_sync_tick; | 803 | extern unsigned long xcall_sync_tick; |
782 | 804 | ||
783 | static void smp_start_sync_tick_client(int cpu) | 805 | static void smp_start_sync_tick_client(int cpu) |
784 | { | 806 | { |
785 | cpumask_t mask = cpumask_of_cpu(cpu); | 807 | xcall_deliver((u64) &xcall_sync_tick, 0, 0, |
786 | 808 | &cpumask_of_cpu(cpu)); | |
787 | smp_cross_call_masked(&xcall_sync_tick, | ||
788 | 0, 0, 0, mask); | ||
789 | } | 809 | } |
790 | 810 | ||
791 | extern unsigned long xcall_call_function; | 811 | extern unsigned long xcall_call_function; |
792 | 812 | ||
793 | void arch_send_call_function_ipi(cpumask_t mask) | 813 | void arch_send_call_function_ipi(cpumask_t mask) |
794 | { | 814 | { |
795 | smp_cross_call_masked(&xcall_call_function, 0, 0, 0, mask); | 815 | xcall_deliver((u64) &xcall_call_function, 0, 0, &mask); |
796 | } | 816 | } |
797 | 817 | ||
798 | extern unsigned long xcall_call_function_single; | 818 | extern unsigned long xcall_call_function_single; |
799 | 819 | ||
800 | void arch_send_call_function_single_ipi(int cpu) | 820 | void arch_send_call_function_single_ipi(int cpu) |
801 | { | 821 | { |
802 | cpumask_t mask = cpumask_of_cpu(cpu); | 822 | xcall_deliver((u64) &xcall_call_function_single, 0, 0, |
803 | 823 | &cpumask_of_cpu(cpu)); | |
804 | smp_cross_call_masked(&xcall_call_function_single, 0, 0, 0, mask); | ||
805 | } | 824 | } |
806 | 825 | ||
807 | /* Send cross call to all processors except self. */ | ||
808 | #define smp_cross_call(func, ctx, data1, data2) \ | ||
809 | smp_cross_call_masked(func, ctx, data1, data2, cpu_online_map) | ||
810 | |||
811 | void smp_call_function_client(int irq, struct pt_regs *regs) | 826 | void smp_call_function_client(int irq, struct pt_regs *regs) |
812 | { | 827 | { |
813 | clear_softint(1 << irq); | 828 | clear_softint(1 << irq); |
@@ -877,7 +892,6 @@ static inline void __local_flush_dcache_page(struct page *page) | |||
877 | 892 | ||
878 | void smp_flush_dcache_page_impl(struct page *page, int cpu) | 893 | void smp_flush_dcache_page_impl(struct page *page, int cpu) |
879 | { | 894 | { |
880 | cpumask_t mask = cpumask_of_cpu(cpu); | ||
881 | int this_cpu; | 895 | int this_cpu; |
882 | 896 | ||
883 | if (tlb_type == hypervisor) | 897 | if (tlb_type == hypervisor) |
@@ -893,29 +907,24 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu) | |||
893 | __local_flush_dcache_page(page); | 907 | __local_flush_dcache_page(page); |
894 | } else if (cpu_online(cpu)) { | 908 | } else if (cpu_online(cpu)) { |
895 | void *pg_addr = page_address(page); | 909 | void *pg_addr = page_address(page); |
896 | u64 data0; | 910 | u64 data0 = 0; |
897 | 911 | ||
898 | if (tlb_type == spitfire) { | 912 | if (tlb_type == spitfire) { |
899 | data0 = | 913 | data0 = ((u64)&xcall_flush_dcache_page_spitfire); |
900 | ((u64)&xcall_flush_dcache_page_spitfire); | ||
901 | if (page_mapping(page) != NULL) | 914 | if (page_mapping(page) != NULL) |
902 | data0 |= ((u64)1 << 32); | 915 | data0 |= ((u64)1 << 32); |
903 | spitfire_xcall_deliver(data0, | ||
904 | __pa(pg_addr), | ||
905 | (u64) pg_addr, | ||
906 | mask); | ||
907 | } else if (tlb_type == cheetah || tlb_type == cheetah_plus) { | 916 | } else if (tlb_type == cheetah || tlb_type == cheetah_plus) { |
908 | #ifdef DCACHE_ALIASING_POSSIBLE | 917 | #ifdef DCACHE_ALIASING_POSSIBLE |
909 | data0 = | 918 | data0 = ((u64)&xcall_flush_dcache_page_cheetah); |
910 | ((u64)&xcall_flush_dcache_page_cheetah); | ||
911 | cheetah_xcall_deliver(data0, | ||
912 | __pa(pg_addr), | ||
913 | 0, mask); | ||
914 | #endif | 919 | #endif |
915 | } | 920 | } |
921 | if (data0) { | ||
922 | xcall_deliver(data0, __pa(pg_addr), | ||
923 | (u64) pg_addr, &cpumask_of_cpu(cpu)); | ||
916 | #ifdef CONFIG_DEBUG_DCFLUSH | 924 | #ifdef CONFIG_DEBUG_DCFLUSH |
917 | atomic_inc(&dcpage_flushes_xcall); | 925 | atomic_inc(&dcpage_flushes_xcall); |
918 | #endif | 926 | #endif |
927 | } | ||
919 | } | 928 | } |
920 | 929 | ||
921 | put_cpu(); | 930 | put_cpu(); |
@@ -923,66 +932,41 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu) | |||
923 | 932 | ||
924 | void flush_dcache_page_all(struct mm_struct *mm, struct page *page) | 933 | void flush_dcache_page_all(struct mm_struct *mm, struct page *page) |
925 | { | 934 | { |
926 | void *pg_addr = page_address(page); | 935 | void *pg_addr; |
927 | cpumask_t mask = cpu_online_map; | ||
928 | u64 data0; | ||
929 | int this_cpu; | 936 | int this_cpu; |
937 | u64 data0; | ||
930 | 938 | ||
931 | if (tlb_type == hypervisor) | 939 | if (tlb_type == hypervisor) |
932 | return; | 940 | return; |
933 | 941 | ||
934 | this_cpu = get_cpu(); | 942 | this_cpu = get_cpu(); |
935 | 943 | ||
936 | cpu_clear(this_cpu, mask); | ||
937 | |||
938 | #ifdef CONFIG_DEBUG_DCFLUSH | 944 | #ifdef CONFIG_DEBUG_DCFLUSH |
939 | atomic_inc(&dcpage_flushes); | 945 | atomic_inc(&dcpage_flushes); |
940 | #endif | 946 | #endif |
941 | if (cpus_empty(mask)) | 947 | data0 = 0; |
942 | goto flush_self; | 948 | pg_addr = page_address(page); |
943 | if (tlb_type == spitfire) { | 949 | if (tlb_type == spitfire) { |
944 | data0 = ((u64)&xcall_flush_dcache_page_spitfire); | 950 | data0 = ((u64)&xcall_flush_dcache_page_spitfire); |
945 | if (page_mapping(page) != NULL) | 951 | if (page_mapping(page) != NULL) |
946 | data0 |= ((u64)1 << 32); | 952 | data0 |= ((u64)1 << 32); |
947 | spitfire_xcall_deliver(data0, | ||
948 | __pa(pg_addr), | ||
949 | (u64) pg_addr, | ||
950 | mask); | ||
951 | } else if (tlb_type == cheetah || tlb_type == cheetah_plus) { | 953 | } else if (tlb_type == cheetah || tlb_type == cheetah_plus) { |
952 | #ifdef DCACHE_ALIASING_POSSIBLE | 954 | #ifdef DCACHE_ALIASING_POSSIBLE |
953 | data0 = ((u64)&xcall_flush_dcache_page_cheetah); | 955 | data0 = ((u64)&xcall_flush_dcache_page_cheetah); |
954 | cheetah_xcall_deliver(data0, | ||
955 | __pa(pg_addr), | ||
956 | 0, mask); | ||
957 | #endif | 956 | #endif |
958 | } | 957 | } |
958 | if (data0) { | ||
959 | xcall_deliver(data0, __pa(pg_addr), | ||
960 | (u64) pg_addr, &cpu_online_map); | ||
959 | #ifdef CONFIG_DEBUG_DCFLUSH | 961 | #ifdef CONFIG_DEBUG_DCFLUSH |
960 | atomic_inc(&dcpage_flushes_xcall); | 962 | atomic_inc(&dcpage_flushes_xcall); |
961 | #endif | 963 | #endif |
962 | flush_self: | 964 | } |
963 | __local_flush_dcache_page(page); | 965 | __local_flush_dcache_page(page); |
964 | 966 | ||
965 | put_cpu(); | 967 | put_cpu(); |
966 | } | 968 | } |
967 | 969 | ||
968 | static void __smp_receive_signal_mask(cpumask_t mask) | ||
969 | { | ||
970 | smp_cross_call_masked(&xcall_receive_signal, 0, 0, 0, mask); | ||
971 | } | ||
972 | |||
973 | void smp_receive_signal(int cpu) | ||
974 | { | ||
975 | cpumask_t mask = cpumask_of_cpu(cpu); | ||
976 | |||
977 | if (cpu_online(cpu)) | ||
978 | __smp_receive_signal_mask(mask); | ||
979 | } | ||
980 | |||
981 | void smp_receive_signal_client(int irq, struct pt_regs *regs) | ||
982 | { | ||
983 | clear_softint(1 << irq); | ||
984 | } | ||
985 | |||
986 | void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs) | 970 | void smp_new_mmu_context_version_client(int irq, struct pt_regs *regs) |
987 | { | 971 | { |
988 | struct mm_struct *mm; | 972 | struct mm_struct *mm; |
@@ -1083,7 +1067,7 @@ void smp_flush_tlb_mm(struct mm_struct *mm) | |||
1083 | 1067 | ||
1084 | smp_cross_call_masked(&xcall_flush_tlb_mm, | 1068 | smp_cross_call_masked(&xcall_flush_tlb_mm, |
1085 | ctx, 0, 0, | 1069 | ctx, 0, 0, |
1086 | mm->cpu_vm_mask); | 1070 | &mm->cpu_vm_mask); |
1087 | 1071 | ||
1088 | local_flush_and_out: | 1072 | local_flush_and_out: |
1089 | __flush_tlb_mm(ctx, SECONDARY_CONTEXT); | 1073 | __flush_tlb_mm(ctx, SECONDARY_CONTEXT); |
@@ -1101,7 +1085,7 @@ void smp_flush_tlb_pending(struct mm_struct *mm, unsigned long nr, unsigned long | |||
1101 | else | 1085 | else |
1102 | smp_cross_call_masked(&xcall_flush_tlb_pending, | 1086 | smp_cross_call_masked(&xcall_flush_tlb_pending, |
1103 | ctx, nr, (unsigned long) vaddrs, | 1087 | ctx, nr, (unsigned long) vaddrs, |
1104 | mm->cpu_vm_mask); | 1088 | &mm->cpu_vm_mask); |
1105 | 1089 | ||
1106 | __flush_tlb_pending(ctx, nr, vaddrs); | 1090 | __flush_tlb_pending(ctx, nr, vaddrs); |
1107 | 1091 | ||
@@ -1202,6 +1186,16 @@ void __devinit smp_prepare_boot_cpu(void) | |||
1202 | { | 1186 | { |
1203 | } | 1187 | } |
1204 | 1188 | ||
1189 | void __init smp_setup_processor_id(void) | ||
1190 | { | ||
1191 | if (tlb_type == spitfire) | ||
1192 | xcall_deliver_impl = spitfire_xcall_deliver; | ||
1193 | else if (tlb_type == cheetah || tlb_type == cheetah_plus) | ||
1194 | xcall_deliver_impl = cheetah_xcall_deliver; | ||
1195 | else | ||
1196 | xcall_deliver_impl = hypervisor_xcall_deliver; | ||
1197 | } | ||
1198 | |||
1205 | void __devinit smp_fill_in_sib_core_maps(void) | 1199 | void __devinit smp_fill_in_sib_core_maps(void) |
1206 | { | 1200 | { |
1207 | unsigned int i; | 1201 | unsigned int i; |
@@ -1370,7 +1364,13 @@ void __init smp_cpus_done(unsigned int max_cpus) | |||
1370 | 1364 | ||
1371 | void smp_send_reschedule(int cpu) | 1365 | void smp_send_reschedule(int cpu) |
1372 | { | 1366 | { |
1373 | smp_receive_signal(cpu); | 1367 | xcall_deliver((u64) &xcall_receive_signal, 0, 0, |
1368 | &cpumask_of_cpu(cpu)); | ||
1369 | } | ||
1370 | |||
1371 | void smp_receive_signal_client(int irq, struct pt_regs *regs) | ||
1372 | { | ||
1373 | clear_softint(1 << irq); | ||
1374 | } | 1374 | } |
1375 | 1375 | ||
1376 | /* This is a nop because we capture all other cpus | 1376 | /* This is a nop because we capture all other cpus |
diff --git a/arch/sparc64/mm/tsb.c b/arch/sparc64/mm/tsb.c index 3547937b17a2..587f8efb2e05 100644 --- a/arch/sparc64/mm/tsb.c +++ b/arch/sparc64/mm/tsb.c | |||
@@ -1,9 +1,10 @@ | |||
1 | /* arch/sparc64/mm/tsb.c | 1 | /* arch/sparc64/mm/tsb.c |
2 | * | 2 | * |
3 | * Copyright (C) 2006 David S. Miller <davem@davemloft.net> | 3 | * Copyright (C) 2006, 2008 David S. Miller <davem@davemloft.net> |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <linux/kernel.h> | 6 | #include <linux/kernel.h> |
7 | #include <linux/preempt.h> | ||
7 | #include <asm/system.h> | 8 | #include <asm/system.h> |
8 | #include <asm/page.h> | 9 | #include <asm/page.h> |
9 | #include <asm/tlbflush.h> | 10 | #include <asm/tlbflush.h> |
@@ -415,7 +416,9 @@ retry_tsb_alloc: | |||
415 | tsb_context_switch(mm); | 416 | tsb_context_switch(mm); |
416 | 417 | ||
417 | /* Now force other processors to do the same. */ | 418 | /* Now force other processors to do the same. */ |
419 | preempt_disable(); | ||
418 | smp_tsb_sync(mm); | 420 | smp_tsb_sync(mm); |
421 | preempt_enable(); | ||
419 | 422 | ||
420 | /* Now it is safe to free the old tsb. */ | 423 | /* Now it is safe to free the old tsb. */ |
421 | kmem_cache_free(tsb_caches[old_cache_index], old_tsb); | 424 | kmem_cache_free(tsb_caches[old_cache_index], old_tsb); |
diff --git a/arch/xtensa/kernel/xtensa_ksyms.c b/arch/xtensa/kernel/xtensa_ksyms.c index 6e52cdd6166f..c9a7c5b74a0d 100644 --- a/arch/xtensa/kernel/xtensa_ksyms.c +++ b/arch/xtensa/kernel/xtensa_ksyms.c | |||
@@ -18,7 +18,6 @@ | |||
18 | #include <linux/interrupt.h> | 18 | #include <linux/interrupt.h> |
19 | #include <asm/irq.h> | 19 | #include <asm/irq.h> |
20 | #include <linux/in6.h> | 20 | #include <linux/in6.h> |
21 | #include <linux/ide.h> | ||
22 | 21 | ||
23 | #include <asm/uaccess.h> | 22 | #include <asm/uaccess.h> |
24 | #include <asm/checksum.h> | 23 | #include <asm/checksum.h> |
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index c5b9bcfc0a6d..12a5182173f6 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c | |||
@@ -518,7 +518,7 @@ int scsi_cmd_ioctl(struct file *file, struct request_queue *q, | |||
518 | hdr.sbp = cgc.sense; | 518 | hdr.sbp = cgc.sense; |
519 | if (hdr.sbp) | 519 | if (hdr.sbp) |
520 | hdr.mx_sb_len = sizeof(struct request_sense); | 520 | hdr.mx_sb_len = sizeof(struct request_sense); |
521 | hdr.timeout = cgc.timeout; | 521 | hdr.timeout = jiffies_to_msecs(cgc.timeout); |
522 | hdr.cmdp = ((struct cdrom_generic_command __user*) arg)->cmd; | 522 | hdr.cmdp = ((struct cdrom_generic_command __user*) arg)->cmd; |
523 | hdr.cmd_len = sizeof(cgc.cmd); | 523 | hdr.cmd_len = sizeof(cgc.cmd); |
524 | 524 | ||
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index d81632cd7d06..0ce0c279aabf 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -1292,8 +1292,6 @@ static void cciss_check_queues(ctlr_info_t *h) | |||
1292 | h->next_to_run = curr_queue; | 1292 | h->next_to_run = curr_queue; |
1293 | break; | 1293 | break; |
1294 | } | 1294 | } |
1295 | } else { | ||
1296 | curr_queue = (curr_queue + 1) % (h->highest_lun + 1); | ||
1297 | } | 1295 | } |
1298 | } | 1296 | } |
1299 | } | 1297 | } |
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index a5da35632651..d9d1b65d206c 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c | |||
@@ -1436,10 +1436,6 @@ static void cdrom_count_tracks(struct cdrom_device_info *cdi, tracktype* tracks) | |||
1436 | tracks->xa=0; | 1436 | tracks->xa=0; |
1437 | tracks->error=0; | 1437 | tracks->error=0; |
1438 | cdinfo(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n"); | 1438 | cdinfo(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n"); |
1439 | if (!CDROM_CAN(CDC_PLAY_AUDIO)) { | ||
1440 | tracks->error=CDS_NO_INFO; | ||
1441 | return; | ||
1442 | } | ||
1443 | /* Grab the TOC header so we can see how many tracks there are */ | 1439 | /* Grab the TOC header so we can see how many tracks there are */ |
1444 | if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header))) { | 1440 | if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header))) { |
1445 | if (ret == -ENOMEDIUM) | 1441 | if (ret == -ENOMEDIUM) |
diff --git a/drivers/char/efirtc.c b/drivers/char/efirtc.c index 67fbd7aab5db..34d15d548236 100644 --- a/drivers/char/efirtc.c +++ b/drivers/char/efirtc.c | |||
@@ -37,7 +37,6 @@ | |||
37 | #include <linux/rtc.h> | 37 | #include <linux/rtc.h> |
38 | #include <linux/proc_fs.h> | 38 | #include <linux/proc_fs.h> |
39 | #include <linux/efi.h> | 39 | #include <linux/efi.h> |
40 | #include <linux/smp_lock.h> | ||
41 | #include <linux/uaccess.h> | 40 | #include <linux/uaccess.h> |
42 | 41 | ||
43 | #include <asm/system.h> | 42 | #include <asm/system.h> |
diff --git a/drivers/char/hvc_console.h b/drivers/char/hvc_console.h index d9ce10915625..9790201718ae 100644 --- a/drivers/char/hvc_console.h +++ b/drivers/char/hvc_console.h | |||
@@ -6,7 +6,7 @@ | |||
6 | * Ryan S. Arnold <rsa@us.ibm.com> | 6 | * Ryan S. Arnold <rsa@us.ibm.com> |
7 | * | 7 | * |
8 | * hvc_console header information: | 8 | * hvc_console header information: |
9 | * moved here from include/asm-powerpc/hvconsole.h | 9 | * moved here from arch/powerpc/include/asm/hvconsole.h |
10 | * and drivers/char/hvc_console.c | 10 | * and drivers/char/hvc_console.c |
11 | * | 11 | * |
12 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
diff --git a/drivers/char/hvcs.c b/drivers/char/hvcs.c index 786d518e9477..473d9b14439a 100644 --- a/drivers/char/hvcs.c +++ b/drivers/char/hvcs.c | |||
@@ -114,7 +114,7 @@ | |||
114 | * the hvcs_final_close() function in order to get it out of the spinlock. | 114 | * the hvcs_final_close() function in order to get it out of the spinlock. |
115 | * Rearranged hvcs_close(). Cleaned up some printks and did some housekeeping | 115 | * Rearranged hvcs_close(). Cleaned up some printks and did some housekeeping |
116 | * on the changelog. Removed local CLC_LENGTH and used HVCS_CLC_LENGTH from | 116 | * on the changelog. Removed local CLC_LENGTH and used HVCS_CLC_LENGTH from |
117 | * include/asm-powerpc/hvcserver.h | 117 | * arch/powerepc/include/asm/hvcserver.h |
118 | * | 118 | * |
119 | * 1.3.2 -> 1.3.3 Replaced yield() in hvcs_close() with tty_wait_until_sent() to | 119 | * 1.3.2 -> 1.3.3 Replaced yield() in hvcs_close() with tty_wait_until_sent() to |
120 | * prevent possible lockup with realtime scheduling as similarily pointed out by | 120 | * prevent possible lockup with realtime scheduling as similarily pointed out by |
diff --git a/drivers/char/viocons.c b/drivers/char/viocons.c index 65fb848e1cce..f48892ba12f5 100644 --- a/drivers/char/viocons.c +++ b/drivers/char/viocons.c | |||
@@ -705,10 +705,6 @@ static int viotty_ioctl(struct tty_struct *tty, struct file *file, | |||
705 | case KDSKBLED: | 705 | case KDSKBLED: |
706 | return 0; | 706 | return 0; |
707 | } | 707 | } |
708 | /* FIXME: WTF is this being called for ??? */ | ||
709 | lock_kernel(); | ||
710 | ret = n_tty_ioctl(tty, file, cmd, arg); | ||
711 | unlock_kernel(); | ||
712 | return ret; | 708 | return ret; |
713 | } | 709 | } |
714 | 710 | ||
diff --git a/drivers/char/vt.c b/drivers/char/vt.c index 82a51f38a546..1bc00c9d860d 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c | |||
@@ -916,7 +916,6 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | |||
916 | ws.ws_col = vc->vc_cols; | 916 | ws.ws_col = vc->vc_cols; |
917 | ws.ws_ypixel = vc->vc_scan_lines; | 917 | ws.ws_ypixel = vc->vc_scan_lines; |
918 | 918 | ||
919 | mutex_lock(&vc->vc_tty->termios_mutex); | ||
920 | spin_lock_irq(&vc->vc_tty->ctrl_lock); | 919 | spin_lock_irq(&vc->vc_tty->ctrl_lock); |
921 | if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col)) | 920 | if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col)) |
922 | pgrp = get_pid(vc->vc_tty->pgrp); | 921 | pgrp = get_pid(vc->vc_tty->pgrp); |
@@ -926,7 +925,6 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | |||
926 | put_pid(pgrp); | 925 | put_pid(pgrp); |
927 | } | 926 | } |
928 | *cws = ws; | 927 | *cws = ws; |
929 | mutex_unlock(&vc->vc_tty->termios_mutex); | ||
930 | } | 928 | } |
931 | 929 | ||
932 | if (CON_IS_VISIBLE(vc)) | 930 | if (CON_IS_VISIBLE(vc)) |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 130ef64b44f7..a34758d29516 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -54,16 +54,6 @@ menuconfig IDE | |||
54 | 54 | ||
55 | if IDE | 55 | if IDE |
56 | 56 | ||
57 | config IDE_MAX_HWIFS | ||
58 | int "Max IDE interfaces" | ||
59 | depends on ALPHA || SUPERH || IA64 || EMBEDDED | ||
60 | range 1 10 | ||
61 | default 4 | ||
62 | help | ||
63 | This is the maximum number of IDE hardware interfaces that will | ||
64 | be supported by the driver. Make sure it is at least as high as | ||
65 | the number of IDE interfaces in your system. | ||
66 | |||
67 | config BLK_DEV_IDE | 57 | config BLK_DEV_IDE |
68 | tristate "Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support" | 58 | tristate "Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support" |
69 | ---help--- | 59 | ---help--- |
diff --git a/drivers/ide/arm/palm_bk3710.c b/drivers/ide/arm/palm_bk3710.c index 3e842d60eae9..f788fa5a977b 100644 --- a/drivers/ide/arm/palm_bk3710.c +++ b/drivers/ide/arm/palm_bk3710.c | |||
@@ -309,7 +309,7 @@ static void __devinit palm_bk3710_chipinit(void __iomem *base) | |||
309 | palm_bk3710_setpiomode(base, NULL, 1, 600, 0); | 309 | palm_bk3710_setpiomode(base, NULL, 1, 600, 0); |
310 | } | 310 | } |
311 | 311 | ||
312 | static u8 __devinit palm_bk3710_cable_detect(ide_hwif_t *hwif) | 312 | static u8 palm_bk3710_cable_detect(ide_hwif_t *hwif) |
313 | { | 313 | { |
314 | return ATA_CBL_PATA80; | 314 | return ATA_CBL_PATA80; |
315 | } | 315 | } |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index e617cf08aef6..89a112d513ad 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -66,11 +66,11 @@ static struct cdrom_info *ide_cd_get(struct gendisk *disk) | |||
66 | mutex_lock(&idecd_ref_mutex); | 66 | mutex_lock(&idecd_ref_mutex); |
67 | cd = ide_cd_g(disk); | 67 | cd = ide_cd_g(disk); |
68 | if (cd) { | 68 | if (cd) { |
69 | kref_get(&cd->kref); | 69 | if (ide_device_get(cd->drive)) |
70 | if (ide_device_get(cd->drive)) { | ||
71 | kref_put(&cd->kref, ide_cd_release); | ||
72 | cd = NULL; | 70 | cd = NULL; |
73 | } | 71 | else |
72 | kref_get(&cd->kref); | ||
73 | |||
74 | } | 74 | } |
75 | mutex_unlock(&idecd_ref_mutex); | 75 | mutex_unlock(&idecd_ref_mutex); |
76 | return cd; | 76 | return cd; |
@@ -78,9 +78,11 @@ static struct cdrom_info *ide_cd_get(struct gendisk *disk) | |||
78 | 78 | ||
79 | static void ide_cd_put(struct cdrom_info *cd) | 79 | static void ide_cd_put(struct cdrom_info *cd) |
80 | { | 80 | { |
81 | ide_drive_t *drive = cd->drive; | ||
82 | |||
81 | mutex_lock(&idecd_ref_mutex); | 83 | mutex_lock(&idecd_ref_mutex); |
82 | ide_device_put(cd->drive); | ||
83 | kref_put(&cd->kref, ide_cd_release); | 84 | kref_put(&cd->kref, ide_cd_release); |
85 | ide_device_put(drive); | ||
84 | mutex_unlock(&idecd_ref_mutex); | 86 | mutex_unlock(&idecd_ref_mutex); |
85 | } | 87 | } |
86 | 88 | ||
@@ -1305,6 +1307,7 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, | |||
1305 | int stat; | 1307 | int stat; |
1306 | unsigned char cmd[BLK_MAX_CDB]; | 1308 | unsigned char cmd[BLK_MAX_CDB]; |
1307 | unsigned len = sizeof(capbuf); | 1309 | unsigned len = sizeof(capbuf); |
1310 | u32 blocklen; | ||
1308 | 1311 | ||
1309 | memset(cmd, 0, BLK_MAX_CDB); | 1312 | memset(cmd, 0, BLK_MAX_CDB); |
1310 | cmd[0] = GPCMD_READ_CDVD_CAPACITY; | 1313 | cmd[0] = GPCMD_READ_CDVD_CAPACITY; |
@@ -1317,23 +1320,24 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, | |||
1317 | /* | 1320 | /* |
1318 | * Sanity check the given block size | 1321 | * Sanity check the given block size |
1319 | */ | 1322 | */ |
1320 | switch (capbuf.blocklen) { | 1323 | blocklen = be32_to_cpu(capbuf.blocklen); |
1321 | case __constant_cpu_to_be32(512): | 1324 | switch (blocklen) { |
1322 | case __constant_cpu_to_be32(1024): | 1325 | case 512: |
1323 | case __constant_cpu_to_be32(2048): | 1326 | case 1024: |
1324 | case __constant_cpu_to_be32(4096): | 1327 | case 2048: |
1328 | case 4096: | ||
1325 | break; | 1329 | break; |
1326 | default: | 1330 | default: |
1327 | printk(KERN_ERR "%s: weird block size %u\n", | 1331 | printk(KERN_ERR "%s: weird block size %u\n", |
1328 | drive->name, capbuf.blocklen); | 1332 | drive->name, blocklen); |
1329 | printk(KERN_ERR "%s: default to 2kb block size\n", | 1333 | printk(KERN_ERR "%s: default to 2kb block size\n", |
1330 | drive->name); | 1334 | drive->name); |
1331 | capbuf.blocklen = __constant_cpu_to_be32(2048); | 1335 | blocklen = 2048; |
1332 | break; | 1336 | break; |
1333 | } | 1337 | } |
1334 | 1338 | ||
1335 | *capacity = 1 + be32_to_cpu(capbuf.lba); | 1339 | *capacity = 1 + be32_to_cpu(capbuf.lba); |
1336 | *sectors_per_frame = be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS; | 1340 | *sectors_per_frame = blocklen >> SECTOR_BITS; |
1337 | return 0; | 1341 | return 0; |
1338 | } | 1342 | } |
1339 | 1343 | ||
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 28d85b410f7c..68b9cf0138b0 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -65,11 +65,10 @@ static struct ide_disk_obj *ide_disk_get(struct gendisk *disk) | |||
65 | mutex_lock(&idedisk_ref_mutex); | 65 | mutex_lock(&idedisk_ref_mutex); |
66 | idkp = ide_disk_g(disk); | 66 | idkp = ide_disk_g(disk); |
67 | if (idkp) { | 67 | if (idkp) { |
68 | kref_get(&idkp->kref); | 68 | if (ide_device_get(idkp->drive)) |
69 | if (ide_device_get(idkp->drive)) { | ||
70 | kref_put(&idkp->kref, ide_disk_release); | ||
71 | idkp = NULL; | 69 | idkp = NULL; |
72 | } | 70 | else |
71 | kref_get(&idkp->kref); | ||
73 | } | 72 | } |
74 | mutex_unlock(&idedisk_ref_mutex); | 73 | mutex_unlock(&idedisk_ref_mutex); |
75 | return idkp; | 74 | return idkp; |
@@ -77,9 +76,11 @@ static struct ide_disk_obj *ide_disk_get(struct gendisk *disk) | |||
77 | 76 | ||
78 | static void ide_disk_put(struct ide_disk_obj *idkp) | 77 | static void ide_disk_put(struct ide_disk_obj *idkp) |
79 | { | 78 | { |
79 | ide_drive_t *drive = idkp->drive; | ||
80 | |||
80 | mutex_lock(&idedisk_ref_mutex); | 81 | mutex_lock(&idedisk_ref_mutex); |
81 | ide_device_put(idkp->drive); | ||
82 | kref_put(&idkp->kref, ide_disk_release); | 82 | kref_put(&idkp->kref, ide_disk_release); |
83 | ide_device_put(drive); | ||
83 | mutex_unlock(&idedisk_ref_mutex); | 84 | mutex_unlock(&idedisk_ref_mutex); |
84 | } | 85 | } |
85 | 86 | ||
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index 71c377a7bcf2..adc682755857 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c | |||
@@ -649,11 +649,7 @@ static unsigned int ide_get_mode_mask(ide_drive_t *drive, u8 base, u8 req_mode) | |||
649 | if (id->field_valid & 2) { | 649 | if (id->field_valid & 2) { |
650 | mask = id->dma_1word & hwif->swdma_mask; | 650 | mask = id->dma_1word & hwif->swdma_mask; |
651 | } else if (id->tDMA) { | 651 | } else if (id->tDMA) { |
652 | /* | 652 | u8 mode = id->tDMA; |
653 | * ide_fix_driveid() doesn't convert ->tDMA to the | ||
654 | * CPU endianness so we need to do it here | ||
655 | */ | ||
656 | u8 mode = le16_to_cpu(id->tDMA); | ||
657 | 653 | ||
658 | /* | 654 | /* |
659 | * if the mode is valid convert it to the mask | 655 | * if the mode is valid convert it to the mask |
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index ca11a26746f1..e9034c0125f3 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -167,11 +167,10 @@ static struct ide_floppy_obj *ide_floppy_get(struct gendisk *disk) | |||
167 | mutex_lock(&idefloppy_ref_mutex); | 167 | mutex_lock(&idefloppy_ref_mutex); |
168 | floppy = ide_floppy_g(disk); | 168 | floppy = ide_floppy_g(disk); |
169 | if (floppy) { | 169 | if (floppy) { |
170 | kref_get(&floppy->kref); | 170 | if (ide_device_get(floppy->drive)) |
171 | if (ide_device_get(floppy->drive)) { | ||
172 | kref_put(&floppy->kref, idefloppy_cleanup_obj); | ||
173 | floppy = NULL; | 171 | floppy = NULL; |
174 | } | 172 | else |
173 | kref_get(&floppy->kref); | ||
175 | } | 174 | } |
176 | mutex_unlock(&idefloppy_ref_mutex); | 175 | mutex_unlock(&idefloppy_ref_mutex); |
177 | return floppy; | 176 | return floppy; |
@@ -179,9 +178,11 @@ static struct ide_floppy_obj *ide_floppy_get(struct gendisk *disk) | |||
179 | 178 | ||
180 | static void ide_floppy_put(struct ide_floppy_obj *floppy) | 179 | static void ide_floppy_put(struct ide_floppy_obj *floppy) |
181 | { | 180 | { |
181 | ide_drive_t *drive = floppy->drive; | ||
182 | |||
182 | mutex_lock(&idefloppy_ref_mutex); | 183 | mutex_lock(&idefloppy_ref_mutex); |
183 | ide_device_put(floppy->drive); | ||
184 | kref_put(&floppy->kref, idefloppy_cleanup_obj); | 184 | kref_put(&floppy->kref, idefloppy_cleanup_obj); |
185 | ide_device_put(drive); | ||
185 | mutex_unlock(&idefloppy_ref_mutex); | 186 | mutex_unlock(&idefloppy_ref_mutex); |
186 | } | 187 | } |
187 | 188 | ||
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 8aae91764513..2cbadffe922e 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -484,11 +484,11 @@ void ide_fix_driveid (struct hd_driveid *id) | |||
484 | for (i = 0; i < 3; i++) | 484 | for (i = 0; i < 3; i++) |
485 | id->words157_159[i] = __le16_to_cpu(id->words157_159[i]); | 485 | id->words157_159[i] = __le16_to_cpu(id->words157_159[i]); |
486 | id->cfa_power = __le16_to_cpu(id->cfa_power); | 486 | id->cfa_power = __le16_to_cpu(id->cfa_power); |
487 | for (i = 0; i < 14; i++) | 487 | for (i = 0; i < 15; i++) |
488 | id->words161_175[i] = __le16_to_cpu(id->words161_175[i]); | 488 | id->words161_175[i] = __le16_to_cpu(id->words161_175[i]); |
489 | for (i = 0; i < 31; i++) | 489 | for (i = 0; i < 30; i++) |
490 | id->words176_205[i] = __le16_to_cpu(id->words176_205[i]); | 490 | id->words176_205[i] = __le16_to_cpu(id->words176_205[i]); |
491 | for (i = 0; i < 48; i++) | 491 | for (i = 0; i < 49; i++) |
492 | id->words206_254[i] = __le16_to_cpu(id->words206_254[i]); | 492 | id->words206_254[i] = __le16_to_cpu(id->words206_254[i]); |
493 | id->integrity_word = __le16_to_cpu(id->integrity_word); | 493 | id->integrity_word = __le16_to_cpu(id->integrity_word); |
494 | # else | 494 | # else |
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 82c2afe4d28a..1bce84b56630 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -331,11 +331,10 @@ static struct ide_tape_obj *ide_tape_get(struct gendisk *disk) | |||
331 | mutex_lock(&idetape_ref_mutex); | 331 | mutex_lock(&idetape_ref_mutex); |
332 | tape = ide_tape_g(disk); | 332 | tape = ide_tape_g(disk); |
333 | if (tape) { | 333 | if (tape) { |
334 | kref_get(&tape->kref); | 334 | if (ide_device_get(tape->drive)) |
335 | if (ide_device_get(tape->drive)) { | ||
336 | kref_put(&tape->kref, ide_tape_release); | ||
337 | tape = NULL; | 335 | tape = NULL; |
338 | } | 336 | else |
337 | kref_get(&tape->kref); | ||
339 | } | 338 | } |
340 | mutex_unlock(&idetape_ref_mutex); | 339 | mutex_unlock(&idetape_ref_mutex); |
341 | return tape; | 340 | return tape; |
@@ -343,9 +342,11 @@ static struct ide_tape_obj *ide_tape_get(struct gendisk *disk) | |||
343 | 342 | ||
344 | static void ide_tape_put(struct ide_tape_obj *tape) | 343 | static void ide_tape_put(struct ide_tape_obj *tape) |
345 | { | 344 | { |
345 | ide_drive_t *drive = tape->drive; | ||
346 | |||
346 | mutex_lock(&idetape_ref_mutex); | 347 | mutex_lock(&idetape_ref_mutex); |
347 | ide_device_put(tape->drive); | ||
348 | kref_put(&tape->kref, ide_tape_release); | 348 | kref_put(&tape->kref, ide_tape_release); |
349 | ide_device_put(drive); | ||
349 | mutex_unlock(&idetape_ref_mutex); | 350 | mutex_unlock(&idetape_ref_mutex); |
350 | } | 351 | } |
351 | 352 | ||
diff --git a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c index e0c8fe7d9fea..40644b6f1c00 100644 --- a/drivers/ide/pci/aec62xx.c +++ b/drivers/ide/pci/aec62xx.c | |||
@@ -160,7 +160,7 @@ static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev) | |||
160 | return dev->irq; | 160 | return dev->irq; |
161 | } | 161 | } |
162 | 162 | ||
163 | static u8 __devinit atp86x_cable_detect(ide_hwif_t *hwif) | 163 | static u8 atp86x_cable_detect(ide_hwif_t *hwif) |
164 | { | 164 | { |
165 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 165 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
166 | u8 ata66 = 0, mask = hwif->channel ? 0x02 : 0x01; | 166 | u8 ata66 = 0, mask = hwif->channel ? 0x02 : 0x01; |
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c index b582687e0cd4..d647526af557 100644 --- a/drivers/ide/pci/alim15x3.c +++ b/drivers/ide/pci/alim15x3.c | |||
@@ -371,7 +371,7 @@ static int ali_cable_override(struct pci_dev *pdev) | |||
371 | * FIXME: frobs bits that are not defined on newer ALi devicea | 371 | * FIXME: frobs bits that are not defined on newer ALi devicea |
372 | */ | 372 | */ |
373 | 373 | ||
374 | static u8 __devinit ali_cable_detect(ide_hwif_t *hwif) | 374 | static u8 ali_cable_detect(ide_hwif_t *hwif) |
375 | { | 375 | { |
376 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 376 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
377 | unsigned long flags; | 377 | unsigned long flags; |
diff --git a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c index 2cea7bf51a0f..1e66a960a96a 100644 --- a/drivers/ide/pci/amd74xx.c +++ b/drivers/ide/pci/amd74xx.c | |||
@@ -175,7 +175,7 @@ static unsigned int __devinit init_chipset_amd74xx(struct pci_dev *dev) | |||
175 | return dev->irq; | 175 | return dev->irq; |
176 | } | 176 | } |
177 | 177 | ||
178 | static u8 __devinit amd_cable_detect(ide_hwif_t *hwif) | 178 | static u8 amd_cable_detect(ide_hwif_t *hwif) |
179 | { | 179 | { |
180 | if ((amd_80w >> hwif->channel) & 1) | 180 | if ((amd_80w >> hwif->channel) & 1) |
181 | return ATA_CBL_PATA80; | 181 | return ATA_CBL_PATA80; |
diff --git a/drivers/ide/pci/atiixp.c b/drivers/ide/pci/atiixp.c index 332f08f43b56..41f6cb6c163a 100644 --- a/drivers/ide/pci/atiixp.c +++ b/drivers/ide/pci/atiixp.c | |||
@@ -119,7 +119,7 @@ static void atiixp_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
119 | spin_unlock_irqrestore(&atiixp_lock, flags); | 119 | spin_unlock_irqrestore(&atiixp_lock, flags); |
120 | } | 120 | } |
121 | 121 | ||
122 | static u8 __devinit atiixp_cable_detect(ide_hwif_t *hwif) | 122 | static u8 atiixp_cable_detect(ide_hwif_t *hwif) |
123 | { | 123 | { |
124 | struct pci_dev *pdev = to_pci_dev(hwif->dev); | 124 | struct pci_dev *pdev = to_pci_dev(hwif->dev); |
125 | u8 udma_mode = 0, ch = hwif->channel; | 125 | u8 udma_mode = 0, ch = hwif->channel; |
diff --git a/drivers/ide/pci/cmd64x.c b/drivers/ide/pci/cmd64x.c index 1360b4fa9fd3..e064398e03b4 100644 --- a/drivers/ide/pci/cmd64x.c +++ b/drivers/ide/pci/cmd64x.c | |||
@@ -354,7 +354,7 @@ static unsigned int __devinit init_chipset_cmd64x(struct pci_dev *dev) | |||
354 | return 0; | 354 | return 0; |
355 | } | 355 | } |
356 | 356 | ||
357 | static u8 __devinit cmd64x_cable_detect(ide_hwif_t *hwif) | 357 | static u8 cmd64x_cable_detect(ide_hwif_t *hwif) |
358 | { | 358 | { |
359 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 359 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
360 | u8 bmidecsr = 0, mask = hwif->channel ? 0x02 : 0x01; | 360 | u8 bmidecsr = 0, mask = hwif->channel ? 0x02 : 0x01; |
diff --git a/drivers/ide/pci/cs5520.c b/drivers/ide/pci/cs5520.c index c0364b287f17..151844fcbb07 100644 --- a/drivers/ide/pci/cs5520.c +++ b/drivers/ide/pci/cs5520.c | |||
@@ -96,6 +96,7 @@ static const struct ide_port_ops cs5520_port_ops = { | |||
96 | 96 | ||
97 | static const struct ide_port_info cyrix_chipset __devinitdata = { | 97 | static const struct ide_port_info cyrix_chipset __devinitdata = { |
98 | .name = DRV_NAME, | 98 | .name = DRV_NAME, |
99 | .enablebits = { { 0x60, 0x01, 0x01 }, { 0x60, 0x02, 0x02 } }, | ||
99 | .port_ops = &cs5520_port_ops, | 100 | .port_ops = &cs5520_port_ops, |
100 | .host_flags = IDE_HFLAG_ISA_PORTS | IDE_HFLAG_CS5520, | 101 | .host_flags = IDE_HFLAG_ISA_PORTS | IDE_HFLAG_CS5520, |
101 | .pio_mask = ATA_PIO4, | 102 | .pio_mask = ATA_PIO4, |
diff --git a/drivers/ide/pci/cs5535.c b/drivers/ide/pci/cs5535.c index f7b50cdeefa6..dd3dc23af995 100644 --- a/drivers/ide/pci/cs5535.c +++ b/drivers/ide/pci/cs5535.c | |||
@@ -153,7 +153,7 @@ static void cs5535_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
153 | cs5535_set_speed(drive, XFER_PIO_0 + pio); | 153 | cs5535_set_speed(drive, XFER_PIO_0 + pio); |
154 | } | 154 | } |
155 | 155 | ||
156 | static u8 __devinit cs5535_cable_detect(ide_hwif_t *hwif) | 156 | static u8 cs5535_cable_detect(ide_hwif_t *hwif) |
157 | { | 157 | { |
158 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 158 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
159 | u8 bit; | 159 | u8 bit; |
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index 5271b246b88c..748793a413ab 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
@@ -1214,7 +1214,7 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev) | |||
1214 | return dev->irq; | 1214 | return dev->irq; |
1215 | } | 1215 | } |
1216 | 1216 | ||
1217 | static u8 __devinit hpt3xx_cable_detect(ide_hwif_t *hwif) | 1217 | static u8 hpt3xx_cable_detect(ide_hwif_t *hwif) |
1218 | { | 1218 | { |
1219 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 1219 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
1220 | struct ide_host *host = pci_get_drvdata(dev); | 1220 | struct ide_host *host = pci_get_drvdata(dev); |
diff --git a/drivers/ide/pci/it8213.c b/drivers/ide/pci/it8213.c index 6eba8f188264..652e47dd7e89 100644 --- a/drivers/ide/pci/it8213.c +++ b/drivers/ide/pci/it8213.c | |||
@@ -141,7 +141,7 @@ static void it8213_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
141 | } | 141 | } |
142 | } | 142 | } |
143 | 143 | ||
144 | static u8 __devinit it8213_cable_detect(ide_hwif_t *hwif) | 144 | static u8 it8213_cable_detect(ide_hwif_t *hwif) |
145 | { | 145 | { |
146 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 146 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
147 | u8 reg42h = 0; | 147 | u8 reg42h = 0; |
diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c index e16a1d113a2a..b6dc723de702 100644 --- a/drivers/ide/pci/it821x.c +++ b/drivers/ide/pci/it821x.c | |||
@@ -428,7 +428,7 @@ static void it821x_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
428 | * the needed logic onboard. | 428 | * the needed logic onboard. |
429 | */ | 429 | */ |
430 | 430 | ||
431 | static u8 __devinit it821x_cable_detect(ide_hwif_t *hwif) | 431 | static u8 it821x_cable_detect(ide_hwif_t *hwif) |
432 | { | 432 | { |
433 | /* The reference driver also only does disk side */ | 433 | /* The reference driver also only does disk side */ |
434 | return ATA_CBL_PATA80; | 434 | return ATA_CBL_PATA80; |
@@ -443,7 +443,7 @@ static u8 __devinit it821x_cable_detect(ide_hwif_t *hwif) | |||
443 | * final tuning that is needed, or fixups to work around bugs. | 443 | * final tuning that is needed, or fixups to work around bugs. |
444 | */ | 444 | */ |
445 | 445 | ||
446 | static void __devinit it821x_quirkproc(ide_drive_t *drive) | 446 | static void it821x_quirkproc(ide_drive_t *drive) |
447 | { | 447 | { |
448 | struct it821x_dev *itdev = ide_get_hwifdata(drive->hwif); | 448 | struct it821x_dev *itdev = ide_get_hwifdata(drive->hwif); |
449 | struct hd_driveid *id = drive->id; | 449 | struct hd_driveid *id = drive->id; |
diff --git a/drivers/ide/pci/jmicron.c b/drivers/ide/pci/jmicron.c index 545b6e172d9b..bb9d09d8f196 100644 --- a/drivers/ide/pci/jmicron.c +++ b/drivers/ide/pci/jmicron.c | |||
@@ -27,7 +27,7 @@ typedef enum { | |||
27 | * Returns the cable type. | 27 | * Returns the cable type. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | static u8 __devinit jmicron_cable_detect(ide_hwif_t *hwif) | 30 | static u8 jmicron_cable_detect(ide_hwif_t *hwif) |
31 | { | 31 | { |
32 | struct pci_dev *pdev = to_pci_dev(hwif->dev); | 32 | struct pci_dev *pdev = to_pci_dev(hwif->dev); |
33 | 33 | ||
diff --git a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c index 998615fa285f..0f609b72f470 100644 --- a/drivers/ide/pci/pdc202xx_new.c +++ b/drivers/ide/pci/pdc202xx_new.c | |||
@@ -193,7 +193,7 @@ static void pdcnew_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
193 | } | 193 | } |
194 | } | 194 | } |
195 | 195 | ||
196 | static u8 __devinit pdcnew_cable_detect(ide_hwif_t *hwif) | 196 | static u8 pdcnew_cable_detect(ide_hwif_t *hwif) |
197 | { | 197 | { |
198 | if (get_indexed_reg(hwif, 0x0b) & 0x04) | 198 | if (get_indexed_reg(hwif, 0x0b) & 0x04) |
199 | return ATA_CBL_PATA40; | 199 | return ATA_CBL_PATA40; |
diff --git a/drivers/ide/pci/pdc202xx_old.c b/drivers/ide/pci/pdc202xx_old.c index 6ff2def58da0..de9a27400462 100644 --- a/drivers/ide/pci/pdc202xx_old.c +++ b/drivers/ide/pci/pdc202xx_old.c | |||
@@ -117,7 +117,7 @@ static void pdc202xx_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
117 | pdc202xx_set_mode(drive, XFER_PIO_0 + pio); | 117 | pdc202xx_set_mode(drive, XFER_PIO_0 + pio); |
118 | } | 118 | } |
119 | 119 | ||
120 | static u8 __devinit pdc2026x_cable_detect(ide_hwif_t *hwif) | 120 | static u8 pdc2026x_cable_detect(ide_hwif_t *hwif) |
121 | { | 121 | { |
122 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 122 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
123 | u16 CIS, mask = hwif->channel ? (1 << 11) : (1 << 10); | 123 | u16 CIS, mask = hwif->channel ? (1 << 11) : (1 << 10); |
diff --git a/drivers/ide/pci/piix.c b/drivers/ide/pci/piix.c index 7fc3022dcf68..30cfc815fe31 100644 --- a/drivers/ide/pci/piix.c +++ b/drivers/ide/pci/piix.c | |||
@@ -256,7 +256,7 @@ static const struct ich_laptop ich_laptop[] = { | |||
256 | { 0, } | 256 | { 0, } |
257 | }; | 257 | }; |
258 | 258 | ||
259 | static u8 __devinit piix_cable_detect(ide_hwif_t *hwif) | 259 | static u8 piix_cable_detect(ide_hwif_t *hwif) |
260 | { | 260 | { |
261 | struct pci_dev *pdev = to_pci_dev(hwif->dev); | 261 | struct pci_dev *pdev = to_pci_dev(hwif->dev); |
262 | const struct ich_laptop *lap = &ich_laptop[0]; | 262 | const struct ich_laptop *lap = &ich_laptop[0]; |
diff --git a/drivers/ide/pci/scc_pata.c b/drivers/ide/pci/scc_pata.c index 94a7ab864236..6cde48bba6f8 100644 --- a/drivers/ide/pci/scc_pata.c +++ b/drivers/ide/pci/scc_pata.c | |||
@@ -827,7 +827,7 @@ static void __devinit init_iops_scc(ide_hwif_t *hwif) | |||
827 | init_mmio_iops_scc(hwif); | 827 | init_mmio_iops_scc(hwif); |
828 | } | 828 | } |
829 | 829 | ||
830 | static u8 __devinit scc_cable_detect(ide_hwif_t *hwif) | 830 | static u8 scc_cable_detect(ide_hwif_t *hwif) |
831 | { | 831 | { |
832 | return ATA_CBL_PATA80; | 832 | return ATA_CBL_PATA80; |
833 | } | 833 | } |
diff --git a/drivers/ide/pci/serverworks.c b/drivers/ide/pci/serverworks.c index d173f2937722..c3bdc6e51a48 100644 --- a/drivers/ide/pci/serverworks.c +++ b/drivers/ide/pci/serverworks.c | |||
@@ -272,7 +272,7 @@ static unsigned int __devinit init_chipset_svwks(struct pci_dev *dev) | |||
272 | return dev->irq; | 272 | return dev->irq; |
273 | } | 273 | } |
274 | 274 | ||
275 | static u8 __devinit ata66_svwks_svwks(ide_hwif_t *hwif) | 275 | static u8 ata66_svwks_svwks(ide_hwif_t *hwif) |
276 | { | 276 | { |
277 | return ATA_CBL_PATA80; | 277 | return ATA_CBL_PATA80; |
278 | } | 278 | } |
@@ -284,7 +284,7 @@ static u8 __devinit ata66_svwks_svwks(ide_hwif_t *hwif) | |||
284 | * Bit 14 clear = primary IDE channel does not have 80-pin cable. | 284 | * Bit 14 clear = primary IDE channel does not have 80-pin cable. |
285 | * Bit 14 set = primary IDE channel has 80-pin cable. | 285 | * Bit 14 set = primary IDE channel has 80-pin cable. |
286 | */ | 286 | */ |
287 | static u8 __devinit ata66_svwks_dell(ide_hwif_t *hwif) | 287 | static u8 ata66_svwks_dell(ide_hwif_t *hwif) |
288 | { | 288 | { |
289 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 289 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
290 | 290 | ||
@@ -303,7 +303,7 @@ static u8 __devinit ata66_svwks_dell(ide_hwif_t *hwif) | |||
303 | * | 303 | * |
304 | * WARNING: this only works on Alpine hardware! | 304 | * WARNING: this only works on Alpine hardware! |
305 | */ | 305 | */ |
306 | static u8 __devinit ata66_svwks_cobalt(ide_hwif_t *hwif) | 306 | static u8 ata66_svwks_cobalt(ide_hwif_t *hwif) |
307 | { | 307 | { |
308 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 308 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
309 | 309 | ||
@@ -315,7 +315,7 @@ static u8 __devinit ata66_svwks_cobalt(ide_hwif_t *hwif) | |||
315 | return ATA_CBL_PATA40; | 315 | return ATA_CBL_PATA40; |
316 | } | 316 | } |
317 | 317 | ||
318 | static u8 __devinit svwks_cable_detect(ide_hwif_t *hwif) | 318 | static u8 svwks_cable_detect(ide_hwif_t *hwif) |
319 | { | 319 | { |
320 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 320 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
321 | 321 | ||
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c index b8ad9ad6cf0d..445ce6fbea33 100644 --- a/drivers/ide/pci/siimage.c +++ b/drivers/ide/pci/siimage.c | |||
@@ -639,7 +639,7 @@ static int is_dev_seagate_sata(ide_drive_t *drive) | |||
639 | * that can occur before we know what drives are present. | 639 | * that can occur before we know what drives are present. |
640 | */ | 640 | */ |
641 | 641 | ||
642 | static void __devinit sil_quirkproc(ide_drive_t *drive) | 642 | static void sil_quirkproc(ide_drive_t *drive) |
643 | { | 643 | { |
644 | ide_hwif_t *hwif = drive->hwif; | 644 | ide_hwif_t *hwif = drive->hwif; |
645 | 645 | ||
@@ -679,7 +679,7 @@ static void __devinit init_iops_siimage(ide_hwif_t *hwif) | |||
679 | * Check for the presence of an ATA66 capable cable on the interface. | 679 | * Check for the presence of an ATA66 capable cable on the interface. |
680 | */ | 680 | */ |
681 | 681 | ||
682 | static u8 __devinit sil_cable_detect(ide_hwif_t *hwif) | 682 | static u8 sil_cable_detect(ide_hwif_t *hwif) |
683 | { | 683 | { |
684 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 684 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
685 | unsigned long addr = siimage_selreg(hwif, 0); | 685 | unsigned long addr = siimage_selreg(hwif, 0); |
diff --git a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c index cc95f90b53b7..e5a4b42b4e33 100644 --- a/drivers/ide/pci/sis5513.c +++ b/drivers/ide/pci/sis5513.c | |||
@@ -518,7 +518,7 @@ static const struct sis_laptop sis_laptop[] = { | |||
518 | { 0, } | 518 | { 0, } |
519 | }; | 519 | }; |
520 | 520 | ||
521 | static u8 __devinit sis_cable_detect(ide_hwif_t *hwif) | 521 | static u8 sis_cable_detect(ide_hwif_t *hwif) |
522 | { | 522 | { |
523 | struct pci_dev *pdev = to_pci_dev(hwif->dev); | 523 | struct pci_dev *pdev = to_pci_dev(hwif->dev); |
524 | const struct sis_laptop *lap = &sis_laptop[0]; | 524 | const struct sis_laptop *lap = &sis_laptop[0]; |
diff --git a/drivers/ide/pci/slc90e66.c b/drivers/ide/pci/slc90e66.c index 13d1fa491f26..866d6c65e3a0 100644 --- a/drivers/ide/pci/slc90e66.c +++ b/drivers/ide/pci/slc90e66.c | |||
@@ -116,7 +116,7 @@ static void slc90e66_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
116 | } | 116 | } |
117 | } | 117 | } |
118 | 118 | ||
119 | static u8 __devinit slc90e66_cable_detect(ide_hwif_t *hwif) | 119 | static u8 slc90e66_cable_detect(ide_hwif_t *hwif) |
120 | { | 120 | { |
121 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 121 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
122 | u8 reg47 = 0, mask = hwif->channel ? 0x01 : 0x02; | 122 | u8 reg47 = 0, mask = hwif->channel ? 0x01 : 0x02; |
diff --git a/drivers/ide/pci/tc86c001.c b/drivers/ide/pci/tc86c001.c index b1cb8a9ce5a9..7fc88c375e5d 100644 --- a/drivers/ide/pci/tc86c001.c +++ b/drivers/ide/pci/tc86c001.c | |||
@@ -131,7 +131,7 @@ static void tc86c001_dma_start(ide_drive_t *drive) | |||
131 | ide_dma_start(drive); | 131 | ide_dma_start(drive); |
132 | } | 132 | } |
133 | 133 | ||
134 | static u8 __devinit tc86c001_cable_detect(ide_hwif_t *hwif) | 134 | static u8 tc86c001_cable_detect(ide_hwif_t *hwif) |
135 | { | 135 | { |
136 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 136 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
137 | unsigned long sc_base = pci_resource_start(dev, 5); | 137 | unsigned long sc_base = pci_resource_start(dev, 5); |
diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c index 454d2bf62dce..a6b2cc83f293 100644 --- a/drivers/ide/pci/via82cxxx.c +++ b/drivers/ide/pci/via82cxxx.c | |||
@@ -352,7 +352,7 @@ static int via_cable_override(struct pci_dev *pdev) | |||
352 | return 0; | 352 | return 0; |
353 | } | 353 | } |
354 | 354 | ||
355 | static u8 __devinit via82cxxx_cable_detect(ide_hwif_t *hwif) | 355 | static u8 via82cxxx_cable_detect(ide_hwif_t *hwif) |
356 | { | 356 | { |
357 | struct pci_dev *pdev = to_pci_dev(hwif->dev); | 357 | struct pci_dev *pdev = to_pci_dev(hwif->dev); |
358 | struct ide_host *host = pci_get_drvdata(pdev); | 358 | struct ide_host *host = pci_get_drvdata(pdev); |
diff --git a/drivers/infiniband/hw/ehca/ehca_reqs.c b/drivers/infiniband/hw/ehca/ehca_reqs.c index dd9bc68f1c7b..898c8b5c38dd 100644 --- a/drivers/infiniband/hw/ehca/ehca_reqs.c +++ b/drivers/infiniband/hw/ehca/ehca_reqs.c | |||
@@ -42,7 +42,7 @@ | |||
42 | */ | 42 | */ |
43 | 43 | ||
44 | 44 | ||
45 | #include <asm-powerpc/system.h> | 45 | #include <asm/system.h> |
46 | #include "ehca_classes.h" | 46 | #include "ehca_classes.h" |
47 | #include "ehca_tools.h" | 47 | #include "ehca_tools.h" |
48 | #include "ehca_qes.h" | 48 | #include "ehca_qes.h" |
diff --git a/drivers/input/keyboard/maple_keyb.c b/drivers/input/keyboard/maple_keyb.c index 7797ef6e5e64..22f17a593be7 100644 --- a/drivers/input/keyboard/maple_keyb.c +++ b/drivers/input/keyboard/maple_keyb.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * SEGA Dreamcast keyboard driver | 2 | * SEGA Dreamcast keyboard driver |
3 | * Based on drivers/usb/usbkbd.c | 3 | * Based on drivers/usb/usbkbd.c |
4 | * Copyright YAEGASHI Takeshi, 2001 | 4 | * Copyright YAEGASHI Takeshi, 2001 |
5 | * Porting to 2.6 Copyright Adrian McMenamin, 2007 | 5 | * Porting to 2.6 Copyright Adrian McMenamin, 2007, 2008 |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 8 | * it under the terms of the GNU General Public License as published by |
@@ -45,39 +45,51 @@ struct dc_kbd { | |||
45 | }; | 45 | }; |
46 | 46 | ||
47 | static const unsigned short dc_kbd_keycode[NR_SCANCODES] = { | 47 | static const unsigned short dc_kbd_keycode[NR_SCANCODES] = { |
48 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_A, KEY_B, KEY_C, KEY_D, | 48 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_A, KEY_B, |
49 | KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, | 49 | KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, |
50 | KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, | 50 | KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, |
51 | KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_1, KEY_2, | 51 | KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, |
52 | KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, | 52 | KEY_7, KEY_8, KEY_9, KEY_0, KEY_ENTER, KEY_ESC, KEY_BACKSPACE, |
53 | KEY_ENTER, KEY_ESC, KEY_BACKSPACE, KEY_TAB, KEY_SPACE, KEY_MINUS, KEY_EQUAL, KEY_LEFTBRACE, | 53 | KEY_TAB, KEY_SPACE, KEY_MINUS, KEY_EQUAL, KEY_LEFTBRACE, |
54 | KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_BACKSLASH, KEY_SEMICOLON, KEY_APOSTROPHE, KEY_GRAVE, KEY_COMMA, | 54 | KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_BACKSLASH, KEY_SEMICOLON, |
55 | KEY_DOT, KEY_SLASH, KEY_CAPSLOCK, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, | 55 | KEY_APOSTROPHE, KEY_GRAVE, KEY_COMMA, KEY_DOT, KEY_SLASH, |
56 | KEY_CAPSLOCK, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, | ||
56 | KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_SYSRQ, | 57 | KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_SYSRQ, |
57 | KEY_SCROLLLOCK, KEY_PAUSE, KEY_INSERT, KEY_HOME, KEY_PAGEUP, KEY_DELETE, | 58 | KEY_SCROLLLOCK, KEY_PAUSE, KEY_INSERT, KEY_HOME, KEY_PAGEUP, |
58 | KEY_END, KEY_PAGEDOWN, KEY_RIGHT, KEY_LEFT, KEY_DOWN, KEY_UP, | 59 | KEY_DELETE, KEY_END, KEY_PAGEDOWN, KEY_RIGHT, KEY_LEFT, KEY_DOWN, |
59 | KEY_NUMLOCK, KEY_KPSLASH, KEY_KPASTERISK, KEY_KPMINUS, KEY_KPPLUS, KEY_KPENTER, KEY_KP1, KEY_KP2, | 60 | KEY_UP, KEY_NUMLOCK, KEY_KPSLASH, KEY_KPASTERISK, KEY_KPMINUS, |
60 | KEY_KP3, KEY_KP4, KEY_KP5, KEY_KP6, KEY_KP7, KEY_KP8, KEY_KP9, KEY_KP0, KEY_KPDOT, | 61 | KEY_KPPLUS, KEY_KPENTER, KEY_KP1, KEY_KP2, KEY_KP3, KEY_KP4, KEY_KP5, |
61 | KEY_102ND, KEY_COMPOSE, KEY_POWER, KEY_KPEQUAL, KEY_F13, KEY_F14, KEY_F15, | 62 | KEY_KP6, KEY_KP7, KEY_KP8, KEY_KP9, KEY_KP0, KEY_KPDOT, KEY_102ND, |
62 | KEY_F16, KEY_F17, KEY_F18, KEY_F19, KEY_F20, | 63 | KEY_COMPOSE, KEY_POWER, KEY_KPEQUAL, KEY_F13, KEY_F14, KEY_F15, |
63 | KEY_F21, KEY_F22, KEY_F23, KEY_F24, KEY_OPEN, KEY_HELP, KEY_PROPS, KEY_FRONT, | 64 | KEY_F16, KEY_F17, KEY_F18, KEY_F19, KEY_F20, KEY_F21, KEY_F22, |
64 | KEY_STOP, KEY_AGAIN, KEY_UNDO, KEY_CUT, KEY_COPY, KEY_PASTE, KEY_FIND, KEY_MUTE, | 65 | KEY_F23, KEY_F24, KEY_OPEN, KEY_HELP, KEY_PROPS, KEY_FRONT, KEY_STOP, |
65 | KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_KPCOMMA, KEY_RESERVED, KEY_RO, KEY_KATAKANAHIRAGANA , KEY_YEN, | 66 | KEY_AGAIN, KEY_UNDO, KEY_CUT, KEY_COPY, KEY_PASTE, KEY_FIND, KEY_MUTE, |
66 | KEY_HENKAN, KEY_MUHENKAN, KEY_KPJPCOMMA, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | 67 | KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, |
67 | KEY_HANGEUL, KEY_HANJA, KEY_KATAKANA, KEY_HIRAGANA, KEY_ZENKAKUHANKAKU, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | 68 | KEY_KPCOMMA, KEY_RESERVED, KEY_RO, KEY_KATAKANAHIRAGANA , KEY_YEN, |
68 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | 69 | KEY_HENKAN, KEY_MUHENKAN, KEY_KPJPCOMMA, KEY_RESERVED, KEY_RESERVED, |
69 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | 70 | KEY_RESERVED, KEY_HANGEUL, KEY_HANJA, KEY_KATAKANA, KEY_HIRAGANA, |
70 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | 71 | KEY_ZENKAKUHANKAKU, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, |
71 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | 72 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, |
72 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | 73 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, |
73 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | 74 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, |
74 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | 75 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, |
75 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | 76 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, |
76 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | 77 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, |
77 | KEY_LEFTCTRL, KEY_LEFTSHIFT, KEY_LEFTALT, KEY_LEFTMETA, KEY_RIGHTCTRL, KEY_RIGHTSHIFT, KEY_RIGHTALT, KEY_RIGHTMETA, | 78 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, |
78 | KEY_PLAYPAUSE, KEY_STOPCD, KEY_PREVIOUSSONG, KEY_NEXTSONG, KEY_EJECTCD, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE, | 79 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, |
79 | KEY_WWW, KEY_BACK, KEY_FORWARD, KEY_STOP, KEY_FIND, KEY_SCROLLUP, KEY_SCROLLDOWN, KEY_EDIT, KEY_SLEEP, | 80 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, |
80 | KEY_SCREENLOCK, KEY_REFRESH, KEY_CALC, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED | 81 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, |
82 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | ||
83 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | ||
84 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | ||
85 | KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, | ||
86 | KEY_RESERVED, KEY_RESERVED, KEY_LEFTCTRL, KEY_LEFTSHIFT, KEY_LEFTALT, | ||
87 | KEY_LEFTMETA, KEY_RIGHTCTRL, KEY_RIGHTSHIFT, KEY_RIGHTALT, | ||
88 | KEY_RIGHTMETA, KEY_PLAYPAUSE, KEY_STOPCD, KEY_PREVIOUSSONG, | ||
89 | KEY_NEXTSONG, KEY_EJECTCD, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE, | ||
90 | KEY_WWW, KEY_BACK, KEY_FORWARD, KEY_STOP, KEY_FIND, KEY_SCROLLUP, | ||
91 | KEY_SCROLLDOWN, KEY_EDIT, KEY_SLEEP, KEY_SCREENLOCK, KEY_REFRESH, | ||
92 | KEY_CALC, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED | ||
81 | }; | 93 | }; |
82 | 94 | ||
83 | static void dc_scan_kbd(struct dc_kbd *kbd) | 95 | static void dc_scan_kbd(struct dc_kbd *kbd) |
@@ -127,12 +139,12 @@ static void dc_scan_kbd(struct dc_kbd *kbd) | |||
127 | static void dc_kbd_callback(struct mapleq *mq) | 139 | static void dc_kbd_callback(struct mapleq *mq) |
128 | { | 140 | { |
129 | struct maple_device *mapledev = mq->dev; | 141 | struct maple_device *mapledev = mq->dev; |
130 | struct dc_kbd *kbd = mapledev->private_data; | 142 | struct dc_kbd *kbd = maple_get_drvdata(mapledev); |
131 | unsigned long *buf = mq->recvbuf; | 143 | unsigned long *buf = mq->recvbuf; |
132 | 144 | ||
133 | /* | 145 | /* |
134 | * We should always be getting the lock because the only | 146 | * We should always get the lock because the only |
135 | * time it may be locked if driver is in cleanup phase. | 147 | * time it may be locked is if the driver is in the cleanup phase. |
136 | */ | 148 | */ |
137 | if (likely(mutex_trylock(&maple_keyb_mutex))) { | 149 | if (likely(mutex_trylock(&maple_keyb_mutex))) { |
138 | 150 | ||
@@ -145,106 +157,96 @@ static void dc_kbd_callback(struct mapleq *mq) | |||
145 | } | 157 | } |
146 | } | 158 | } |
147 | 159 | ||
148 | static int dc_kbd_connect(struct maple_device *mdev) | 160 | static int probe_maple_kbd(struct device *dev) |
149 | { | 161 | { |
162 | struct maple_device *mdev = to_maple_dev(dev); | ||
163 | struct maple_driver *mdrv = to_maple_driver(dev->driver); | ||
150 | int i, error; | 164 | int i, error; |
151 | struct dc_kbd *kbd; | 165 | struct dc_kbd *kbd; |
152 | struct input_dev *dev; | 166 | struct input_dev *idev; |
153 | 167 | ||
154 | if (!(mdev->function & MAPLE_FUNC_KEYBOARD)) | 168 | if (!(mdev->function & MAPLE_FUNC_KEYBOARD)) |
155 | return -EINVAL; | 169 | return -EINVAL; |
156 | 170 | ||
157 | kbd = kzalloc(sizeof(struct dc_kbd), GFP_KERNEL); | 171 | kbd = kzalloc(sizeof(struct dc_kbd), GFP_KERNEL); |
158 | dev = input_allocate_device(); | 172 | idev = input_allocate_device(); |
159 | if (!kbd || !dev) { | 173 | if (!kbd || !idev) { |
160 | error = -ENOMEM; | 174 | error = -ENOMEM; |
161 | goto fail; | 175 | goto fail; |
162 | } | 176 | } |
163 | 177 | ||
164 | mdev->private_data = kbd; | 178 | kbd->dev = idev; |
165 | |||
166 | kbd->dev = dev; | ||
167 | memcpy(kbd->keycode, dc_kbd_keycode, sizeof(kbd->keycode)); | 179 | memcpy(kbd->keycode, dc_kbd_keycode, sizeof(kbd->keycode)); |
168 | 180 | ||
169 | dev->name = mdev->product_name; | 181 | idev->name = mdev->product_name; |
170 | dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); | 182 | idev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); |
171 | dev->keycode = kbd->keycode; | 183 | idev->keycode = kbd->keycode; |
172 | dev->keycodesize = sizeof (unsigned short); | 184 | idev->keycodesize = sizeof(unsigned short); |
173 | dev->keycodemax = ARRAY_SIZE(kbd->keycode); | 185 | idev->keycodemax = ARRAY_SIZE(kbd->keycode); |
174 | dev->id.bustype = BUS_HOST; | 186 | idev->id.bustype = BUS_HOST; |
175 | dev->dev.parent = &mdev->dev; | 187 | idev->dev.parent = &mdev->dev; |
176 | 188 | ||
177 | for (i = 0; i < NR_SCANCODES; i++) | 189 | for (i = 0; i < NR_SCANCODES; i++) |
178 | __set_bit(dc_kbd_keycode[i], dev->keybit); | 190 | __set_bit(dc_kbd_keycode[i], idev->keybit); |
179 | __clear_bit(KEY_RESERVED, dev->keybit); | 191 | __clear_bit(KEY_RESERVED, idev->keybit); |
180 | 192 | ||
181 | input_set_capability(dev, EV_MSC, MSC_SCAN); | 193 | input_set_capability(idev, EV_MSC, MSC_SCAN); |
182 | input_set_drvdata(dev, kbd); | 194 | input_set_drvdata(idev, kbd); |
183 | 195 | ||
184 | error = input_register_device(dev); | 196 | error = input_register_device(idev); |
185 | if (error) | 197 | if (error) |
186 | goto fail; | 198 | goto fail; |
187 | 199 | ||
188 | /* Maple polling is locked to VBLANK - which may be just 50/s */ | 200 | /* Maple polling is locked to VBLANK - which may be just 50/s */ |
189 | maple_getcond_callback(mdev, dc_kbd_callback, HZ/50, MAPLE_FUNC_KEYBOARD); | 201 | maple_getcond_callback(mdev, dc_kbd_callback, HZ/50, |
190 | return 0; | 202 | MAPLE_FUNC_KEYBOARD); |
191 | 203 | ||
192 | fail: | 204 | mdev->driver = mdrv; |
193 | input_free_device(dev); | 205 | |
206 | maple_set_drvdata(mdev, kbd); | ||
207 | |||
208 | return error; | ||
209 | |||
210 | fail: | ||
211 | input_free_device(idev); | ||
194 | kfree(kbd); | 212 | kfree(kbd); |
195 | mdev->private_data = NULL; | 213 | maple_set_drvdata(mdev, NULL); |
196 | return error; | 214 | return error; |
197 | } | 215 | } |
198 | 216 | ||
199 | static void dc_kbd_disconnect(struct maple_device *mdev) | 217 | static int remove_maple_kbd(struct device *dev) |
200 | { | 218 | { |
201 | struct dc_kbd *kbd; | 219 | struct maple_device *mdev = to_maple_dev(dev); |
220 | struct dc_kbd *kbd = maple_get_drvdata(mdev); | ||
202 | 221 | ||
203 | mutex_lock(&maple_keyb_mutex); | 222 | mutex_lock(&maple_keyb_mutex); |
204 | 223 | ||
205 | kbd = mdev->private_data; | ||
206 | mdev->private_data = NULL; | ||
207 | input_unregister_device(kbd->dev); | 224 | input_unregister_device(kbd->dev); |
208 | kfree(kbd); | 225 | kfree(kbd); |
209 | 226 | ||
210 | mutex_unlock(&maple_keyb_mutex); | 227 | maple_set_drvdata(mdev, NULL); |
211 | } | ||
212 | |||
213 | /* allow the keyboard to be used */ | ||
214 | static int probe_maple_kbd(struct device *dev) | ||
215 | { | ||
216 | struct maple_device *mdev = to_maple_dev(dev); | ||
217 | struct maple_driver *mdrv = to_maple_driver(dev->driver); | ||
218 | int error; | ||
219 | |||
220 | error = dc_kbd_connect(mdev); | ||
221 | if (error) | ||
222 | return error; | ||
223 | |||
224 | mdev->driver = mdrv; | ||
225 | mdev->registered = 1; | ||
226 | 228 | ||
229 | mutex_unlock(&maple_keyb_mutex); | ||
227 | return 0; | 230 | return 0; |
228 | } | 231 | } |
229 | 232 | ||
230 | static struct maple_driver dc_kbd_driver = { | 233 | static struct maple_driver dc_kbd_driver = { |
231 | .function = MAPLE_FUNC_KEYBOARD, | 234 | .function = MAPLE_FUNC_KEYBOARD, |
232 | .connect = dc_kbd_connect, | ||
233 | .disconnect = dc_kbd_disconnect, | ||
234 | .drv = { | 235 | .drv = { |
235 | .name = "Dreamcast_keyboard", | 236 | .name = "Dreamcast_keyboard", |
236 | .probe = probe_maple_kbd, | 237 | .probe = probe_maple_kbd, |
237 | }, | 238 | .remove = remove_maple_kbd, |
239 | }, | ||
238 | }; | 240 | }; |
239 | 241 | ||
240 | static int __init dc_kbd_init(void) | 242 | static int __init dc_kbd_init(void) |
241 | { | 243 | { |
242 | return maple_driver_register(&dc_kbd_driver.drv); | 244 | return maple_driver_register(&dc_kbd_driver); |
243 | } | 245 | } |
244 | 246 | ||
245 | static void __exit dc_kbd_exit(void) | 247 | static void __exit dc_kbd_exit(void) |
246 | { | 248 | { |
247 | driver_unregister(&dc_kbd_driver.drv); | 249 | maple_driver_unregister(&dc_kbd_driver); |
248 | } | 250 | } |
249 | 251 | ||
250 | module_init(dc_kbd_init); | 252 | module_init(dc_kbd_init); |
diff --git a/drivers/isdn/Makefile b/drivers/isdn/Makefile index 8380a4568d11..f1f777570e8e 100644 --- a/drivers/isdn/Makefile +++ b/drivers/isdn/Makefile | |||
@@ -5,7 +5,7 @@ | |||
5 | obj-$(CONFIG_ISDN_I4L) += i4l/ | 5 | obj-$(CONFIG_ISDN_I4L) += i4l/ |
6 | obj-$(CONFIG_ISDN_CAPI) += capi/ | 6 | obj-$(CONFIG_ISDN_CAPI) += capi/ |
7 | obj-$(CONFIG_MISDN) += mISDN/ | 7 | obj-$(CONFIG_MISDN) += mISDN/ |
8 | obj-$(CONFIG_ISDN_CAPI) += hardware/ | 8 | obj-$(CONFIG_ISDN) += hardware/ |
9 | obj-$(CONFIG_ISDN_DIVERSION) += divert/ | 9 | obj-$(CONFIG_ISDN_DIVERSION) += divert/ |
10 | obj-$(CONFIG_ISDN_DRV_HISAX) += hisax/ | 10 | obj-$(CONFIG_ISDN_DRV_HISAX) += hisax/ |
11 | obj-$(CONFIG_ISDN_DRV_ICN) += icn/ | 11 | obj-$(CONFIG_ISDN_DRV_ICN) += icn/ |
diff --git a/drivers/isdn/hardware/mISDN/hfcmulti.c b/drivers/isdn/hardware/mISDN/hfcmulti.c index 2649ea55a9e8..1eac03f39d00 100644 --- a/drivers/isdn/hardware/mISDN/hfcmulti.c +++ b/drivers/isdn/hardware/mISDN/hfcmulti.c | |||
@@ -140,7 +140,7 @@ | |||
140 | * #define HFC_REGISTER_DEBUG | 140 | * #define HFC_REGISTER_DEBUG |
141 | */ | 141 | */ |
142 | 142 | ||
143 | static const char *hfcmulti_revision = "2.00"; | 143 | static const char *hfcmulti_revision = "2.02"; |
144 | 144 | ||
145 | #include <linux/module.h> | 145 | #include <linux/module.h> |
146 | #include <linux/pci.h> | 146 | #include <linux/pci.h> |
@@ -427,12 +427,12 @@ write_fifo_regio(struct hfc_multi *hc, u_char *data, int len) | |||
427 | { | 427 | { |
428 | outb(A_FIFO_DATA0, (hc->pci_iobase)+4); | 428 | outb(A_FIFO_DATA0, (hc->pci_iobase)+4); |
429 | while (len>>2) { | 429 | while (len>>2) { |
430 | outl(*(u32 *)data, hc->pci_iobase); | 430 | outl(cpu_to_le32(*(u32 *)data), hc->pci_iobase); |
431 | data += 4; | 431 | data += 4; |
432 | len -= 4; | 432 | len -= 4; |
433 | } | 433 | } |
434 | while (len>>1) { | 434 | while (len>>1) { |
435 | outw(*(u16 *)data, hc->pci_iobase); | 435 | outw(cpu_to_le16(*(u16 *)data), hc->pci_iobase); |
436 | data += 2; | 436 | data += 2; |
437 | len -= 2; | 437 | len -= 2; |
438 | } | 438 | } |
@@ -447,17 +447,19 @@ void | |||
447 | write_fifo_pcimem(struct hfc_multi *hc, u_char *data, int len) | 447 | write_fifo_pcimem(struct hfc_multi *hc, u_char *data, int len) |
448 | { | 448 | { |
449 | while (len>>2) { | 449 | while (len>>2) { |
450 | writel(*(u32 *)data, (hc->pci_membase)+A_FIFO_DATA0); | 450 | writel(cpu_to_le32(*(u32 *)data), |
451 | hc->pci_membase + A_FIFO_DATA0); | ||
451 | data += 4; | 452 | data += 4; |
452 | len -= 4; | 453 | len -= 4; |
453 | } | 454 | } |
454 | while (len>>1) { | 455 | while (len>>1) { |
455 | writew(*(u16 *)data, (hc->pci_membase)+A_FIFO_DATA0); | 456 | writew(cpu_to_le16(*(u16 *)data), |
457 | hc->pci_membase + A_FIFO_DATA0); | ||
456 | data += 2; | 458 | data += 2; |
457 | len -= 2; | 459 | len -= 2; |
458 | } | 460 | } |
459 | while (len) { | 461 | while (len) { |
460 | writeb(*data, (hc->pci_membase)+A_FIFO_DATA0); | 462 | writeb(*data, hc->pci_membase + A_FIFO_DATA0); |
461 | data++; | 463 | data++; |
462 | len--; | 464 | len--; |
463 | } | 465 | } |
@@ -468,12 +470,12 @@ read_fifo_regio(struct hfc_multi *hc, u_char *data, int len) | |||
468 | { | 470 | { |
469 | outb(A_FIFO_DATA0, (hc->pci_iobase)+4); | 471 | outb(A_FIFO_DATA0, (hc->pci_iobase)+4); |
470 | while (len>>2) { | 472 | while (len>>2) { |
471 | *(u32 *)data = inl(hc->pci_iobase); | 473 | *(u32 *)data = le32_to_cpu(inl(hc->pci_iobase)); |
472 | data += 4; | 474 | data += 4; |
473 | len -= 4; | 475 | len -= 4; |
474 | } | 476 | } |
475 | while (len>>1) { | 477 | while (len>>1) { |
476 | *(u16 *)data = inw(hc->pci_iobase); | 478 | *(u16 *)data = le16_to_cpu(inw(hc->pci_iobase)); |
477 | data += 2; | 479 | data += 2; |
478 | len -= 2; | 480 | len -= 2; |
479 | } | 481 | } |
@@ -490,18 +492,18 @@ read_fifo_pcimem(struct hfc_multi *hc, u_char *data, int len) | |||
490 | { | 492 | { |
491 | while (len>>2) { | 493 | while (len>>2) { |
492 | *(u32 *)data = | 494 | *(u32 *)data = |
493 | readl((hc->pci_membase)+A_FIFO_DATA0); | 495 | le32_to_cpu(readl(hc->pci_membase + A_FIFO_DATA0)); |
494 | data += 4; | 496 | data += 4; |
495 | len -= 4; | 497 | len -= 4; |
496 | } | 498 | } |
497 | while (len>>1) { | 499 | while (len>>1) { |
498 | *(u16 *)data = | 500 | *(u16 *)data = |
499 | readw((hc->pci_membase)+A_FIFO_DATA0); | 501 | le16_to_cpu(readw(hc->pci_membase + A_FIFO_DATA0)); |
500 | data += 2; | 502 | data += 2; |
501 | len -= 2; | 503 | len -= 2; |
502 | } | 504 | } |
503 | while (len) { | 505 | while (len) { |
504 | *data = readb((hc->pci_membase)+A_FIFO_DATA0); | 506 | *data = readb(hc->pci_membase + A_FIFO_DATA0); |
505 | data++; | 507 | data++; |
506 | len--; | 508 | len--; |
507 | } | 509 | } |
@@ -3971,7 +3973,7 @@ open_bchannel(struct hfc_multi *hc, struct dchannel *dch, | |||
3971 | struct bchannel *bch; | 3973 | struct bchannel *bch; |
3972 | int ch; | 3974 | int ch; |
3973 | 3975 | ||
3974 | if (!test_bit(rq->adr.channel, &dch->dev.channelmap[0])) | 3976 | if (!test_channelmap(rq->adr.channel, dch->dev.channelmap)) |
3975 | return -EINVAL; | 3977 | return -EINVAL; |
3976 | if (rq->protocol == ISDN_P_NONE) | 3978 | if (rq->protocol == ISDN_P_NONE) |
3977 | return -EINVAL; | 3979 | return -EINVAL; |
@@ -4587,7 +4589,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m) | |||
4587 | list_add(&bch->ch.list, &dch->dev.bchannels); | 4589 | list_add(&bch->ch.list, &dch->dev.bchannels); |
4588 | hc->chan[ch].bch = bch; | 4590 | hc->chan[ch].bch = bch; |
4589 | hc->chan[ch].port = 0; | 4591 | hc->chan[ch].port = 0; |
4590 | test_and_set_bit(bch->nr, &dch->dev.channelmap[0]); | 4592 | set_channelmap(bch->nr, dch->dev.channelmap); |
4591 | } | 4593 | } |
4592 | /* set optical line type */ | 4594 | /* set optical line type */ |
4593 | if (port[Port_cnt] & 0x001) { | 4595 | if (port[Port_cnt] & 0x001) { |
@@ -4755,7 +4757,7 @@ init_multi_port(struct hfc_multi *hc, int pt) | |||
4755 | list_add(&bch->ch.list, &dch->dev.bchannels); | 4757 | list_add(&bch->ch.list, &dch->dev.bchannels); |
4756 | hc->chan[i + ch].bch = bch; | 4758 | hc->chan[i + ch].bch = bch; |
4757 | hc->chan[i + ch].port = pt; | 4759 | hc->chan[i + ch].port = pt; |
4758 | test_and_set_bit(bch->nr, &dch->dev.channelmap[0]); | 4760 | set_channelmap(bch->nr, dch->dev.channelmap); |
4759 | } | 4761 | } |
4760 | /* set master clock */ | 4762 | /* set master clock */ |
4761 | if (port[Port_cnt] & 0x001) { | 4763 | if (port[Port_cnt] & 0x001) { |
@@ -5050,12 +5052,12 @@ static void __devexit hfc_remove_pci(struct pci_dev *pdev) | |||
5050 | 5052 | ||
5051 | static const struct hm_map hfcm_map[] = { | 5053 | static const struct hm_map hfcm_map[] = { |
5052 | /*0*/ {VENDOR_BN, "HFC-1S Card (mini PCI)", 4, 1, 1, 3, 0, DIP_4S, 0}, | 5054 | /*0*/ {VENDOR_BN, "HFC-1S Card (mini PCI)", 4, 1, 1, 3, 0, DIP_4S, 0}, |
5053 | /*1*/ {VENDOR_BN, "HFC-2S Card", 4, 2, 1, 3, 0, DIP_4S}, | 5055 | /*1*/ {VENDOR_BN, "HFC-2S Card", 4, 2, 1, 3, 0, DIP_4S, 0}, |
5054 | /*2*/ {VENDOR_BN, "HFC-2S Card (mini PCI)", 4, 2, 1, 3, 0, DIP_4S, 0}, | 5056 | /*2*/ {VENDOR_BN, "HFC-2S Card (mini PCI)", 4, 2, 1, 3, 0, DIP_4S, 0}, |
5055 | /*3*/ {VENDOR_BN, "HFC-4S Card", 4, 4, 1, 2, 0, DIP_4S, 0}, | 5057 | /*3*/ {VENDOR_BN, "HFC-4S Card", 4, 4, 1, 2, 0, DIP_4S, 0}, |
5056 | /*4*/ {VENDOR_BN, "HFC-4S Card (mini PCI)", 4, 4, 1, 2, 0, 0, 0}, | 5058 | /*4*/ {VENDOR_BN, "HFC-4S Card (mini PCI)", 4, 4, 1, 2, 0, 0, 0}, |
5057 | /*5*/ {VENDOR_CCD, "HFC-4S Eval (old)", 4, 4, 0, 0, 0, 0, 0}, | 5059 | /*5*/ {VENDOR_CCD, "HFC-4S Eval (old)", 4, 4, 0, 0, 0, 0, 0}, |
5058 | /*6*/ {VENDOR_CCD, "HFC-4S IOB4ST", 4, 4, 1, 2, 0, 0, 0}, | 5060 | /*6*/ {VENDOR_CCD, "HFC-4S IOB4ST", 4, 4, 1, 2, 0, DIP_4S, 0}, |
5059 | /*7*/ {VENDOR_CCD, "HFC-4S", 4, 4, 1, 2, 0, 0, 0}, | 5061 | /*7*/ {VENDOR_CCD, "HFC-4S", 4, 4, 1, 2, 0, 0, 0}, |
5060 | /*8*/ {VENDOR_DIG, "HFC-4S Card", 4, 4, 0, 2, 0, 0, HFC_IO_MODE_REGIO}, | 5062 | /*8*/ {VENDOR_DIG, "HFC-4S Card", 4, 4, 0, 2, 0, 0, HFC_IO_MODE_REGIO}, |
5061 | /*9*/ {VENDOR_CCD, "HFC-4S Swyx 4xS0 SX2 QuadBri", 4, 4, 1, 2, 0, 0, 0}, | 5063 | /*9*/ {VENDOR_CCD, "HFC-4S Swyx 4xS0 SX2 QuadBri", 4, 4, 1, 2, 0, 0, 0}, |
@@ -5251,9 +5253,6 @@ HFCmulti_init(void) | |||
5251 | if (debug & DEBUG_HFCMULTI_INIT) | 5253 | if (debug & DEBUG_HFCMULTI_INIT) |
5252 | printk(KERN_DEBUG "%s: init entered\n", __func__); | 5254 | printk(KERN_DEBUG "%s: init entered\n", __func__); |
5253 | 5255 | ||
5254 | #ifdef __BIG_ENDIAN | ||
5255 | #error "not running on big endian machines now" | ||
5256 | #endif | ||
5257 | hfc_interrupt = symbol_get(ztdummy_extern_interrupt); | 5256 | hfc_interrupt = symbol_get(ztdummy_extern_interrupt); |
5258 | register_interrupt = symbol_get(ztdummy_register_interrupt); | 5257 | register_interrupt = symbol_get(ztdummy_register_interrupt); |
5259 | unregister_interrupt = symbol_get(ztdummy_unregister_interrupt); | 5258 | unregister_interrupt = symbol_get(ztdummy_unregister_interrupt); |
diff --git a/drivers/isdn/hardware/mISDN/hfcpci.c b/drivers/isdn/hardware/mISDN/hfcpci.c index 3231814e7efa..9cf5edbb1a9b 100644 --- a/drivers/isdn/hardware/mISDN/hfcpci.c +++ b/drivers/isdn/hardware/mISDN/hfcpci.c | |||
@@ -2056,7 +2056,7 @@ setup_card(struct hfc_pci *card) | |||
2056 | card->dch.dev.nrbchan = 2; | 2056 | card->dch.dev.nrbchan = 2; |
2057 | for (i = 0; i < 2; i++) { | 2057 | for (i = 0; i < 2; i++) { |
2058 | card->bch[i].nr = i + 1; | 2058 | card->bch[i].nr = i + 1; |
2059 | test_and_set_bit(i + 1, &card->dch.dev.channelmap[0]); | 2059 | set_channelmap(i + 1, card->dch.dev.channelmap); |
2060 | card->bch[i].debug = debug; | 2060 | card->bch[i].debug = debug; |
2061 | mISDN_initbchannel(&card->bch[i], MAX_DATA_MEM); | 2061 | mISDN_initbchannel(&card->bch[i], MAX_DATA_MEM); |
2062 | card->bch[i].hw = card; | 2062 | card->bch[i].hw = card; |
diff --git a/drivers/isdn/mISDN/l1oip_core.c b/drivers/isdn/mISDN/l1oip_core.c index 155b99780c4f..e42150a57780 100644 --- a/drivers/isdn/mISDN/l1oip_core.c +++ b/drivers/isdn/mISDN/l1oip_core.c | |||
@@ -1006,8 +1006,7 @@ open_bchannel(struct l1oip *hc, struct dchannel *dch, struct channel_req *rq) | |||
1006 | struct bchannel *bch; | 1006 | struct bchannel *bch; |
1007 | int ch; | 1007 | int ch; |
1008 | 1008 | ||
1009 | if (!test_bit(rq->adr.channel & 0x1f, | 1009 | if (!test_channelmap(rq->adr.channel, dch->dev.channelmap)) |
1010 | &dch->dev.channelmap[rq->adr.channel >> 5])) | ||
1011 | return -EINVAL; | 1010 | return -EINVAL; |
1012 | if (rq->protocol == ISDN_P_NONE) | 1011 | if (rq->protocol == ISDN_P_NONE) |
1013 | return -EINVAL; | 1012 | return -EINVAL; |
@@ -1412,8 +1411,7 @@ init_card(struct l1oip *hc, int pri, int bundle) | |||
1412 | bch->ch.nr = i + ch; | 1411 | bch->ch.nr = i + ch; |
1413 | list_add(&bch->ch.list, &dch->dev.bchannels); | 1412 | list_add(&bch->ch.list, &dch->dev.bchannels); |
1414 | hc->chan[i + ch].bch = bch; | 1413 | hc->chan[i + ch].bch = bch; |
1415 | test_and_set_bit(bch->nr & 0x1f, | 1414 | set_channelmap(bch->nr, dch->dev.channelmap); |
1416 | &dch->dev.channelmap[bch->nr >> 5]); | ||
1417 | } | 1415 | } |
1418 | ret = mISDN_register_device(&dch->dev, hc->name); | 1416 | ret = mISDN_register_device(&dch->dev, hc->name); |
1419 | if (ret) | 1417 | if (ret) |
diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c index 4ba4cc364c9e..e5a20f9542d1 100644 --- a/drivers/isdn/mISDN/socket.c +++ b/drivers/isdn/mISDN/socket.c | |||
@@ -379,7 +379,7 @@ data_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
379 | di.Bprotocols = dev->Bprotocols | get_all_Bprotocols(); | 379 | di.Bprotocols = dev->Bprotocols | get_all_Bprotocols(); |
380 | di.protocol = dev->D.protocol; | 380 | di.protocol = dev->D.protocol; |
381 | memcpy(di.channelmap, dev->channelmap, | 381 | memcpy(di.channelmap, dev->channelmap, |
382 | MISDN_CHMAP_SIZE * 4); | 382 | sizeof(di.channelmap)); |
383 | di.nrbchan = dev->nrbchan; | 383 | di.nrbchan = dev->nrbchan; |
384 | strcpy(di.name, dev->name); | 384 | strcpy(di.name, dev->name); |
385 | if (copy_to_user((void __user *)arg, &di, sizeof(di))) | 385 | if (copy_to_user((void __user *)arg, &di, sizeof(di))) |
@@ -637,7 +637,7 @@ base_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
637 | di.Bprotocols = dev->Bprotocols | get_all_Bprotocols(); | 637 | di.Bprotocols = dev->Bprotocols | get_all_Bprotocols(); |
638 | di.protocol = dev->D.protocol; | 638 | di.protocol = dev->D.protocol; |
639 | memcpy(di.channelmap, dev->channelmap, | 639 | memcpy(di.channelmap, dev->channelmap, |
640 | MISDN_CHMAP_SIZE * 4); | 640 | sizeof(di.channelmap)); |
641 | di.nrbchan = dev->nrbchan; | 641 | di.nrbchan = dev->nrbchan; |
642 | strcpy(di.name, dev->name); | 642 | strcpy(di.name, dev->name); |
643 | if (copy_to_user((void __user *)arg, &di, sizeof(di))) | 643 | if (copy_to_user((void __user *)arg, &di, sizeof(di))) |
diff --git a/drivers/macintosh/mediabay.c b/drivers/macintosh/mediabay.c index b1e5b4705250..d7e46d345d9e 100644 --- a/drivers/macintosh/mediabay.c +++ b/drivers/macintosh/mediabay.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <linux/delay.h> | 16 | #include <linux/delay.h> |
17 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
18 | #include <linux/timer.h> | 18 | #include <linux/timer.h> |
19 | #include <linux/hdreg.h> | ||
20 | #include <linux/stddef.h> | 19 | #include <linux/stddef.h> |
21 | #include <linux/init.h> | 20 | #include <linux/init.h> |
22 | #include <linux/ide.h> | 21 | #include <linux/ide.h> |
diff --git a/drivers/media/video/vino.c b/drivers/media/video/vino.c index 3989b0eded28..ef7572cbc4ab 100644 --- a/drivers/media/video/vino.c +++ b/drivers/media/video/vino.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/i2c-algo-sgi.h> | 39 | #include <linux/i2c-algo-sgi.h> |
40 | 40 | ||
41 | #include <linux/videodev2.h> | 41 | #include <linux/videodev2.h> |
42 | #include <media/v4l2-ioctl.h> | ||
42 | #include <media/v4l2-common.h> | 43 | #include <media/v4l2-common.h> |
43 | #include <linux/video_decoder.h> | 44 | #include <linux/video_decoder.h> |
44 | #include <linux/mutex.h> | 45 | #include <linux/mutex.h> |
diff --git a/drivers/misc/sgi-gru/grutlbpurge.c b/drivers/misc/sgi-gru/grutlbpurge.c index bcfd5425e2e6..c84496a77691 100644 --- a/drivers/misc/sgi-gru/grutlbpurge.c +++ b/drivers/misc/sgi-gru/grutlbpurge.c | |||
@@ -34,7 +34,6 @@ | |||
34 | #include <linux/hugetlb.h> | 34 | #include <linux/hugetlb.h> |
35 | #include <linux/delay.h> | 35 | #include <linux/delay.h> |
36 | #include <linux/timex.h> | 36 | #include <linux/timex.h> |
37 | #include <linux/delay.h> | ||
38 | #include <linux/srcu.h> | 37 | #include <linux/srcu.h> |
39 | #include <asm/processor.h> | 38 | #include <asm/processor.h> |
40 | #include "gru.h" | 39 | #include "gru.h" |
diff --git a/drivers/net/stnic.c b/drivers/net/stnic.c index b65be5d70fec..2ed0bd596815 100644 --- a/drivers/net/stnic.c +++ b/drivers/net/stnic.c | |||
@@ -19,7 +19,7 @@ | |||
19 | 19 | ||
20 | #include <asm/system.h> | 20 | #include <asm/system.h> |
21 | #include <asm/io.h> | 21 | #include <asm/io.h> |
22 | #include <asm/se.h> | 22 | #include <mach-se/mach/se.h> |
23 | #include <asm/machvec.h> | 23 | #include <asm/machvec.h> |
24 | #ifdef CONFIG_SH_STANDARD_BIOS | 24 | #ifdef CONFIG_SH_STANDARD_BIOS |
25 | #include <asm/sh_bios.h> | 25 | #include <asm/sh_bios.h> |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 26aa37aa531f..d2439b85a790 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -7687,21 +7687,11 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
7687 | */ | 7687 | */ |
7688 | static int tg3_init_hw(struct tg3 *tp, int reset_phy) | 7688 | static int tg3_init_hw(struct tg3 *tp, int reset_phy) |
7689 | { | 7689 | { |
7690 | int err; | ||
7691 | |||
7692 | /* Force the chip into D0. */ | ||
7693 | err = tg3_set_power_state(tp, PCI_D0); | ||
7694 | if (err) | ||
7695 | goto out; | ||
7696 | |||
7697 | tg3_switch_clocks(tp); | 7690 | tg3_switch_clocks(tp); |
7698 | 7691 | ||
7699 | tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0); | 7692 | tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0); |
7700 | 7693 | ||
7701 | err = tg3_reset_hw(tp, reset_phy); | 7694 | return tg3_reset_hw(tp, reset_phy); |
7702 | |||
7703 | out: | ||
7704 | return err; | ||
7705 | } | 7695 | } |
7706 | 7696 | ||
7707 | #define TG3_STAT_ADD32(PSTAT, REG) \ | 7697 | #define TG3_STAT_ADD32(PSTAT, REG) \ |
@@ -8016,13 +8006,11 @@ static int tg3_open(struct net_device *dev) | |||
8016 | 8006 | ||
8017 | netif_carrier_off(tp->dev); | 8007 | netif_carrier_off(tp->dev); |
8018 | 8008 | ||
8019 | tg3_full_lock(tp, 0); | ||
8020 | |||
8021 | err = tg3_set_power_state(tp, PCI_D0); | 8009 | err = tg3_set_power_state(tp, PCI_D0); |
8022 | if (err) { | 8010 | if (err) |
8023 | tg3_full_unlock(tp); | ||
8024 | return err; | 8011 | return err; |
8025 | } | 8012 | |
8013 | tg3_full_lock(tp, 0); | ||
8026 | 8014 | ||
8027 | tg3_disable_ints(tp); | 8015 | tg3_disable_ints(tp); |
8028 | tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE; | 8016 | tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE; |
diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig index 91fc2c765d90..4c7ff61a1a9c 100644 --- a/drivers/net/wireless/Kconfig +++ b/drivers/net/wireless/Kconfig | |||
@@ -649,6 +649,7 @@ config RTL8187 | |||
649 | Trendnet TEW-424UB | 649 | Trendnet TEW-424UB |
650 | ASUS P5B Deluxe | 650 | ASUS P5B Deluxe |
651 | Toshiba Satellite Pro series of laptops | 651 | Toshiba Satellite Pro series of laptops |
652 | Asus Wireless Link | ||
652 | 653 | ||
653 | Thanks to Realtek for their support! | 654 | Thanks to Realtek for their support! |
654 | 655 | ||
diff --git a/drivers/net/wireless/ath5k/ath5k.h b/drivers/net/wireless/ath5k/ath5k.h index ba35c30d203c..9102eea3c8bf 100644 --- a/drivers/net/wireless/ath5k/ath5k.h +++ b/drivers/net/wireless/ath5k/ath5k.h | |||
@@ -186,11 +186,13 @@ struct ath5k_srev_name { | |||
186 | #define AR5K_SREV_RAD_2111 0x20 | 186 | #define AR5K_SREV_RAD_2111 0x20 |
187 | #define AR5K_SREV_RAD_5112 0x30 | 187 | #define AR5K_SREV_RAD_5112 0x30 |
188 | #define AR5K_SREV_RAD_5112A 0x35 | 188 | #define AR5K_SREV_RAD_5112A 0x35 |
189 | #define AR5K_SREV_RAD_5112B 0x36 | ||
189 | #define AR5K_SREV_RAD_2112 0x40 | 190 | #define AR5K_SREV_RAD_2112 0x40 |
190 | #define AR5K_SREV_RAD_2112A 0x45 | 191 | #define AR5K_SREV_RAD_2112A 0x45 |
191 | #define AR5K_SREV_RAD_SC0 0x56 /* Found on 2413/2414 */ | 192 | #define AR5K_SREV_RAD_2112B 0x46 |
192 | #define AR5K_SREV_RAD_SC1 0x63 /* Found on 5413/5414 */ | 193 | #define AR5K_SREV_RAD_SC0 0x50 /* Found on 2413/2414 */ |
193 | #define AR5K_SREV_RAD_SC2 0xa2 /* Found on 2424-5/5424 */ | 194 | #define AR5K_SREV_RAD_SC1 0x60 /* Found on 5413/5414 */ |
195 | #define AR5K_SREV_RAD_SC2 0xa0 /* Found on 2424-5/5424 */ | ||
194 | #define AR5K_SREV_RAD_5133 0xc0 /* MIMO found on 5418 */ | 196 | #define AR5K_SREV_RAD_5133 0xc0 /* MIMO found on 5418 */ |
195 | 197 | ||
196 | /* IEEE defs */ | 198 | /* IEEE defs */ |
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c index ff3fad794b61..ebf19bc11f5b 100644 --- a/drivers/net/wireless/ath5k/base.c +++ b/drivers/net/wireless/ath5k/base.c | |||
@@ -2170,6 +2170,7 @@ ath5k_beacon_config(struct ath5k_softc *sc) | |||
2170 | 2170 | ||
2171 | ath5k_hw_set_intr(ah, 0); | 2171 | ath5k_hw_set_intr(ah, 0); |
2172 | sc->bmisscount = 0; | 2172 | sc->bmisscount = 0; |
2173 | sc->imask &= ~(AR5K_INT_BMISS | AR5K_INT_SWBA); | ||
2173 | 2174 | ||
2174 | if (sc->opmode == IEEE80211_IF_TYPE_STA) { | 2175 | if (sc->opmode == IEEE80211_IF_TYPE_STA) { |
2175 | sc->imask |= AR5K_INT_BMISS; | 2176 | sc->imask |= AR5K_INT_BMISS; |
diff --git a/drivers/net/wireless/ath5k/debug.c b/drivers/net/wireless/ath5k/debug.c index 41d5fa34b544..6fa6c8e04ff0 100644 --- a/drivers/net/wireless/ath5k/debug.c +++ b/drivers/net/wireless/ath5k/debug.c | |||
@@ -129,7 +129,7 @@ static struct reg regs[] = { | |||
129 | REG_STRUCT_INIT(AR5K_CPC1), | 129 | REG_STRUCT_INIT(AR5K_CPC1), |
130 | REG_STRUCT_INIT(AR5K_CPC2), | 130 | REG_STRUCT_INIT(AR5K_CPC2), |
131 | REG_STRUCT_INIT(AR5K_CPC3), | 131 | REG_STRUCT_INIT(AR5K_CPC3), |
132 | REG_STRUCT_INIT(AR5K_CPCORN), | 132 | REG_STRUCT_INIT(AR5K_CPCOVF), |
133 | REG_STRUCT_INIT(AR5K_RESET_CTL), | 133 | REG_STRUCT_INIT(AR5K_RESET_CTL), |
134 | REG_STRUCT_INIT(AR5K_SLEEP_CTL), | 134 | REG_STRUCT_INIT(AR5K_SLEEP_CTL), |
135 | REG_STRUCT_INIT(AR5K_INTPEND), | 135 | REG_STRUCT_INIT(AR5K_INTPEND), |
diff --git a/drivers/net/wireless/ath5k/debug.h b/drivers/net/wireless/ath5k/debug.h index 2cf8d18b10e3..ffc529393306 100644 --- a/drivers/net/wireless/ath5k/debug.h +++ b/drivers/net/wireless/ath5k/debug.h | |||
@@ -63,7 +63,6 @@ | |||
63 | 63 | ||
64 | struct ath5k_softc; | 64 | struct ath5k_softc; |
65 | struct ath5k_hw; | 65 | struct ath5k_hw; |
66 | struct ieee80211_hw_mode; | ||
67 | struct sk_buff; | 66 | struct sk_buff; |
68 | struct ath5k_buf; | 67 | struct ath5k_buf; |
69 | 68 | ||
diff --git a/drivers/net/wireless/ath5k/hw.c b/drivers/net/wireless/ath5k/hw.c index 7ca87a557312..ad1a5b422c8c 100644 --- a/drivers/net/wireless/ath5k/hw.c +++ b/drivers/net/wireless/ath5k/hw.c | |||
@@ -139,6 +139,8 @@ static int ath5k_hw_post(struct ath5k_hw *ah) | |||
139 | for (c = 0; c < 2; c++) { | 139 | for (c = 0; c < 2; c++) { |
140 | 140 | ||
141 | cur_reg = regs[c]; | 141 | cur_reg = regs[c]; |
142 | |||
143 | /* Save previous value */ | ||
142 | init_val = ath5k_hw_reg_read(ah, cur_reg); | 144 | init_val = ath5k_hw_reg_read(ah, cur_reg); |
143 | 145 | ||
144 | for (i = 0; i < 256; i++) { | 146 | for (i = 0; i < 256; i++) { |
@@ -170,6 +172,10 @@ static int ath5k_hw_post(struct ath5k_hw *ah) | |||
170 | var_pattern = 0x003b080f; | 172 | var_pattern = 0x003b080f; |
171 | ath5k_hw_reg_write(ah, var_pattern, cur_reg); | 173 | ath5k_hw_reg_write(ah, var_pattern, cur_reg); |
172 | } | 174 | } |
175 | |||
176 | /* Restore previous value */ | ||
177 | ath5k_hw_reg_write(ah, init_val, cur_reg); | ||
178 | |||
173 | } | 179 | } |
174 | 180 | ||
175 | return 0; | 181 | return 0; |
@@ -287,67 +293,42 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version) | |||
287 | /* Identify the radio chip*/ | 293 | /* Identify the radio chip*/ |
288 | if (ah->ah_version == AR5K_AR5210) { | 294 | if (ah->ah_version == AR5K_AR5210) { |
289 | ah->ah_radio = AR5K_RF5110; | 295 | ah->ah_radio = AR5K_RF5110; |
296 | /* | ||
297 | * Register returns 0x0/0x04 for radio revision | ||
298 | * so ath5k_hw_radio_revision doesn't parse the value | ||
299 | * correctly. For now we are based on mac's srev to | ||
300 | * identify RF2425 radio. | ||
301 | */ | ||
302 | } else if (srev == AR5K_SREV_VER_AR2425) { | ||
303 | ah->ah_radio = AR5K_RF2425; | ||
304 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF2425; | ||
290 | } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_5112) { | 305 | } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_5112) { |
291 | ah->ah_radio = AR5K_RF5111; | 306 | ah->ah_radio = AR5K_RF5111; |
292 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5111; | 307 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5111; |
293 | } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_SC0) { | 308 | } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_SC0) { |
294 | |||
295 | ah->ah_radio = AR5K_RF5112; | 309 | ah->ah_radio = AR5K_RF5112; |
296 | 310 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5112; | |
297 | if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_5112A) { | ||
298 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5112; | ||
299 | } else { | ||
300 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5112A; | ||
301 | } | ||
302 | |||
303 | } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_SC1) { | 311 | } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_SC1) { |
304 | ah->ah_radio = AR5K_RF2413; | 312 | ah->ah_radio = AR5K_RF2413; |
305 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5112A; | 313 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF2413; |
306 | } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_SC2) { | 314 | } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_SC2) { |
307 | ah->ah_radio = AR5K_RF5413; | 315 | ah->ah_radio = AR5K_RF5413; |
308 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5112A; | 316 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5413; |
309 | } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_5133) { | 317 | } else if (ah->ah_radio_5ghz_revision < AR5K_SREV_RAD_5133) { |
310 | |||
311 | /* AR5424 */ | 318 | /* AR5424 */ |
312 | if (srev >= AR5K_SREV_VER_AR5424) { | 319 | if (srev >= AR5K_SREV_VER_AR5424) { |
313 | ah->ah_radio = AR5K_RF5413; | 320 | ah->ah_radio = AR5K_RF5413; |
314 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5424; | 321 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5413; |
315 | /* AR2424 */ | 322 | /* AR2424 */ |
316 | } else { | 323 | } else { |
317 | ah->ah_radio = AR5K_RF2413; /* For testing */ | 324 | ah->ah_radio = AR5K_RF2413; /* For testing */ |
318 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5112A; | 325 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF2413; |
319 | } | 326 | } |
320 | |||
321 | /* | ||
322 | * Register returns 0x4 for radio revision | ||
323 | * so ath5k_hw_radio_revision doesn't parse the value | ||
324 | * correctly. For now we are based on mac's srev to | ||
325 | * identify RF2425 radio. | ||
326 | */ | ||
327 | } else if (srev == AR5K_SREV_VER_AR2425) { | ||
328 | ah->ah_radio = AR5K_RF2425; | ||
329 | ah->ah_phy_spending = AR5K_PHY_SPENDING_RF5112; | ||
330 | } | 327 | } |
331 | |||
332 | ah->ah_phy = AR5K_PHY(0); | 328 | ah->ah_phy = AR5K_PHY(0); |
333 | 329 | ||
334 | /* | 330 | /* |
335 | * Identify AR5212-based PCI-E cards | 331 | * Write PCI-E power save settings |
336 | * And write some initial settings. | ||
337 | * | ||
338 | * (doing a "strings" on ndis driver | ||
339 | * -ar5211.sys- reveals the following | ||
340 | * pci-e related functions: | ||
341 | * | ||
342 | * pcieClockReq | ||
343 | * pcieRxErrNotify | ||
344 | * pcieL1SKPEnable | ||
345 | * pcieAspm | ||
346 | * pcieDisableAspmOnRfWake | ||
347 | * pciePowerSaveEnable | ||
348 | * | ||
349 | * I guess these point to ClockReq but | ||
350 | * i'm not sure.) | ||
351 | */ | 332 | */ |
352 | if ((ah->ah_version == AR5K_AR5212) && (pdev->is_pcie)) { | 333 | if ((ah->ah_version == AR5K_AR5212) && (pdev->is_pcie)) { |
353 | ath5k_hw_reg_write(ah, 0x9248fc00, 0x4080); | 334 | ath5k_hw_reg_write(ah, 0x9248fc00, 0x4080); |
@@ -369,10 +350,15 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version) | |||
369 | if (ret) | 350 | if (ret) |
370 | goto err_free; | 351 | goto err_free; |
371 | 352 | ||
353 | /* Write AR5K_PCICFG_UNK on 2112B and later chips */ | ||
354 | if (ah->ah_radio_5ghz_revision > AR5K_SREV_RAD_2112B || | ||
355 | srev > AR5K_SREV_VER_AR2413) { | ||
356 | ath5k_hw_reg_write(ah, AR5K_PCICFG_UNK, AR5K_PCICFG); | ||
357 | } | ||
358 | |||
372 | /* | 359 | /* |
373 | * Get card capabilities, values, ... | 360 | * Get card capabilities, values, ... |
374 | */ | 361 | */ |
375 | |||
376 | ret = ath5k_eeprom_init(ah); | 362 | ret = ath5k_eeprom_init(ah); |
377 | if (ret) { | 363 | if (ret) { |
378 | ATH5K_ERR(sc, "unable to init EEPROM\n"); | 364 | ATH5K_ERR(sc, "unable to init EEPROM\n"); |
@@ -843,27 +829,41 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode, | |||
843 | * Write some more initial register settings | 829 | * Write some more initial register settings |
844 | */ | 830 | */ |
845 | if (ah->ah_version == AR5K_AR5212) { | 831 | if (ah->ah_version == AR5K_AR5212) { |
846 | ath5k_hw_reg_write(ah, 0x0002a002, AR5K_PHY(11)); | 832 | ath5k_hw_reg_write(ah, 0x0002a002, 0x982c); |
847 | 833 | ||
848 | if (channel->hw_value == CHANNEL_G) | 834 | if (channel->hw_value == CHANNEL_G) |
849 | if (ah->ah_mac_srev < AR5K_SREV_VER_AR2413) | 835 | if (ah->ah_mac_srev < AR5K_SREV_VER_AR2413) |
850 | ath5k_hw_reg_write(ah, 0x00f80d80, | 836 | ath5k_hw_reg_write(ah, 0x00f80d80, |
851 | AR5K_PHY(83)); | 837 | 0x994c); |
852 | else if (ah->ah_mac_srev < AR5K_SREV_VER_AR2424) | 838 | else if (ah->ah_mac_srev < AR5K_SREV_VER_AR2424) |
853 | ath5k_hw_reg_write(ah, 0x00380140, | 839 | ath5k_hw_reg_write(ah, 0x00380140, |
854 | AR5K_PHY(83)); | 840 | 0x994c); |
855 | else if (ah->ah_mac_srev < AR5K_SREV_VER_AR2425) | 841 | else if (ah->ah_mac_srev < AR5K_SREV_VER_AR2425) |
856 | ath5k_hw_reg_write(ah, 0x00fc0ec0, | 842 | ath5k_hw_reg_write(ah, 0x00fc0ec0, |
857 | AR5K_PHY(83)); | 843 | 0x994c); |
858 | else /* 2425 */ | 844 | else /* 2425 */ |
859 | ath5k_hw_reg_write(ah, 0x00fc0fc0, | 845 | ath5k_hw_reg_write(ah, 0x00fc0fc0, |
860 | AR5K_PHY(83)); | 846 | 0x994c); |
861 | else | 847 | else |
862 | ath5k_hw_reg_write(ah, 0x00000000, | 848 | ath5k_hw_reg_write(ah, 0x00000000, 0x994c); |
863 | AR5K_PHY(83)); | 849 | |
864 | 850 | /* Some bits are disabled here, we know nothing about | |
865 | ath5k_hw_reg_write(ah, 0x000009b5, 0xa228); | 851 | * register 0xa228 yet, most of the times this ends up |
866 | ath5k_hw_reg_write(ah, 0x0000000f, 0x8060); | 852 | * with a value 0x9b5 -haven't seen any dump with |
853 | * a different value- */ | ||
854 | /* Got this from decompiling binary HAL */ | ||
855 | data = ath5k_hw_reg_read(ah, 0xa228); | ||
856 | data &= 0xfffffdff; | ||
857 | ath5k_hw_reg_write(ah, data, 0xa228); | ||
858 | |||
859 | data = ath5k_hw_reg_read(ah, 0xa228); | ||
860 | data &= 0xfffe03ff; | ||
861 | ath5k_hw_reg_write(ah, data, 0xa228); | ||
862 | data = 0; | ||
863 | |||
864 | /* Just write 0x9b5 ? */ | ||
865 | /* ath5k_hw_reg_write(ah, 0x000009b5, 0xa228); */ | ||
866 | ath5k_hw_reg_write(ah, 0x0000000f, AR5K_SEQ_MASK); | ||
867 | ath5k_hw_reg_write(ah, 0x00000000, 0xa254); | 867 | ath5k_hw_reg_write(ah, 0x00000000, 0xa254); |
868 | ath5k_hw_reg_write(ah, 0x0000000e, AR5K_PHY_SCAL); | 868 | ath5k_hw_reg_write(ah, 0x0000000e, AR5K_PHY_SCAL); |
869 | } | 869 | } |
@@ -879,6 +879,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode, | |||
879 | else | 879 | else |
880 | data = 0xffb80d20; | 880 | data = 0xffb80d20; |
881 | ath5k_hw_reg_write(ah, data, AR5K_PHY_FRAME_CTL); | 881 | ath5k_hw_reg_write(ah, data, AR5K_PHY_FRAME_CTL); |
882 | data = 0; | ||
882 | } | 883 | } |
883 | 884 | ||
884 | /* | 885 | /* |
@@ -898,7 +899,6 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode, | |||
898 | 899 | ||
899 | /* | 900 | /* |
900 | * Write RF registers | 901 | * Write RF registers |
901 | * TODO:Does this work on 5211 (5111) ? | ||
902 | */ | 902 | */ |
903 | ret = ath5k_hw_rfregs(ah, channel, mode); | 903 | ret = ath5k_hw_rfregs(ah, channel, mode); |
904 | if (ret) | 904 | if (ret) |
@@ -935,7 +935,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode, | |||
935 | return ret; | 935 | return ret; |
936 | 936 | ||
937 | /* Set antenna mode */ | 937 | /* Set antenna mode */ |
938 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY(0x44), | 938 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY_ANT_CTL, |
939 | ah->ah_antenna[ee_mode][0], 0xfffffc06); | 939 | ah->ah_antenna[ee_mode][0], 0xfffffc06); |
940 | 940 | ||
941 | /* | 941 | /* |
@@ -965,15 +965,15 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode, | |||
965 | 965 | ||
966 | ath5k_hw_reg_write(ah, | 966 | ath5k_hw_reg_write(ah, |
967 | AR5K_PHY_NF_SVAL(ee->ee_noise_floor_thr[ee_mode]), | 967 | AR5K_PHY_NF_SVAL(ee->ee_noise_floor_thr[ee_mode]), |
968 | AR5K_PHY(0x5a)); | 968 | AR5K_PHY_NFTHRES); |
969 | 969 | ||
970 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY(0x11), | 970 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY_SETTLING, |
971 | (ee->ee_switch_settling[ee_mode] << 7) & 0x3f80, | 971 | (ee->ee_switch_settling[ee_mode] << 7) & 0x3f80, |
972 | 0xffffc07f); | 972 | 0xffffc07f); |
973 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY(0x12), | 973 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY_GAIN, |
974 | (ee->ee_ant_tx_rx[ee_mode] << 12) & 0x3f000, | 974 | (ee->ee_ant_tx_rx[ee_mode] << 12) & 0x3f000, |
975 | 0xfffc0fff); | 975 | 0xfffc0fff); |
976 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY(0x14), | 976 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY_DESIRED_SIZE, |
977 | (ee->ee_adc_desired_size[ee_mode] & 0x00ff) | | 977 | (ee->ee_adc_desired_size[ee_mode] & 0x00ff) | |
978 | ((ee->ee_pga_desired_size[ee_mode] << 8) & 0xff00), | 978 | ((ee->ee_pga_desired_size[ee_mode] << 8) & 0xff00), |
979 | 0xffff0000); | 979 | 0xffff0000); |
@@ -982,13 +982,13 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode, | |||
982 | (ee->ee_tx_end2xpa_disable[ee_mode] << 24) | | 982 | (ee->ee_tx_end2xpa_disable[ee_mode] << 24) | |
983 | (ee->ee_tx_end2xpa_disable[ee_mode] << 16) | | 983 | (ee->ee_tx_end2xpa_disable[ee_mode] << 16) | |
984 | (ee->ee_tx_frm2xpa_enable[ee_mode] << 8) | | 984 | (ee->ee_tx_frm2xpa_enable[ee_mode] << 8) | |
985 | (ee->ee_tx_frm2xpa_enable[ee_mode]), AR5K_PHY(0x0d)); | 985 | (ee->ee_tx_frm2xpa_enable[ee_mode]), AR5K_PHY_RF_CTL4); |
986 | 986 | ||
987 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY(0x0a), | 987 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY_RF_CTL3, |
988 | ee->ee_tx_end2xlna_enable[ee_mode] << 8, 0xffff00ff); | 988 | ee->ee_tx_end2xlna_enable[ee_mode] << 8, 0xffff00ff); |
989 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY(0x19), | 989 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY_NF, |
990 | (ee->ee_thr_62[ee_mode] << 12) & 0x7f000, 0xfff80fff); | 990 | (ee->ee_thr_62[ee_mode] << 12) & 0x7f000, 0xfff80fff); |
991 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY(0x49), 4, 0xffffff01); | 991 | AR5K_REG_MASKED_BITS(ah, AR5K_PHY_OFDM_SELFCORR, 4, 0xffffff01); |
992 | 992 | ||
993 | AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, | 993 | AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, |
994 | AR5K_PHY_IQ_CORR_ENABLE | | 994 | AR5K_PHY_IQ_CORR_ENABLE | |
@@ -1063,7 +1063,8 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode, | |||
1063 | ath5k_hw_reg_write(ah, AR5K_PHY_ACT_ENABLE, AR5K_PHY_ACT); | 1063 | ath5k_hw_reg_write(ah, AR5K_PHY_ACT_ENABLE, AR5K_PHY_ACT); |
1064 | 1064 | ||
1065 | /* | 1065 | /* |
1066 | * 5111/5112 Specific | 1066 | * On 5211+ read activation -> rx delay |
1067 | * and use it. | ||
1067 | */ | 1068 | */ |
1068 | if (ah->ah_version != AR5K_AR5210) { | 1069 | if (ah->ah_version != AR5K_AR5210) { |
1069 | data = ath5k_hw_reg_read(ah, AR5K_PHY_RX_DELAY) & | 1070 | data = ath5k_hw_reg_read(ah, AR5K_PHY_RX_DELAY) & |
@@ -1071,40 +1072,77 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode, | |||
1071 | data = (channel->hw_value & CHANNEL_CCK) ? | 1072 | data = (channel->hw_value & CHANNEL_CCK) ? |
1072 | ((data << 2) / 22) : (data / 10); | 1073 | ((data << 2) / 22) : (data / 10); |
1073 | 1074 | ||
1074 | udelay(100 + data); | 1075 | udelay(100 + (2 * data)); |
1076 | data = 0; | ||
1075 | } else { | 1077 | } else { |
1076 | mdelay(1); | 1078 | mdelay(1); |
1077 | } | 1079 | } |
1078 | 1080 | ||
1079 | /* | 1081 | /* |
1080 | * Enable calibration and wait until completion | 1082 | * Perform ADC test (?) |
1083 | */ | ||
1084 | data = ath5k_hw_reg_read(ah, AR5K_PHY_TST1); | ||
1085 | ath5k_hw_reg_write(ah, AR5K_PHY_TST1_TXHOLD, AR5K_PHY_TST1); | ||
1086 | for (i = 0; i <= 20; i++) { | ||
1087 | if (!(ath5k_hw_reg_read(ah, AR5K_PHY_ADC_TEST) & 0x10)) | ||
1088 | break; | ||
1089 | udelay(200); | ||
1090 | } | ||
1091 | ath5k_hw_reg_write(ah, data, AR5K_PHY_TST1); | ||
1092 | data = 0; | ||
1093 | |||
1094 | /* | ||
1095 | * Start automatic gain calibration | ||
1096 | * | ||
1097 | * During AGC calibration RX path is re-routed to | ||
1098 | * a signal detector so we don't receive anything. | ||
1099 | * | ||
1100 | * This method is used to calibrate some static offsets | ||
1101 | * used together with on-the fly I/Q calibration (the | ||
1102 | * one performed via ath5k_hw_phy_calibrate), that doesn't | ||
1103 | * interrupt rx path. | ||
1104 | * | ||
1105 | * If we are in a noisy environment AGC calibration may time | ||
1106 | * out. | ||
1081 | */ | 1107 | */ |
1082 | AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_AGCCTL, | 1108 | AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_AGCCTL, |
1083 | AR5K_PHY_AGCCTL_CAL); | 1109 | AR5K_PHY_AGCCTL_CAL); |
1084 | 1110 | ||
1111 | /* At the same time start I/Q calibration for QAM constellation | ||
1112 | * -no need for CCK- */ | ||
1113 | ah->ah_calibration = false; | ||
1114 | if (!(mode == AR5K_MODE_11B)) { | ||
1115 | ah->ah_calibration = true; | ||
1116 | AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, | ||
1117 | AR5K_PHY_IQ_CAL_NUM_LOG_MAX, 15); | ||
1118 | AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, | ||
1119 | AR5K_PHY_IQ_RUN); | ||
1120 | } | ||
1121 | |||
1122 | /* Wait for gain calibration to finish (we check for I/Q calibration | ||
1123 | * during ath5k_phy_calibrate) */ | ||
1085 | if (ath5k_hw_register_timeout(ah, AR5K_PHY_AGCCTL, | 1124 | if (ath5k_hw_register_timeout(ah, AR5K_PHY_AGCCTL, |
1086 | AR5K_PHY_AGCCTL_CAL, 0, false)) { | 1125 | AR5K_PHY_AGCCTL_CAL, 0, false)) { |
1087 | ATH5K_ERR(ah->ah_sc, "calibration timeout (%uMHz)\n", | 1126 | ATH5K_ERR(ah->ah_sc, "gain calibration timeout (%uMHz)\n", |
1088 | channel->center_freq); | 1127 | channel->center_freq); |
1089 | return -EAGAIN; | 1128 | return -EAGAIN; |
1090 | } | 1129 | } |
1091 | 1130 | ||
1131 | /* | ||
1132 | * Start noise floor calibration | ||
1133 | * | ||
1134 | * If we run NF calibration before AGC, it always times out. | ||
1135 | * Binary HAL starts NF and AGC calibration at the same time | ||
1136 | * and only waits for AGC to finish. I believe that's wrong because | ||
1137 | * during NF calibration, rx path is also routed to a detector, so if | ||
1138 | * it doesn't finish we won't have RX. | ||
1139 | * | ||
1140 | * XXX: Find an interval that's OK for all cards... | ||
1141 | */ | ||
1092 | ret = ath5k_hw_noise_floor_calibration(ah, channel->center_freq); | 1142 | ret = ath5k_hw_noise_floor_calibration(ah, channel->center_freq); |
1093 | if (ret) | 1143 | if (ret) |
1094 | return ret; | 1144 | return ret; |
1095 | 1145 | ||
1096 | ah->ah_calibration = false; | ||
1097 | |||
1098 | /* A and G modes can use QAM modulation which requires enabling | ||
1099 | * I and Q calibration. Don't bother in B mode. */ | ||
1100 | if (!(mode == AR5K_MODE_11B)) { | ||
1101 | ah->ah_calibration = true; | ||
1102 | AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, | ||
1103 | AR5K_PHY_IQ_CAL_NUM_LOG_MAX, 15); | ||
1104 | AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, | ||
1105 | AR5K_PHY_IQ_RUN); | ||
1106 | } | ||
1107 | |||
1108 | /* | 1146 | /* |
1109 | * Reset queues and start beacon timers at the end of the reset routine | 1147 | * Reset queues and start beacon timers at the end of the reset routine |
1110 | */ | 1148 | */ |
@@ -1154,6 +1192,12 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode, | |||
1154 | ath5k_hw_reg_write(ah, AR5K_PHY_SCLOCK_32MHZ, AR5K_PHY_SCLOCK); | 1192 | ath5k_hw_reg_write(ah, AR5K_PHY_SCLOCK_32MHZ, AR5K_PHY_SCLOCK); |
1155 | ath5k_hw_reg_write(ah, AR5K_PHY_SDELAY_32MHZ, AR5K_PHY_SDELAY); | 1193 | ath5k_hw_reg_write(ah, AR5K_PHY_SDELAY_32MHZ, AR5K_PHY_SDELAY); |
1156 | ath5k_hw_reg_write(ah, ah->ah_phy_spending, AR5K_PHY_SPENDING); | 1194 | ath5k_hw_reg_write(ah, ah->ah_phy_spending, AR5K_PHY_SPENDING); |
1195 | |||
1196 | data = ath5k_hw_reg_read(ah, AR5K_USEC_5211) & 0xffffc07f ; | ||
1197 | data |= (ah->ah_phy_spending == AR5K_PHY_SPENDING_18) ? | ||
1198 | 0x00000f80 : 0x00001380 ; | ||
1199 | ath5k_hw_reg_write(ah, data, AR5K_USEC_5211); | ||
1200 | data = 0; | ||
1157 | } | 1201 | } |
1158 | 1202 | ||
1159 | if (ah->ah_version == AR5K_AR5212) { | 1203 | if (ah->ah_version == AR5K_AR5212) { |
@@ -1226,7 +1270,7 @@ int ath5k_hw_set_power(struct ath5k_hw *ah, enum ath5k_power_mode mode, | |||
1226 | bool set_chip, u16 sleep_duration) | 1270 | bool set_chip, u16 sleep_duration) |
1227 | { | 1271 | { |
1228 | unsigned int i; | 1272 | unsigned int i; |
1229 | u32 staid; | 1273 | u32 staid, data; |
1230 | 1274 | ||
1231 | ATH5K_TRACE(ah->ah_sc); | 1275 | ATH5K_TRACE(ah->ah_sc); |
1232 | staid = ath5k_hw_reg_read(ah, AR5K_STA_ID1); | 1276 | staid = ath5k_hw_reg_read(ah, AR5K_STA_ID1); |
@@ -1238,7 +1282,8 @@ int ath5k_hw_set_power(struct ath5k_hw *ah, enum ath5k_power_mode mode, | |||
1238 | case AR5K_PM_NETWORK_SLEEP: | 1282 | case AR5K_PM_NETWORK_SLEEP: |
1239 | if (set_chip) | 1283 | if (set_chip) |
1240 | ath5k_hw_reg_write(ah, | 1284 | ath5k_hw_reg_write(ah, |
1241 | AR5K_SLEEP_CTL_SLE | sleep_duration, | 1285 | AR5K_SLEEP_CTL_SLE_ALLOW | |
1286 | sleep_duration, | ||
1242 | AR5K_SLEEP_CTL); | 1287 | AR5K_SLEEP_CTL); |
1243 | 1288 | ||
1244 | staid |= AR5K_STA_ID1_PWR_SV; | 1289 | staid |= AR5K_STA_ID1_PWR_SV; |
@@ -1253,13 +1298,24 @@ int ath5k_hw_set_power(struct ath5k_hw *ah, enum ath5k_power_mode mode, | |||
1253 | break; | 1298 | break; |
1254 | 1299 | ||
1255 | case AR5K_PM_AWAKE: | 1300 | case AR5K_PM_AWAKE: |
1301 | |||
1302 | staid &= ~AR5K_STA_ID1_PWR_SV; | ||
1303 | |||
1256 | if (!set_chip) | 1304 | if (!set_chip) |
1257 | goto commit; | 1305 | goto commit; |
1258 | 1306 | ||
1259 | ath5k_hw_reg_write(ah, AR5K_SLEEP_CTL_SLE_WAKE, | 1307 | /* Preserve sleep duration */ |
1260 | AR5K_SLEEP_CTL); | 1308 | data = ath5k_hw_reg_read(ah, AR5K_SLEEP_CTL); |
1309 | if( data & 0xffc00000 ){ | ||
1310 | data = 0; | ||
1311 | } else { | ||
1312 | data = data & 0xfffcffff; | ||
1313 | } | ||
1314 | |||
1315 | ath5k_hw_reg_write(ah, data, AR5K_SLEEP_CTL); | ||
1316 | udelay(15); | ||
1261 | 1317 | ||
1262 | for (i = 5000; i > 0; i--) { | 1318 | for (i = 50; i > 0; i--) { |
1263 | /* Check if the chip did wake up */ | 1319 | /* Check if the chip did wake up */ |
1264 | if ((ath5k_hw_reg_read(ah, AR5K_PCICFG) & | 1320 | if ((ath5k_hw_reg_read(ah, AR5K_PCICFG) & |
1265 | AR5K_PCICFG_SPWR_DN) == 0) | 1321 | AR5K_PCICFG_SPWR_DN) == 0) |
@@ -1267,15 +1323,13 @@ int ath5k_hw_set_power(struct ath5k_hw *ah, enum ath5k_power_mode mode, | |||
1267 | 1323 | ||
1268 | /* Wait a bit and retry */ | 1324 | /* Wait a bit and retry */ |
1269 | udelay(200); | 1325 | udelay(200); |
1270 | ath5k_hw_reg_write(ah, AR5K_SLEEP_CTL_SLE_WAKE, | 1326 | ath5k_hw_reg_write(ah, data, AR5K_SLEEP_CTL); |
1271 | AR5K_SLEEP_CTL); | ||
1272 | } | 1327 | } |
1273 | 1328 | ||
1274 | /* Fail if the chip didn't wake up */ | 1329 | /* Fail if the chip didn't wake up */ |
1275 | if (i <= 0) | 1330 | if (i <= 0) |
1276 | return -EIO; | 1331 | return -EIO; |
1277 | 1332 | ||
1278 | staid &= ~AR5K_STA_ID1_PWR_SV; | ||
1279 | break; | 1333 | break; |
1280 | 1334 | ||
1281 | default: | 1335 | default: |
@@ -1304,6 +1358,7 @@ void ath5k_hw_start_rx(struct ath5k_hw *ah) | |||
1304 | { | 1358 | { |
1305 | ATH5K_TRACE(ah->ah_sc); | 1359 | ATH5K_TRACE(ah->ah_sc); |
1306 | ath5k_hw_reg_write(ah, AR5K_CR_RXE, AR5K_CR); | 1360 | ath5k_hw_reg_write(ah, AR5K_CR_RXE, AR5K_CR); |
1361 | ath5k_hw_reg_read(ah, AR5K_CR); | ||
1307 | } | 1362 | } |
1308 | 1363 | ||
1309 | /* | 1364 | /* |
@@ -1390,6 +1445,7 @@ int ath5k_hw_tx_start(struct ath5k_hw *ah, unsigned int queue) | |||
1390 | } | 1445 | } |
1391 | /* Start queue */ | 1446 | /* Start queue */ |
1392 | ath5k_hw_reg_write(ah, tx_queue, AR5K_CR); | 1447 | ath5k_hw_reg_write(ah, tx_queue, AR5K_CR); |
1448 | ath5k_hw_reg_read(ah, AR5K_CR); | ||
1393 | } else { | 1449 | } else { |
1394 | /* Return if queue is disabled */ | 1450 | /* Return if queue is disabled */ |
1395 | if (AR5K_REG_READ_Q(ah, AR5K_QCU_TXD, queue)) | 1451 | if (AR5K_REG_READ_Q(ah, AR5K_QCU_TXD, queue)) |
@@ -1687,6 +1743,7 @@ enum ath5k_int ath5k_hw_set_intr(struct ath5k_hw *ah, enum ath5k_int new_mask) | |||
1687 | * (they will be re-enabled afterwards). | 1743 | * (they will be re-enabled afterwards). |
1688 | */ | 1744 | */ |
1689 | ath5k_hw_reg_write(ah, AR5K_IER_DISABLE, AR5K_IER); | 1745 | ath5k_hw_reg_write(ah, AR5K_IER_DISABLE, AR5K_IER); |
1746 | ath5k_hw_reg_read(ah, AR5K_IER); | ||
1690 | 1747 | ||
1691 | old_mask = ah->ah_imr; | 1748 | old_mask = ah->ah_imr; |
1692 | 1749 | ||
@@ -3363,11 +3420,13 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue) | |||
3363 | ath5k_hw_reg_write(ah, ah->ah_turbo ? | 3420 | ath5k_hw_reg_write(ah, ah->ah_turbo ? |
3364 | AR5K_INIT_PROTO_TIME_CNTRL_TURBO : | 3421 | AR5K_INIT_PROTO_TIME_CNTRL_TURBO : |
3365 | AR5K_INIT_PROTO_TIME_CNTRL, AR5K_IFS1); | 3422 | AR5K_INIT_PROTO_TIME_CNTRL, AR5K_IFS1); |
3366 | /* Set PHY register 0x9844 (??) */ | 3423 | /* Set AR5K_PHY_SETTLING */ |
3367 | ath5k_hw_reg_write(ah, ah->ah_turbo ? | 3424 | ath5k_hw_reg_write(ah, ah->ah_turbo ? |
3368 | (ath5k_hw_reg_read(ah, AR5K_PHY(17)) & ~0x7F) | 0x38 : | 3425 | (ath5k_hw_reg_read(ah, AR5K_PHY_SETTLING) & ~0x7F) |
3369 | (ath5k_hw_reg_read(ah, AR5K_PHY(17)) & ~0x7F) | 0x1C, | 3426 | | 0x38 : |
3370 | AR5K_PHY(17)); | 3427 | (ath5k_hw_reg_read(ah, AR5K_PHY_SETTLING) & ~0x7F) |
3428 | | 0x1C, | ||
3429 | AR5K_PHY_SETTLING); | ||
3371 | /* Set Frame Control Register */ | 3430 | /* Set Frame Control Register */ |
3372 | ath5k_hw_reg_write(ah, ah->ah_turbo ? | 3431 | ath5k_hw_reg_write(ah, ah->ah_turbo ? |
3373 | (AR5K_PHY_FRAME_CTL_INI | AR5K_PHY_TURBO_MODE | | 3432 | (AR5K_PHY_FRAME_CTL_INI | AR5K_PHY_TURBO_MODE | |
@@ -3488,7 +3547,7 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue) | |||
3488 | if (tq->tqi_flags & AR5K_TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE) | 3547 | if (tq->tqi_flags & AR5K_TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE) |
3489 | AR5K_REG_ENABLE_BITS(ah, | 3548 | AR5K_REG_ENABLE_BITS(ah, |
3490 | AR5K_QUEUE_MISC(queue), | 3549 | AR5K_QUEUE_MISC(queue), |
3491 | AR5K_QCU_MISC_TXE); | 3550 | AR5K_QCU_MISC_RDY_VEOL_POLICY); |
3492 | } | 3551 | } |
3493 | 3552 | ||
3494 | if (tq->tqi_flags & AR5K_TXQ_FLAG_BACKOFF_DISABLE) | 3553 | if (tq->tqi_flags & AR5K_TXQ_FLAG_BACKOFF_DISABLE) |
diff --git a/drivers/net/wireless/ath5k/initvals.c b/drivers/net/wireless/ath5k/initvals.c index 04c84e9da89d..2806b21bf90b 100644 --- a/drivers/net/wireless/ath5k/initvals.c +++ b/drivers/net/wireless/ath5k/initvals.c | |||
@@ -489,7 +489,7 @@ static const struct ath5k_ini ar5212_ini[] = { | |||
489 | { AR5K_QUEUE_TXDP(9), 0x00000000 }, | 489 | { AR5K_QUEUE_TXDP(9), 0x00000000 }, |
490 | { AR5K_DCU_FP, 0x00000000 }, | 490 | { AR5K_DCU_FP, 0x00000000 }, |
491 | { AR5K_DCU_TXP, 0x00000000 }, | 491 | { AR5K_DCU_TXP, 0x00000000 }, |
492 | { AR5K_DCU_TX_FILTER, 0x00000000 }, | 492 | { AR5K_DCU_TX_FILTER_0_BASE, 0x00000000 }, |
493 | /* Unknown table */ | 493 | /* Unknown table */ |
494 | { 0x1078, 0x00000000 }, | 494 | { 0x1078, 0x00000000 }, |
495 | { 0x10b8, 0x00000000 }, | 495 | { 0x10b8, 0x00000000 }, |
@@ -679,7 +679,7 @@ static const struct ath5k_ini ar5212_ini[] = { | |||
679 | { AR5K_PHY(645), 0x00106c10 }, | 679 | { AR5K_PHY(645), 0x00106c10 }, |
680 | { AR5K_PHY(646), 0x009c4060 }, | 680 | { AR5K_PHY(646), 0x009c4060 }, |
681 | { AR5K_PHY(647), 0x1483800a }, | 681 | { AR5K_PHY(647), 0x1483800a }, |
682 | /* { AR5K_PHY(648), 0x018830c6 },*/ /* 2413 */ | 682 | /* { AR5K_PHY(648), 0x018830c6 },*/ /* 2413/2425 */ |
683 | { AR5K_PHY(648), 0x01831061 }, | 683 | { AR5K_PHY(648), 0x01831061 }, |
684 | { AR5K_PHY(649), 0x00000400 }, | 684 | { AR5K_PHY(649), 0x00000400 }, |
685 | /*{ AR5K_PHY(650), 0x000001b5 },*/ | 685 | /*{ AR5K_PHY(650), 0x000001b5 },*/ |
diff --git a/drivers/net/wireless/ath5k/phy.c b/drivers/net/wireless/ath5k/phy.c index afd8689e5c03..fa0d47faf574 100644 --- a/drivers/net/wireless/ath5k/phy.c +++ b/drivers/net/wireless/ath5k/phy.c | |||
@@ -1020,6 +1020,74 @@ static const struct ath5k_ini_rfgain rfgain_2413[] = { | |||
1020 | { AR5K_RF_GAIN(63), { 0x000000f9 } }, | 1020 | { AR5K_RF_GAIN(63), { 0x000000f9 } }, |
1021 | }; | 1021 | }; |
1022 | 1022 | ||
1023 | /* Initial RF Gain settings for RF2425 */ | ||
1024 | static const struct ath5k_ini_rfgain rfgain_2425[] = { | ||
1025 | { AR5K_RF_GAIN(0), { 0x00000000 } }, | ||
1026 | { AR5K_RF_GAIN(1), { 0x00000040 } }, | ||
1027 | { AR5K_RF_GAIN(2), { 0x00000080 } }, | ||
1028 | { AR5K_RF_GAIN(3), { 0x00000181 } }, | ||
1029 | { AR5K_RF_GAIN(4), { 0x000001c1 } }, | ||
1030 | { AR5K_RF_GAIN(5), { 0x00000001 } }, | ||
1031 | { AR5K_RF_GAIN(6), { 0x00000041 } }, | ||
1032 | { AR5K_RF_GAIN(7), { 0x00000081 } }, | ||
1033 | { AR5K_RF_GAIN(8), { 0x00000188 } }, | ||
1034 | { AR5K_RF_GAIN(9), { 0x000001c8 } }, | ||
1035 | { AR5K_RF_GAIN(10), { 0x00000008 } }, | ||
1036 | { AR5K_RF_GAIN(11), { 0x00000048 } }, | ||
1037 | { AR5K_RF_GAIN(12), { 0x00000088 } }, | ||
1038 | { AR5K_RF_GAIN(13), { 0x00000189 } }, | ||
1039 | { AR5K_RF_GAIN(14), { 0x000001c9 } }, | ||
1040 | { AR5K_RF_GAIN(15), { 0x00000009 } }, | ||
1041 | { AR5K_RF_GAIN(16), { 0x00000049 } }, | ||
1042 | { AR5K_RF_GAIN(17), { 0x00000089 } }, | ||
1043 | { AR5K_RF_GAIN(18), { 0x000001b0 } }, | ||
1044 | { AR5K_RF_GAIN(19), { 0x000001f0 } }, | ||
1045 | { AR5K_RF_GAIN(20), { 0x00000030 } }, | ||
1046 | { AR5K_RF_GAIN(21), { 0x00000070 } }, | ||
1047 | { AR5K_RF_GAIN(22), { 0x00000171 } }, | ||
1048 | { AR5K_RF_GAIN(23), { 0x000001b1 } }, | ||
1049 | { AR5K_RF_GAIN(24), { 0x000001f1 } }, | ||
1050 | { AR5K_RF_GAIN(25), { 0x00000031 } }, | ||
1051 | { AR5K_RF_GAIN(26), { 0x00000071 } }, | ||
1052 | { AR5K_RF_GAIN(27), { 0x000001b8 } }, | ||
1053 | { AR5K_RF_GAIN(28), { 0x000001f8 } }, | ||
1054 | { AR5K_RF_GAIN(29), { 0x00000038 } }, | ||
1055 | { AR5K_RF_GAIN(30), { 0x00000078 } }, | ||
1056 | { AR5K_RF_GAIN(31), { 0x000000b8 } }, | ||
1057 | { AR5K_RF_GAIN(32), { 0x000001b9 } }, | ||
1058 | { AR5K_RF_GAIN(33), { 0x000001f9 } }, | ||
1059 | { AR5K_RF_GAIN(34), { 0x00000039 } }, | ||
1060 | { AR5K_RF_GAIN(35), { 0x00000079 } }, | ||
1061 | { AR5K_RF_GAIN(36), { 0x000000b9 } }, | ||
1062 | { AR5K_RF_GAIN(37), { 0x000000f9 } }, | ||
1063 | { AR5K_RF_GAIN(38), { 0x000000f9 } }, | ||
1064 | { AR5K_RF_GAIN(39), { 0x000000f9 } }, | ||
1065 | { AR5K_RF_GAIN(40), { 0x000000f9 } }, | ||
1066 | { AR5K_RF_GAIN(41), { 0x000000f9 } }, | ||
1067 | { AR5K_RF_GAIN(42), { 0x000000f9 } }, | ||
1068 | { AR5K_RF_GAIN(43), { 0x000000f9 } }, | ||
1069 | { AR5K_RF_GAIN(44), { 0x000000f9 } }, | ||
1070 | { AR5K_RF_GAIN(45), { 0x000000f9 } }, | ||
1071 | { AR5K_RF_GAIN(46), { 0x000000f9 } }, | ||
1072 | { AR5K_RF_GAIN(47), { 0x000000f9 } }, | ||
1073 | { AR5K_RF_GAIN(48), { 0x000000f9 } }, | ||
1074 | { AR5K_RF_GAIN(49), { 0x000000f9 } }, | ||
1075 | { AR5K_RF_GAIN(50), { 0x000000f9 } }, | ||
1076 | { AR5K_RF_GAIN(51), { 0x000000f9 } }, | ||
1077 | { AR5K_RF_GAIN(52), { 0x000000f9 } }, | ||
1078 | { AR5K_RF_GAIN(53), { 0x000000f9 } }, | ||
1079 | { AR5K_RF_GAIN(54), { 0x000000f9 } }, | ||
1080 | { AR5K_RF_GAIN(55), { 0x000000f9 } }, | ||
1081 | { AR5K_RF_GAIN(56), { 0x000000f9 } }, | ||
1082 | { AR5K_RF_GAIN(57), { 0x000000f9 } }, | ||
1083 | { AR5K_RF_GAIN(58), { 0x000000f9 } }, | ||
1084 | { AR5K_RF_GAIN(59), { 0x000000f9 } }, | ||
1085 | { AR5K_RF_GAIN(60), { 0x000000f9 } }, | ||
1086 | { AR5K_RF_GAIN(61), { 0x000000f9 } }, | ||
1087 | { AR5K_RF_GAIN(62), { 0x000000f9 } }, | ||
1088 | { AR5K_RF_GAIN(63), { 0x000000f9 } }, | ||
1089 | }; | ||
1090 | |||
1023 | static const struct ath5k_gain_opt rfgain_opt_5112 = { | 1091 | static const struct ath5k_gain_opt rfgain_opt_5112 = { |
1024 | 1, | 1092 | 1, |
1025 | 8, | 1093 | 8, |
@@ -1588,8 +1656,8 @@ int ath5k_hw_rfgain(struct ath5k_hw *ah, unsigned int freq) | |||
1588 | freq = 0; /* only 2Ghz */ | 1656 | freq = 0; /* only 2Ghz */ |
1589 | break; | 1657 | break; |
1590 | case AR5K_RF2425: | 1658 | case AR5K_RF2425: |
1591 | ath5k_rfg = rfgain_2413; | 1659 | ath5k_rfg = rfgain_2425; |
1592 | size = ARRAY_SIZE(rfgain_2413); | 1660 | size = ARRAY_SIZE(rfgain_2425); |
1593 | freq = 0; /* only 2Ghz */ | 1661 | freq = 0; /* only 2Ghz */ |
1594 | break; | 1662 | break; |
1595 | default: | 1663 | default: |
@@ -1830,9 +1898,6 @@ static int ath5k_hw_rf5112_channel(struct ath5k_hw *ah, | |||
1830 | data = data0 = data1 = data2 = 0; | 1898 | data = data0 = data1 = data2 = 0; |
1831 | c = channel->center_freq; | 1899 | c = channel->center_freq; |
1832 | 1900 | ||
1833 | /* | ||
1834 | * Set the channel on the RF5112 or newer | ||
1835 | */ | ||
1836 | if (c < 4800) { | 1901 | if (c < 4800) { |
1837 | if (!((c - 2224) % 5)) { | 1902 | if (!((c - 2224) % 5)) { |
1838 | data0 = ((2 * (c - 704)) - 3040) / 10; | 1903 | data0 = ((2 * (c - 704)) - 3040) / 10; |
@@ -1844,7 +1909,7 @@ static int ath5k_hw_rf5112_channel(struct ath5k_hw *ah, | |||
1844 | return -EINVAL; | 1909 | return -EINVAL; |
1845 | 1910 | ||
1846 | data0 = ath5k_hw_bitswap((data0 << 2) & 0xff, 8); | 1911 | data0 = ath5k_hw_bitswap((data0 << 2) & 0xff, 8); |
1847 | } else { | 1912 | } else if ((c - (c % 5)) != 2 || c > 5435) { |
1848 | if (!(c % 20) && c >= 5120) { | 1913 | if (!(c % 20) && c >= 5120) { |
1849 | data0 = ath5k_hw_bitswap(((c - 4800) / 20 << 2), 8); | 1914 | data0 = ath5k_hw_bitswap(((c - 4800) / 20 << 2), 8); |
1850 | data2 = ath5k_hw_bitswap(3, 2); | 1915 | data2 = ath5k_hw_bitswap(3, 2); |
@@ -1856,6 +1921,9 @@ static int ath5k_hw_rf5112_channel(struct ath5k_hw *ah, | |||
1856 | data2 = ath5k_hw_bitswap(1, 2); | 1921 | data2 = ath5k_hw_bitswap(1, 2); |
1857 | } else | 1922 | } else |
1858 | return -EINVAL; | 1923 | return -EINVAL; |
1924 | } else { | ||
1925 | data0 = ath5k_hw_bitswap((10 * (c - 2) - 4800) / 25 + 1, 8); | ||
1926 | data2 = ath5k_hw_bitswap(0, 2); | ||
1859 | } | 1927 | } |
1860 | 1928 | ||
1861 | data = (data0 << 4) | (data1 << 1) | (data2 << 2) | 0x1001; | 1929 | data = (data0 << 4) | (data1 << 1) | (data2 << 2) | 0x1001; |
@@ -1867,6 +1935,45 @@ static int ath5k_hw_rf5112_channel(struct ath5k_hw *ah, | |||
1867 | } | 1935 | } |
1868 | 1936 | ||
1869 | /* | 1937 | /* |
1938 | * Set the channel on the RF2425 | ||
1939 | */ | ||
1940 | static int ath5k_hw_rf2425_channel(struct ath5k_hw *ah, | ||
1941 | struct ieee80211_channel *channel) | ||
1942 | { | ||
1943 | u32 data, data0, data2; | ||
1944 | u16 c; | ||
1945 | |||
1946 | data = data0 = data2 = 0; | ||
1947 | c = channel->center_freq; | ||
1948 | |||
1949 | if (c < 4800) { | ||
1950 | data0 = ath5k_hw_bitswap((c - 2272), 8); | ||
1951 | data2 = 0; | ||
1952 | /* ? 5GHz ? */ | ||
1953 | } else if ((c - (c % 5)) != 2 || c > 5435) { | ||
1954 | if (!(c % 20) && c < 5120) | ||
1955 | data0 = ath5k_hw_bitswap(((c - 4800) / 20 << 2), 8); | ||
1956 | else if (!(c % 10)) | ||
1957 | data0 = ath5k_hw_bitswap(((c - 4800) / 10 << 1), 8); | ||
1958 | else if (!(c % 5)) | ||
1959 | data0 = ath5k_hw_bitswap((c - 4800) / 5, 8); | ||
1960 | else | ||
1961 | return -EINVAL; | ||
1962 | data2 = ath5k_hw_bitswap(1, 2); | ||
1963 | } else { | ||
1964 | data0 = ath5k_hw_bitswap((10 * (c - 2) - 4800) / 25 + 1, 8); | ||
1965 | data2 = ath5k_hw_bitswap(0, 2); | ||
1966 | } | ||
1967 | |||
1968 | data = (data0 << 4) | data2 << 2 | 0x1001; | ||
1969 | |||
1970 | ath5k_hw_reg_write(ah, data & 0xff, AR5K_RF_BUFFER); | ||
1971 | ath5k_hw_reg_write(ah, (data >> 8) & 0x7f, AR5K_RF_BUFFER_CONTROL_5); | ||
1972 | |||
1973 | return 0; | ||
1974 | } | ||
1975 | |||
1976 | /* | ||
1870 | * Set a channel on the radio chip | 1977 | * Set a channel on the radio chip |
1871 | */ | 1978 | */ |
1872 | int ath5k_hw_channel(struct ath5k_hw *ah, struct ieee80211_channel *channel) | 1979 | int ath5k_hw_channel(struct ath5k_hw *ah, struct ieee80211_channel *channel) |
@@ -1895,6 +2002,9 @@ int ath5k_hw_channel(struct ath5k_hw *ah, struct ieee80211_channel *channel) | |||
1895 | case AR5K_RF5111: | 2002 | case AR5K_RF5111: |
1896 | ret = ath5k_hw_rf5111_channel(ah, channel); | 2003 | ret = ath5k_hw_rf5111_channel(ah, channel); |
1897 | break; | 2004 | break; |
2005 | case AR5K_RF2425: | ||
2006 | ret = ath5k_hw_rf2425_channel(ah, channel); | ||
2007 | break; | ||
1898 | default: | 2008 | default: |
1899 | ret = ath5k_hw_rf5112_channel(ah, channel); | 2009 | ret = ath5k_hw_rf5112_channel(ah, channel); |
1900 | break; | 2010 | break; |
@@ -1903,6 +2013,15 @@ int ath5k_hw_channel(struct ath5k_hw *ah, struct ieee80211_channel *channel) | |||
1903 | if (ret) | 2013 | if (ret) |
1904 | return ret; | 2014 | return ret; |
1905 | 2015 | ||
2016 | /* Set JAPAN setting for channel 14 */ | ||
2017 | if (channel->center_freq == 2484) { | ||
2018 | AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_CCKTXCTL, | ||
2019 | AR5K_PHY_CCKTXCTL_JAPAN); | ||
2020 | } else { | ||
2021 | AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_CCKTXCTL, | ||
2022 | AR5K_PHY_CCKTXCTL_WORLD); | ||
2023 | } | ||
2024 | |||
1906 | ah->ah_current_channel.center_freq = channel->center_freq; | 2025 | ah->ah_current_channel.center_freq = channel->center_freq; |
1907 | ah->ah_current_channel.hw_value = channel->hw_value; | 2026 | ah->ah_current_channel.hw_value = channel->hw_value; |
1908 | ah->ah_turbo = channel->hw_value == CHANNEL_T ? true : false; | 2027 | ah->ah_turbo = channel->hw_value == CHANNEL_T ? true : false; |
@@ -1933,6 +2052,8 @@ int ath5k_hw_channel(struct ath5k_hw *ah, struct ieee80211_channel *channel) | |||
1933 | * http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&Sect2=HITOFF&d=PALL \ | 2052 | * http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&Sect2=HITOFF&d=PALL \ |
1934 | * &p=1&u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&r=1&f=G&l=50&s1=7245893.PN.&OS=PN/7 | 2053 | * &p=1&u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&r=1&f=G&l=50&s1=7245893.PN.&OS=PN/7 |
1935 | * | 2054 | * |
2055 | * XXX: Since during noise floor calibration antennas are detached according to | ||
2056 | * the patent, we should stop tx queues here. | ||
1936 | */ | 2057 | */ |
1937 | int | 2058 | int |
1938 | ath5k_hw_noise_floor_calibration(struct ath5k_hw *ah, short freq) | 2059 | ath5k_hw_noise_floor_calibration(struct ath5k_hw *ah, short freq) |
@@ -1942,7 +2063,7 @@ ath5k_hw_noise_floor_calibration(struct ath5k_hw *ah, short freq) | |||
1942 | s32 noise_floor; | 2063 | s32 noise_floor; |
1943 | 2064 | ||
1944 | /* | 2065 | /* |
1945 | * Enable noise floor calibration and wait until completion | 2066 | * Enable noise floor calibration |
1946 | */ | 2067 | */ |
1947 | AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_AGCCTL, | 2068 | AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_AGCCTL, |
1948 | AR5K_PHY_AGCCTL_NF); | 2069 | AR5K_PHY_AGCCTL_NF); |
@@ -1952,7 +2073,7 @@ ath5k_hw_noise_floor_calibration(struct ath5k_hw *ah, short freq) | |||
1952 | if (ret) { | 2073 | if (ret) { |
1953 | ATH5K_ERR(ah->ah_sc, | 2074 | ATH5K_ERR(ah->ah_sc, |
1954 | "noise floor calibration timeout (%uMHz)\n", freq); | 2075 | "noise floor calibration timeout (%uMHz)\n", freq); |
1955 | return ret; | 2076 | return -EAGAIN; |
1956 | } | 2077 | } |
1957 | 2078 | ||
1958 | /* Wait until the noise floor is calibrated and read the value */ | 2079 | /* Wait until the noise floor is calibrated and read the value */ |
@@ -1974,7 +2095,7 @@ ath5k_hw_noise_floor_calibration(struct ath5k_hw *ah, short freq) | |||
1974 | if (noise_floor > AR5K_TUNE_NOISE_FLOOR) { | 2095 | if (noise_floor > AR5K_TUNE_NOISE_FLOOR) { |
1975 | ATH5K_ERR(ah->ah_sc, | 2096 | ATH5K_ERR(ah->ah_sc, |
1976 | "noise floor calibration failed (%uMHz)\n", freq); | 2097 | "noise floor calibration failed (%uMHz)\n", freq); |
1977 | return -EIO; | 2098 | return -EAGAIN; |
1978 | } | 2099 | } |
1979 | 2100 | ||
1980 | ah->ah_noise_floor = noise_floor; | 2101 | ah->ah_noise_floor = noise_floor; |
@@ -2087,38 +2208,66 @@ static int ath5k_hw_rf5110_calibrate(struct ath5k_hw *ah, | |||
2087 | } | 2208 | } |
2088 | 2209 | ||
2089 | /* | 2210 | /* |
2090 | * Perform a PHY calibration on RF5111/5112 | 2211 | * Perform a PHY calibration on RF5111/5112 and newer chips |
2091 | */ | 2212 | */ |
2092 | static int ath5k_hw_rf511x_calibrate(struct ath5k_hw *ah, | 2213 | static int ath5k_hw_rf511x_calibrate(struct ath5k_hw *ah, |
2093 | struct ieee80211_channel *channel) | 2214 | struct ieee80211_channel *channel) |
2094 | { | 2215 | { |
2095 | u32 i_pwr, q_pwr; | 2216 | u32 i_pwr, q_pwr; |
2096 | s32 iq_corr, i_coff, i_coffd, q_coff, q_coffd; | 2217 | s32 iq_corr, i_coff, i_coffd, q_coff, q_coffd; |
2218 | int i; | ||
2097 | ATH5K_TRACE(ah->ah_sc); | 2219 | ATH5K_TRACE(ah->ah_sc); |
2098 | 2220 | ||
2099 | if (!ah->ah_calibration || | 2221 | if (!ah->ah_calibration || |
2100 | ath5k_hw_reg_read(ah, AR5K_PHY_IQ) & AR5K_PHY_IQ_RUN) | 2222 | ath5k_hw_reg_read(ah, AR5K_PHY_IQ) & AR5K_PHY_IQ_RUN) |
2101 | goto done; | 2223 | goto done; |
2102 | 2224 | ||
2103 | ah->ah_calibration = false; | 2225 | /* Calibration has finished, get the results and re-run */ |
2226 | for (i = 0; i <= 10; i++) { | ||
2227 | iq_corr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_CORR); | ||
2228 | i_pwr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_PWR_I); | ||
2229 | q_pwr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_PWR_Q); | ||
2230 | } | ||
2104 | 2231 | ||
2105 | iq_corr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_CORR); | ||
2106 | i_pwr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_PWR_I); | ||
2107 | q_pwr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_PWR_Q); | ||
2108 | i_coffd = ((i_pwr >> 1) + (q_pwr >> 1)) >> 7; | 2232 | i_coffd = ((i_pwr >> 1) + (q_pwr >> 1)) >> 7; |
2109 | q_coffd = q_pwr >> 6; | 2233 | q_coffd = q_pwr >> 7; |
2110 | 2234 | ||
2235 | /* No correction */ | ||
2111 | if (i_coffd == 0 || q_coffd == 0) | 2236 | if (i_coffd == 0 || q_coffd == 0) |
2112 | goto done; | 2237 | goto done; |
2113 | 2238 | ||
2114 | i_coff = ((-iq_corr) / i_coffd) & 0x3f; | 2239 | i_coff = ((-iq_corr) / i_coffd) & 0x3f; |
2115 | q_coff = (((s32)i_pwr / q_coffd) - 64) & 0x1f; | ||
2116 | 2240 | ||
2117 | /* Commit new IQ value */ | 2241 | /* Boundary check */ |
2242 | if (i_coff > 31) | ||
2243 | i_coff = 31; | ||
2244 | if (i_coff < -32) | ||
2245 | i_coff = -32; | ||
2246 | |||
2247 | q_coff = (((s32)i_pwr / q_coffd) - 128) & 0x1f; | ||
2248 | |||
2249 | /* Boundary check */ | ||
2250 | if (q_coff > 15) | ||
2251 | q_coff = 15; | ||
2252 | if (q_coff < -16) | ||
2253 | q_coff = -16; | ||
2254 | |||
2255 | /* Commit new I/Q value */ | ||
2118 | AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_ENABLE | | 2256 | AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_ENABLE | |
2119 | ((u32)q_coff) | ((u32)i_coff << AR5K_PHY_IQ_CORR_Q_I_COFF_S)); | 2257 | ((u32)q_coff) | ((u32)i_coff << AR5K_PHY_IQ_CORR_Q_I_COFF_S)); |
2120 | 2258 | ||
2259 | /* Re-enable calibration -if we don't we'll commit | ||
2260 | * the same values again and again */ | ||
2261 | AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, | ||
2262 | AR5K_PHY_IQ_CAL_NUM_LOG_MAX, 15); | ||
2263 | AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_RUN); | ||
2264 | |||
2121 | done: | 2265 | done: |
2266 | |||
2267 | /* TODO: Separate noise floor calibration from I/Q calibration | ||
2268 | * since noise floor calibration interrupts rx path while I/Q | ||
2269 | * calibration doesn't. We don't need to run noise floor calibration | ||
2270 | * as often as I/Q calibration.*/ | ||
2122 | ath5k_hw_noise_floor_calibration(ah, channel->center_freq); | 2271 | ath5k_hw_noise_floor_calibration(ah, channel->center_freq); |
2123 | 2272 | ||
2124 | /* Request RF gain */ | 2273 | /* Request RF gain */ |
diff --git a/drivers/net/wireless/ath5k/reg.h b/drivers/net/wireless/ath5k/reg.h index 30629b3e37c2..7562bf173d3e 100644 --- a/drivers/net/wireless/ath5k/reg.h +++ b/drivers/net/wireless/ath5k/reg.h | |||
@@ -53,7 +53,7 @@ | |||
53 | #define AR5K_CR_TXD0 0x00000008 /* TX Disable for queue 0 on 5210 */ | 53 | #define AR5K_CR_TXD0 0x00000008 /* TX Disable for queue 0 on 5210 */ |
54 | #define AR5K_CR_TXD1 0x00000010 /* TX Disable for queue 1 on 5210 */ | 54 | #define AR5K_CR_TXD1 0x00000010 /* TX Disable for queue 1 on 5210 */ |
55 | #define AR5K_CR_RXD 0x00000020 /* RX Disable */ | 55 | #define AR5K_CR_RXD 0x00000020 /* RX Disable */ |
56 | #define AR5K_CR_SWI 0x00000040 | 56 | #define AR5K_CR_SWI 0x00000040 /* Software Interrupt */ |
57 | 57 | ||
58 | /* | 58 | /* |
59 | * RX Descriptor Pointer register | 59 | * RX Descriptor Pointer register |
@@ -65,19 +65,19 @@ | |||
65 | */ | 65 | */ |
66 | #define AR5K_CFG 0x0014 /* Register Address */ | 66 | #define AR5K_CFG 0x0014 /* Register Address */ |
67 | #define AR5K_CFG_SWTD 0x00000001 /* Byte-swap TX descriptor (for big endian archs) */ | 67 | #define AR5K_CFG_SWTD 0x00000001 /* Byte-swap TX descriptor (for big endian archs) */ |
68 | #define AR5K_CFG_SWTB 0x00000002 /* Byte-swap TX buffer (?) */ | 68 | #define AR5K_CFG_SWTB 0x00000002 /* Byte-swap TX buffer */ |
69 | #define AR5K_CFG_SWRD 0x00000004 /* Byte-swap RX descriptor */ | 69 | #define AR5K_CFG_SWRD 0x00000004 /* Byte-swap RX descriptor */ |
70 | #define AR5K_CFG_SWRB 0x00000008 /* Byte-swap RX buffer (?) */ | 70 | #define AR5K_CFG_SWRB 0x00000008 /* Byte-swap RX buffer */ |
71 | #define AR5K_CFG_SWRG 0x00000010 /* Byte-swap Register values (?) */ | 71 | #define AR5K_CFG_SWRG 0x00000010 /* Byte-swap Register access */ |
72 | #define AR5K_CFG_ADHOC 0x00000020 /* [5211+] */ | 72 | #define AR5K_CFG_ADHOC 0x00000020 /* AP/Adhoc indication [5211+] */ |
73 | #define AR5K_CFG_PHY_OK 0x00000100 /* [5211+] */ | 73 | #define AR5K_CFG_PHY_OK 0x00000100 /* [5211+] */ |
74 | #define AR5K_CFG_EEBS 0x00000200 /* EEPROM is busy */ | 74 | #define AR5K_CFG_EEBS 0x00000200 /* EEPROM is busy */ |
75 | #define AR5K_CFG_CLKGD 0x00000400 /* Clock gated (?) */ | 75 | #define AR5K_CFG_CLKGD 0x00000400 /* Clock gated (Disable dynamic clock) */ |
76 | #define AR5K_CFG_TXCNT 0x00007800 /* Tx frame count (?) [5210] */ | 76 | #define AR5K_CFG_TXCNT 0x00007800 /* Tx frame count (?) [5210] */ |
77 | #define AR5K_CFG_TXCNT_S 11 | 77 | #define AR5K_CFG_TXCNT_S 11 |
78 | #define AR5K_CFG_TXFSTAT 0x00008000 /* Tx frame status (?) [5210] */ | 78 | #define AR5K_CFG_TXFSTAT 0x00008000 /* Tx frame status (?) [5210] */ |
79 | #define AR5K_CFG_TXFSTRT 0x00010000 /* [5210] */ | 79 | #define AR5K_CFG_TXFSTRT 0x00010000 /* [5210] */ |
80 | #define AR5K_CFG_PCI_THRES 0x00060000 /* [5211+] */ | 80 | #define AR5K_CFG_PCI_THRES 0x00060000 /* PCI Master req q threshold [5211+] */ |
81 | #define AR5K_CFG_PCI_THRES_S 17 | 81 | #define AR5K_CFG_PCI_THRES_S 17 |
82 | 82 | ||
83 | /* | 83 | /* |
@@ -162,35 +162,40 @@ | |||
162 | /* | 162 | /* |
163 | * Transmit configuration register | 163 | * Transmit configuration register |
164 | */ | 164 | */ |
165 | #define AR5K_TXCFG 0x0030 /* Register Address */ | 165 | #define AR5K_TXCFG 0x0030 /* Register Address */ |
166 | #define AR5K_TXCFG_SDMAMR 0x00000007 /* DMA size */ | 166 | #define AR5K_TXCFG_SDMAMR 0x00000007 /* DMA size (read) */ |
167 | #define AR5K_TXCFG_SDMAMR_S 0 | 167 | #define AR5K_TXCFG_SDMAMR_S 0 |
168 | #define AR5K_TXCFG_B_MODE 0x00000008 /* Set b mode for 5111 (enable 2111) */ | 168 | #define AR5K_TXCFG_B_MODE 0x00000008 /* Set b mode for 5111 (enable 2111) */ |
169 | #define AR5K_TXCFG_TXFSTP 0x00000008 /* TX DMA full Stop [5210] */ | 169 | #define AR5K_TXCFG_TXFSTP 0x00000008 /* TX DMA full Stop [5210] */ |
170 | #define AR5K_TXCFG_TXFULL 0x000003f0 /* TX Triger level mask */ | 170 | #define AR5K_TXCFG_TXFULL 0x000003f0 /* TX Triger level mask */ |
171 | #define AR5K_TXCFG_TXFULL_S 4 | 171 | #define AR5K_TXCFG_TXFULL_S 4 |
172 | #define AR5K_TXCFG_TXFULL_0B 0x00000000 | 172 | #define AR5K_TXCFG_TXFULL_0B 0x00000000 |
173 | #define AR5K_TXCFG_TXFULL_64B 0x00000010 | 173 | #define AR5K_TXCFG_TXFULL_64B 0x00000010 |
174 | #define AR5K_TXCFG_TXFULL_128B 0x00000020 | 174 | #define AR5K_TXCFG_TXFULL_128B 0x00000020 |
175 | #define AR5K_TXCFG_TXFULL_192B 0x00000030 | 175 | #define AR5K_TXCFG_TXFULL_192B 0x00000030 |
176 | #define AR5K_TXCFG_TXFULL_256B 0x00000040 | 176 | #define AR5K_TXCFG_TXFULL_256B 0x00000040 |
177 | #define AR5K_TXCFG_TXCONT_EN 0x00000080 | 177 | #define AR5K_TXCFG_TXCONT_EN 0x00000080 |
178 | #define AR5K_TXCFG_DMASIZE 0x00000100 /* Flag for passing DMA size [5210] */ | 178 | #define AR5K_TXCFG_DMASIZE 0x00000100 /* Flag for passing DMA size [5210] */ |
179 | #define AR5K_TXCFG_JUMBO_TXE 0x00000400 /* Enable jumbo frames transmition (?) [5211+] */ | 179 | #define AR5K_TXCFG_JUMBO_DESC_EN 0x00000400 /* Enable jumbo tx descriptors [5211+] */ |
180 | #define AR5K_TXCFG_RTSRND 0x00001000 /* [5211+] */ | 180 | #define AR5K_TXCFG_ADHOC_BCN_ATIM 0x00000800 /* Adhoc Beacon ATIM Policy */ |
181 | #define AR5K_TXCFG_FRMPAD_DIS 0x00002000 /* [5211+] */ | 181 | #define AR5K_TXCFG_ATIM_WINDOW_DEF_DIS 0x00001000 /* Disable ATIM window defer [5211+] */ |
182 | #define AR5K_TXCFG_RDY_DIS 0x00004000 /* [5211+] */ | 182 | #define AR5K_TXCFG_RTSRND 0x00001000 /* [5211+] */ |
183 | #define AR5K_TXCFG_FRMPAD_DIS 0x00002000 /* [5211+] */ | ||
184 | #define AR5K_TXCFG_RDY_CBR_DIS 0x00004000 /* Ready time CBR disable [5211+] */ | ||
185 | #define AR5K_TXCFG_JUMBO_FRM_MODE 0x00008000 /* Jumbo frame mode [5211+] */ | ||
186 | #define AR5K_TXCFG_DCU_CACHING_DIS 0x00010000 /* Disable DCU caching */ | ||
183 | 187 | ||
184 | /* | 188 | /* |
185 | * Receive configuration register | 189 | * Receive configuration register |
186 | */ | 190 | */ |
187 | #define AR5K_RXCFG 0x0034 /* Register Address */ | 191 | #define AR5K_RXCFG 0x0034 /* Register Address */ |
188 | #define AR5K_RXCFG_SDMAMW 0x00000007 /* DMA size */ | 192 | #define AR5K_RXCFG_SDMAMW 0x00000007 /* DMA size (write) */ |
189 | #define AR5K_RXCFG_SDMAMW_S 0 | 193 | #define AR5K_RXCFG_SDMAMW_S 0 |
190 | #define AR5K_RXCFG_DEF_ANTENNA 0x00000008 /* Default antenna */ | 194 | #define AR5K_RXCFG_ZLFDMA 0x00000008 /* Enable Zero-length frame DMA */ |
191 | #define AR5K_RXCFG_ZLFDMA 0x00000010 /* Zero-length DMA */ | 195 | #define AR5K_RXCFG_DEF_ANTENNA 0x00000010 /* Default antenna (?) */ |
192 | #define AR5K_RXCFG_JUMBO_RXE 0x00000020 /* Enable jumbo frames reception (?) [5211+] */ | 196 | #define AR5K_RXCFG_JUMBO_RXE 0x00000020 /* Enable jumbo rx descriptors [5211+] */ |
193 | #define AR5K_RXCFG_JUMBO_WRAP 0x00000040 /* Wrap jumbo frames (?) [5211+] */ | 197 | #define AR5K_RXCFG_JUMBO_WRAP 0x00000040 /* Wrap jumbo frames [5211+] */ |
198 | #define AR5K_RXCFG_SLE_ENTRY 0x00000080 /* Sleep entry policy */ | ||
194 | 199 | ||
195 | /* | 200 | /* |
196 | * Receive jumbo descriptor last address register | 201 | * Receive jumbo descriptor last address register |
@@ -202,35 +207,35 @@ | |||
202 | * MIB control register | 207 | * MIB control register |
203 | */ | 208 | */ |
204 | #define AR5K_MIBC 0x0040 /* Register Address */ | 209 | #define AR5K_MIBC 0x0040 /* Register Address */ |
205 | #define AR5K_MIBC_COW 0x00000001 | 210 | #define AR5K_MIBC_COW 0x00000001 /* Warn test indicator */ |
206 | #define AR5K_MIBC_FMC 0x00000002 /* Freeze Mib Counters (?) */ | 211 | #define AR5K_MIBC_FMC 0x00000002 /* Freeze MIB Counters */ |
207 | #define AR5K_MIBC_CMC 0x00000004 /* Clean Mib Counters (?) */ | 212 | #define AR5K_MIBC_CMC 0x00000004 /* Clean MIB Counters */ |
208 | #define AR5K_MIBC_MCS 0x00000008 | 213 | #define AR5K_MIBC_MCS 0x00000008 /* MIB counter strobe */ |
209 | 214 | ||
210 | /* | 215 | /* |
211 | * Timeout prescale register | 216 | * Timeout prescale register |
212 | */ | 217 | */ |
213 | #define AR5K_TOPS 0x0044 | 218 | #define AR5K_TOPS 0x0044 |
214 | #define AR5K_TOPS_M 0x0000ffff /* [5211+] (?) */ | 219 | #define AR5K_TOPS_M 0x0000ffff |
215 | 220 | ||
216 | /* | 221 | /* |
217 | * Receive timeout register (no frame received) | 222 | * Receive timeout register (no frame received) |
218 | */ | 223 | */ |
219 | #define AR5K_RXNOFRM 0x0048 | 224 | #define AR5K_RXNOFRM 0x0048 |
220 | #define AR5K_RXNOFRM_M 0x000003ff /* [5211+] (?) */ | 225 | #define AR5K_RXNOFRM_M 0x000003ff |
221 | 226 | ||
222 | /* | 227 | /* |
223 | * Transmit timeout register (no frame sent) | 228 | * Transmit timeout register (no frame sent) |
224 | */ | 229 | */ |
225 | #define AR5K_TXNOFRM 0x004c | 230 | #define AR5K_TXNOFRM 0x004c |
226 | #define AR5K_TXNOFRM_M 0x000003ff /* [5211+] (?) */ | 231 | #define AR5K_TXNOFRM_M 0x000003ff |
227 | #define AR5K_TXNOFRM_QCU 0x000ffc00 /* [5211+] (?) */ | 232 | #define AR5K_TXNOFRM_QCU 0x000ffc00 |
228 | 233 | ||
229 | /* | 234 | /* |
230 | * Receive frame gap timeout register | 235 | * Receive frame gap timeout register |
231 | */ | 236 | */ |
232 | #define AR5K_RPGTO 0x0050 | 237 | #define AR5K_RPGTO 0x0050 |
233 | #define AR5K_RPGTO_M 0x000003ff /* [5211+] (?) */ | 238 | #define AR5K_RPGTO_M 0x000003ff |
234 | 239 | ||
235 | /* | 240 | /* |
236 | * Receive frame count limit register | 241 | * Receive frame count limit register |
@@ -241,6 +246,7 @@ | |||
241 | 246 | ||
242 | /* | 247 | /* |
243 | * Misc settings register | 248 | * Misc settings register |
249 | * (reserved0-3) | ||
244 | */ | 250 | */ |
245 | #define AR5K_MISC 0x0058 /* Register Address */ | 251 | #define AR5K_MISC 0x0058 /* Register Address */ |
246 | #define AR5K_MISC_DMA_OBS_M 0x000001e0 | 252 | #define AR5K_MISC_DMA_OBS_M 0x000001e0 |
@@ -256,6 +262,7 @@ | |||
256 | 262 | ||
257 | /* | 263 | /* |
258 | * QCU/DCU clock gating register (5311) | 264 | * QCU/DCU clock gating register (5311) |
265 | * (reserved4-5) | ||
259 | */ | 266 | */ |
260 | #define AR5K_QCUDCU_CLKGT 0x005c /* Register Address (?) */ | 267 | #define AR5K_QCUDCU_CLKGT 0x005c /* Register Address (?) */ |
261 | #define AR5K_QCUDCU_CLKGT_QCU 0x0000ffff /* Mask for QCU clock */ | 268 | #define AR5K_QCUDCU_CLKGT_QCU 0x0000ffff /* Mask for QCU clock */ |
@@ -284,18 +291,18 @@ | |||
284 | #define AR5K_ISR_TXEOL 0x00000400 /* Empty TX descriptor */ | 291 | #define AR5K_ISR_TXEOL 0x00000400 /* Empty TX descriptor */ |
285 | #define AR5K_ISR_TXURN 0x00000800 /* Transmit FIFO underrun */ | 292 | #define AR5K_ISR_TXURN 0x00000800 /* Transmit FIFO underrun */ |
286 | #define AR5K_ISR_MIB 0x00001000 /* Update MIB counters */ | 293 | #define AR5K_ISR_MIB 0x00001000 /* Update MIB counters */ |
287 | #define AR5K_ISR_SWI 0x00002000 /* Software interrupt (?) */ | 294 | #define AR5K_ISR_SWI 0x00002000 /* Software interrupt */ |
288 | #define AR5K_ISR_RXPHY 0x00004000 /* PHY error */ | 295 | #define AR5K_ISR_RXPHY 0x00004000 /* PHY error */ |
289 | #define AR5K_ISR_RXKCM 0x00008000 | 296 | #define AR5K_ISR_RXKCM 0x00008000 /* RX Key cache miss */ |
290 | #define AR5K_ISR_SWBA 0x00010000 /* Software beacon alert */ | 297 | #define AR5K_ISR_SWBA 0x00010000 /* Software beacon alert */ |
291 | #define AR5K_ISR_BRSSI 0x00020000 | 298 | #define AR5K_ISR_BRSSI 0x00020000 |
292 | #define AR5K_ISR_BMISS 0x00040000 /* Beacon missed */ | 299 | #define AR5K_ISR_BMISS 0x00040000 /* Beacon missed */ |
293 | #define AR5K_ISR_HIUERR 0x00080000 /* Host Interface Unit error [5211+] */ | 300 | #define AR5K_ISR_HIUERR 0x00080000 /* Host Interface Unit error [5211+] */ |
294 | #define AR5K_ISR_BNR 0x00100000 /* Beacon not ready [5211+] */ | 301 | #define AR5K_ISR_BNR 0x00100000 /* Beacon not ready [5211+] */ |
295 | #define AR5K_ISR_MCABT 0x00100000 /* [5210] */ | 302 | #define AR5K_ISR_MCABT 0x00100000 /* Master Cycle Abort [5210] */ |
296 | #define AR5K_ISR_RXCHIRP 0x00200000 /* [5212+] */ | 303 | #define AR5K_ISR_RXCHIRP 0x00200000 /* CHIRP Received [5212+] */ |
297 | #define AR5K_ISR_SSERR 0x00200000 /* [5210] */ | 304 | #define AR5K_ISR_SSERR 0x00200000 /* Signaled System Error [5210] */ |
298 | #define AR5K_ISR_DPERR 0x00400000 /* [5210] */ | 305 | #define AR5K_ISR_DPERR 0x00400000 /* Det par Error (?) [5210] */ |
299 | #define AR5K_ISR_TIM 0x00800000 /* [5210] */ | 306 | #define AR5K_ISR_TIM 0x00800000 /* [5210] */ |
300 | #define AR5K_ISR_BCNMISC 0x00800000 /* [5212+] */ | 307 | #define AR5K_ISR_BCNMISC 0x00800000 /* [5212+] */ |
301 | #define AR5K_ISR_GPIO 0x01000000 /* GPIO (rf kill)*/ | 308 | #define AR5K_ISR_GPIO 0x01000000 /* GPIO (rf kill)*/ |
@@ -320,14 +327,14 @@ | |||
320 | 327 | ||
321 | #define AR5K_SISR2 0x008c /* Register Address [5211+] */ | 328 | #define AR5K_SISR2 0x008c /* Register Address [5211+] */ |
322 | #define AR5K_SISR2_QCU_TXURN 0x000003ff /* Mask for QCU_TXURN */ | 329 | #define AR5K_SISR2_QCU_TXURN 0x000003ff /* Mask for QCU_TXURN */ |
323 | #define AR5K_SISR2_MCABT 0x00100000 | 330 | #define AR5K_SISR2_MCABT 0x00100000 /* Master Cycle Abort */ |
324 | #define AR5K_SISR2_SSERR 0x00200000 | 331 | #define AR5K_SISR2_SSERR 0x00200000 /* Signaled System Error */ |
325 | #define AR5K_SISR2_DPERR 0x00400000 | 332 | #define AR5K_SISR2_DPERR 0x00400000 /* Det par Error (?) */ |
326 | #define AR5K_SISR2_TIM 0x01000000 /* [5212+] */ | 333 | #define AR5K_SISR2_TIM 0x01000000 /* [5212+] */ |
327 | #define AR5K_SISR2_CAB_END 0x02000000 /* [5212+] */ | 334 | #define AR5K_SISR2_CAB_END 0x02000000 /* [5212+] */ |
328 | #define AR5K_SISR2_DTIM_SYNC 0x04000000 /* [5212+] */ | 335 | #define AR5K_SISR2_DTIM_SYNC 0x04000000 /* DTIM sync lost [5212+] */ |
329 | #define AR5K_SISR2_BCN_TIMEOUT 0x08000000 /* [5212+] */ | 336 | #define AR5K_SISR2_BCN_TIMEOUT 0x08000000 /* Beacon Timeout [5212+] */ |
330 | #define AR5K_SISR2_CAB_TIMEOUT 0x10000000 /* [5212+] */ | 337 | #define AR5K_SISR2_CAB_TIMEOUT 0x10000000 /* CAB Timeout [5212+] */ |
331 | #define AR5K_SISR2_DTIM 0x20000000 /* [5212+] */ | 338 | #define AR5K_SISR2_DTIM 0x20000000 /* [5212+] */ |
332 | 339 | ||
333 | #define AR5K_SISR3 0x0090 /* Register Address [5211+] */ | 340 | #define AR5K_SISR3 0x0090 /* Register Address [5211+] */ |
@@ -368,18 +375,18 @@ | |||
368 | #define AR5K_IMR_TXEOL 0x00000400 /* Empty TX descriptor*/ | 375 | #define AR5K_IMR_TXEOL 0x00000400 /* Empty TX descriptor*/ |
369 | #define AR5K_IMR_TXURN 0x00000800 /* Transmit FIFO underrun*/ | 376 | #define AR5K_IMR_TXURN 0x00000800 /* Transmit FIFO underrun*/ |
370 | #define AR5K_IMR_MIB 0x00001000 /* Update MIB counters*/ | 377 | #define AR5K_IMR_MIB 0x00001000 /* Update MIB counters*/ |
371 | #define AR5K_IMR_SWI 0x00002000 | 378 | #define AR5K_IMR_SWI 0x00002000 /* Software interrupt */ |
372 | #define AR5K_IMR_RXPHY 0x00004000 /* PHY error*/ | 379 | #define AR5K_IMR_RXPHY 0x00004000 /* PHY error*/ |
373 | #define AR5K_IMR_RXKCM 0x00008000 | 380 | #define AR5K_IMR_RXKCM 0x00008000 /* RX Key cache miss */ |
374 | #define AR5K_IMR_SWBA 0x00010000 /* Software beacon alert*/ | 381 | #define AR5K_IMR_SWBA 0x00010000 /* Software beacon alert*/ |
375 | #define AR5K_IMR_BRSSI 0x00020000 | 382 | #define AR5K_IMR_BRSSI 0x00020000 |
376 | #define AR5K_IMR_BMISS 0x00040000 /* Beacon missed*/ | 383 | #define AR5K_IMR_BMISS 0x00040000 /* Beacon missed*/ |
377 | #define AR5K_IMR_HIUERR 0x00080000 /* Host Interface Unit error [5211+] */ | 384 | #define AR5K_IMR_HIUERR 0x00080000 /* Host Interface Unit error [5211+] */ |
378 | #define AR5K_IMR_BNR 0x00100000 /* Beacon not ready [5211+] */ | 385 | #define AR5K_IMR_BNR 0x00100000 /* Beacon not ready [5211+] */ |
379 | #define AR5K_IMR_MCABT 0x00100000 /* [5210] */ | 386 | #define AR5K_IMR_MCABT 0x00100000 /* Master Cycle Abort [5210] */ |
380 | #define AR5K_IMR_RXCHIRP 0x00200000 /* [5212+]*/ | 387 | #define AR5K_IMR_RXCHIRP 0x00200000 /* CHIRP Received [5212+]*/ |
381 | #define AR5K_IMR_SSERR 0x00200000 /* [5210] */ | 388 | #define AR5K_IMR_SSERR 0x00200000 /* Signaled System Error [5210] */ |
382 | #define AR5K_IMR_DPERR 0x00400000 /* [5210] */ | 389 | #define AR5K_IMR_DPERR 0x00400000 /* Det par Error (?) [5210] */ |
383 | #define AR5K_IMR_TIM 0x00800000 /* [5211+] */ | 390 | #define AR5K_IMR_TIM 0x00800000 /* [5211+] */ |
384 | #define AR5K_IMR_BCNMISC 0x00800000 /* [5212+] */ | 391 | #define AR5K_IMR_BCNMISC 0x00800000 /* [5212+] */ |
385 | #define AR5K_IMR_GPIO 0x01000000 /* GPIO (rf kill)*/ | 392 | #define AR5K_IMR_GPIO 0x01000000 /* GPIO (rf kill)*/ |
@@ -405,14 +412,14 @@ | |||
405 | #define AR5K_SIMR2 0x00ac /* Register Address [5211+] */ | 412 | #define AR5K_SIMR2 0x00ac /* Register Address [5211+] */ |
406 | #define AR5K_SIMR2_QCU_TXURN 0x000003ff /* Mask for QCU_TXURN */ | 413 | #define AR5K_SIMR2_QCU_TXURN 0x000003ff /* Mask for QCU_TXURN */ |
407 | #define AR5K_SIMR2_QCU_TXURN_S 0 | 414 | #define AR5K_SIMR2_QCU_TXURN_S 0 |
408 | #define AR5K_SIMR2_MCABT 0x00100000 | 415 | #define AR5K_SIMR2_MCABT 0x00100000 /* Master Cycle Abort */ |
409 | #define AR5K_SIMR2_SSERR 0x00200000 | 416 | #define AR5K_SIMR2_SSERR 0x00200000 /* Signaled System Error */ |
410 | #define AR5K_SIMR2_DPERR 0x00400000 | 417 | #define AR5K_SIMR2_DPERR 0x00400000 /* Det par Error (?) */ |
411 | #define AR5K_SIMR2_TIM 0x01000000 /* [5212+] */ | 418 | #define AR5K_SIMR2_TIM 0x01000000 /* [5212+] */ |
412 | #define AR5K_SIMR2_CAB_END 0x02000000 /* [5212+] */ | 419 | #define AR5K_SIMR2_CAB_END 0x02000000 /* [5212+] */ |
413 | #define AR5K_SIMR2_DTIM_SYNC 0x04000000 /* [5212+] */ | 420 | #define AR5K_SIMR2_DTIM_SYNC 0x04000000 /* DTIM Sync lost [5212+] */ |
414 | #define AR5K_SIMR2_BCN_TIMEOUT 0x08000000 /* [5212+] */ | 421 | #define AR5K_SIMR2_BCN_TIMEOUT 0x08000000 /* Beacon Timeout [5212+] */ |
415 | #define AR5K_SIMR2_CAB_TIMEOUT 0x10000000 /* [5212+] */ | 422 | #define AR5K_SIMR2_CAB_TIMEOUT 0x10000000 /* CAB Timeout [5212+] */ |
416 | #define AR5K_SIMR2_DTIM 0x20000000 /* [5212+] */ | 423 | #define AR5K_SIMR2_DTIM 0x20000000 /* [5212+] */ |
417 | 424 | ||
418 | #define AR5K_SIMR3 0x00b0 /* Register Address [5211+] */ | 425 | #define AR5K_SIMR3 0x00b0 /* Register Address [5211+] */ |
@@ -425,23 +432,69 @@ | |||
425 | #define AR5K_SIMR4_QTRIG 0x000003ff /* Mask for QTRIG */ | 432 | #define AR5K_SIMR4_QTRIG 0x000003ff /* Mask for QTRIG */ |
426 | #define AR5K_SIMR4_QTRIG_S 0 | 433 | #define AR5K_SIMR4_QTRIG_S 0 |
427 | 434 | ||
435 | /* | ||
436 | * DMA Debug registers 0-7 | ||
437 | * 0xe0 - 0xfc | ||
438 | */ | ||
428 | 439 | ||
429 | /* | 440 | /* |
430 | * Decompression mask registers [5212+] | 441 | * Decompression mask registers [5212+] |
431 | */ | 442 | */ |
432 | #define AR5K_DCM_ADDR 0x0400 /*Decompression mask address (?)*/ | 443 | #define AR5K_DCM_ADDR 0x0400 /*Decompression mask address (index) */ |
433 | #define AR5K_DCM_DATA 0x0404 /*Decompression mask data (?)*/ | 444 | #define AR5K_DCM_DATA 0x0404 /*Decompression mask data */ |
445 | |||
446 | /* | ||
447 | * Wake On Wireless pattern control register [5212+] | ||
448 | */ | ||
449 | #define AR5K_WOW_PCFG 0x0410 /* Register Address */ | ||
450 | #define AR5K_WOW_PCFG_PAT_MATCH_EN 0x00000001 /* Pattern match enable */ | ||
451 | #define AR5K_WOW_PCFG_LONG_FRAME_POL 0x00000002 /* Long frame policy */ | ||
452 | #define AR5K_WOW_PCFG_WOBMISS 0x00000004 /* Wake on bea(con) miss (?) */ | ||
453 | #define AR5K_WOW_PCFG_PAT_0_EN 0x00000100 /* Enable pattern 0 */ | ||
454 | #define AR5K_WOW_PCFG_PAT_1_EN 0x00000200 /* Enable pattern 1 */ | ||
455 | #define AR5K_WOW_PCFG_PAT_2_EN 0x00000400 /* Enable pattern 2 */ | ||
456 | #define AR5K_WOW_PCFG_PAT_3_EN 0x00000800 /* Enable pattern 3 */ | ||
457 | #define AR5K_WOW_PCFG_PAT_4_EN 0x00001000 /* Enable pattern 4 */ | ||
458 | #define AR5K_WOW_PCFG_PAT_5_EN 0x00002000 /* Enable pattern 5 */ | ||
459 | |||
460 | /* | ||
461 | * Wake On Wireless pattern index register (?) [5212+] | ||
462 | */ | ||
463 | #define AR5K_WOW_PAT_IDX 0x0414 | ||
464 | |||
465 | /* | ||
466 | * Wake On Wireless pattern data register [5212+] | ||
467 | */ | ||
468 | #define AR5K_WOW_PAT_DATA 0x0418 /* Register Address */ | ||
469 | #define AR5K_WOW_PAT_DATA_0_3_V 0x00000001 /* Pattern 0, 3 value */ | ||
470 | #define AR5K_WOW_PAT_DATA_1_4_V 0x00000100 /* Pattern 1, 4 value */ | ||
471 | #define AR5K_WOW_PAT_DATA_2_5_V 0x00010000 /* Pattern 2, 5 value */ | ||
472 | #define AR5K_WOW_PAT_DATA_0_3_M 0x01000000 /* Pattern 0, 3 mask */ | ||
473 | #define AR5K_WOW_PAT_DATA_1_4_M 0x04000000 /* Pattern 1, 4 mask */ | ||
474 | #define AR5K_WOW_PAT_DATA_2_5_M 0x10000000 /* Pattern 2, 5 mask */ | ||
434 | 475 | ||
435 | /* | 476 | /* |
436 | * Decompression configuration registers [5212+] | 477 | * Decompression configuration registers [5212+] |
437 | */ | 478 | */ |
438 | #define AR5K_DCCFG 0x0420 | 479 | #define AR5K_DCCFG 0x0420 /* Register Address */ |
480 | #define AR5K_DCCFG_GLOBAL_EN 0x00000001 /* Enable decompression on all queues */ | ||
481 | #define AR5K_DCCFG_BYPASS_EN 0x00000002 /* Bypass decompression */ | ||
482 | #define AR5K_DCCFG_BCAST_EN 0x00000004 /* Enable decompression for bcast frames */ | ||
483 | #define AR5K_DCCFG_MCAST_EN 0x00000008 /* Enable decompression for mcast frames */ | ||
439 | 484 | ||
440 | /* | 485 | /* |
441 | * Compression configuration registers [5212+] | 486 | * Compression configuration registers [5212+] |
442 | */ | 487 | */ |
443 | #define AR5K_CCFG 0x0600 | 488 | #define AR5K_CCFG 0x0600 /* Register Address */ |
444 | #define AR5K_CCFG_CUP 0x0604 | 489 | #define AR5K_CCFG_WINDOW_SIZE 0x00000007 /* Compression window size */ |
490 | #define AR5K_CCFG_CPC_EN 0x00000008 /* Enable performance counters */ | ||
491 | |||
492 | #define AR5K_CCFG_CCU 0x0604 /* Register Address */ | ||
493 | #define AR5K_CCFG_CCU_CUP_EN 0x00000001 /* CCU Catchup enable */ | ||
494 | #define AR5K_CCFG_CCU_CREDIT 0x00000002 /* CCU Credit (field) */ | ||
495 | #define AR5K_CCFG_CCU_CD_THRES 0x00000080 /* CCU Cyc(lic?) debt threshold (field) */ | ||
496 | #define AR5K_CCFG_CCU_CUP_LCNT 0x00010000 /* CCU Catchup lit(?) count */ | ||
497 | #define AR5K_CCFG_CCU_INIT 0x00100200 /* Initial value during reset */ | ||
445 | 498 | ||
446 | /* | 499 | /* |
447 | * Compression performance counter registers [5212+] | 500 | * Compression performance counter registers [5212+] |
@@ -450,7 +503,7 @@ | |||
450 | #define AR5K_CPC1 0x0614 /* Compression performance counter 1*/ | 503 | #define AR5K_CPC1 0x0614 /* Compression performance counter 1*/ |
451 | #define AR5K_CPC2 0x0618 /* Compression performance counter 2 */ | 504 | #define AR5K_CPC2 0x0618 /* Compression performance counter 2 */ |
452 | #define AR5K_CPC3 0x061c /* Compression performance counter 3 */ | 505 | #define AR5K_CPC3 0x061c /* Compression performance counter 3 */ |
453 | #define AR5K_CPCORN 0x0620 /* Compression performance overrun (?) */ | 506 | #define AR5K_CPCOVF 0x0620 /* Compression performance overflow */ |
454 | 507 | ||
455 | 508 | ||
456 | /* | 509 | /* |
@@ -466,8 +519,6 @@ | |||
466 | * set/clear, which contain status for all queues (we shift by 1 for each | 519 | * set/clear, which contain status for all queues (we shift by 1 for each |
467 | * queue). To access these registers easily we define some macros here | 520 | * queue). To access these registers easily we define some macros here |
468 | * that are used inside HAL. For more infos check out *_tx_queue functs. | 521 | * that are used inside HAL. For more infos check out *_tx_queue functs. |
469 | * | ||
470 | * TODO: Boundary checking on macros (here?) | ||
471 | */ | 522 | */ |
472 | 523 | ||
473 | /* | 524 | /* |
@@ -513,7 +564,6 @@ | |||
513 | #define AR5K_QCU_RDYTIMECFG_BASE 0x0900 /* Register Address - Queue0 RDYTIMECFG */ | 564 | #define AR5K_QCU_RDYTIMECFG_BASE 0x0900 /* Register Address - Queue0 RDYTIMECFG */ |
514 | #define AR5K_QCU_RDYTIMECFG_INTVAL 0x00ffffff /* Ready time interval mask */ | 565 | #define AR5K_QCU_RDYTIMECFG_INTVAL 0x00ffffff /* Ready time interval mask */ |
515 | #define AR5K_QCU_RDYTIMECFG_INTVAL_S 0 | 566 | #define AR5K_QCU_RDYTIMECFG_INTVAL_S 0 |
516 | #define AR5K_QCU_RDYTIMECFG_DURATION 0x00ffffff /* Ready time duration mask */ | ||
517 | #define AR5K_QCU_RDYTIMECFG_ENABLE 0x01000000 /* Ready time enable mask */ | 567 | #define AR5K_QCU_RDYTIMECFG_ENABLE 0x01000000 /* Ready time enable mask */ |
518 | #define AR5K_QUEUE_RDYTIMECFG(_q) AR5K_QUEUE_REG(AR5K_QCU_RDYTIMECFG_BASE, _q) | 568 | #define AR5K_QUEUE_RDYTIMECFG(_q) AR5K_QUEUE_REG(AR5K_QCU_RDYTIMECFG_BASE, _q) |
519 | 569 | ||
@@ -534,19 +584,20 @@ | |||
534 | */ | 584 | */ |
535 | #define AR5K_QCU_MISC_BASE 0x09c0 /* Register Address -Queue0 MISC */ | 585 | #define AR5K_QCU_MISC_BASE 0x09c0 /* Register Address -Queue0 MISC */ |
536 | #define AR5K_QCU_MISC_FRSHED_M 0x0000000f /* Frame sheduling mask */ | 586 | #define AR5K_QCU_MISC_FRSHED_M 0x0000000f /* Frame sheduling mask */ |
537 | #define AR5K_QCU_MISC_FRSHED_ASAP 0 /* ASAP */ | 587 | #define AR5K_QCU_MISC_FRSHED_ASAP 0 /* ASAP */ |
538 | #define AR5K_QCU_MISC_FRSHED_CBR 1 /* Constant Bit Rate */ | 588 | #define AR5K_QCU_MISC_FRSHED_CBR 1 /* Constant Bit Rate */ |
539 | #define AR5K_QCU_MISC_FRSHED_DBA_GT 2 /* DMA Beacon alert gated (?) */ | 589 | #define AR5K_QCU_MISC_FRSHED_DBA_GT 2 /* DMA Beacon alert gated (?) */ |
540 | #define AR5K_QCU_MISC_FRSHED_TIM_GT 3 /* Time gated (?) */ | 590 | #define AR5K_QCU_MISC_FRSHED_TIM_GT 3 /* Time gated (?) */ |
541 | #define AR5K_QCU_MISC_FRSHED_BCN_SENT_GT 4 /* Beacon sent gated (?) */ | 591 | #define AR5K_QCU_MISC_FRSHED_BCN_SENT_GT 4 /* Beacon sent gated (?) */ |
542 | #define AR5K_QCU_MISC_ONESHOT_ENABLE 0x00000010 /* Oneshot enable */ | 592 | #define AR5K_QCU_MISC_ONESHOT_ENABLE 0x00000010 /* Oneshot enable */ |
543 | #define AR5K_QCU_MISC_CBREXP 0x00000020 /* CBR expired (normal queue) */ | 593 | #define AR5K_QCU_MISC_CBREXP 0x00000020 /* CBR expired (normal queue) */ |
544 | #define AR5K_QCU_MISC_CBREXP_BCN 0x00000040 /* CBR expired (beacon queue) */ | 594 | #define AR5K_QCU_MISC_CBREXP_BCN 0x00000040 /* CBR expired (beacon queue) */ |
545 | #define AR5K_QCU_MISC_BCN_ENABLE 0x00000080 /* Beacons enabled */ | 595 | #define AR5K_QCU_MISC_BCN_ENABLE 0x00000080 /* Enable Beacon use */ |
546 | #define AR5K_QCU_MISC_CBR_THRES_ENABLE 0x00000100 /* CBR threshold enabled (?) */ | 596 | #define AR5K_QCU_MISC_CBR_THRES_ENABLE 0x00000100 /* CBR threshold enabled */ |
547 | #define AR5K_QCU_MISC_TXE 0x00000200 /* TXE reset when RDYTIME enalbed (?) */ | 597 | #define AR5K_QCU_MISC_RDY_VEOL_POLICY 0x00000200 /* TXE reset when RDYTIME enalbed */ |
548 | #define AR5K_QCU_MISC_CBR 0x00000400 /* CBR threshold reset (?) */ | 598 | #define AR5K_QCU_MISC_CBR_RESET_CNT 0x00000400 /* CBR threshold (counter) reset */ |
549 | #define AR5K_QCU_MISC_DCU_EARLY 0x00000800 /* DCU reset (?) */ | 599 | #define AR5K_QCU_MISC_DCU_EARLY 0x00000800 /* DCU early termination */ |
600 | #define AR5K_QCU_MISC_DCU_CMP_EN 0x00001000 /* Enable frame compression */ | ||
550 | #define AR5K_QUEUE_MISC(_q) AR5K_QUEUE_REG(AR5K_QCU_MISC_BASE, _q) | 601 | #define AR5K_QUEUE_MISC(_q) AR5K_QUEUE_REG(AR5K_QCU_MISC_BASE, _q) |
551 | 602 | ||
552 | 603 | ||
@@ -555,7 +606,7 @@ | |||
555 | */ | 606 | */ |
556 | #define AR5K_QCU_STS_BASE 0x0a00 /* Register Address - Queue0 STS */ | 607 | #define AR5K_QCU_STS_BASE 0x0a00 /* Register Address - Queue0 STS */ |
557 | #define AR5K_QCU_STS_FRMPENDCNT 0x00000003 /* Frames pending counter */ | 608 | #define AR5K_QCU_STS_FRMPENDCNT 0x00000003 /* Frames pending counter */ |
558 | #define AR5K_QCU_STS_CBREXPCNT 0x0000ff00 /* CBR expired counter (?) */ | 609 | #define AR5K_QCU_STS_CBREXPCNT 0x0000ff00 /* CBR expired counter */ |
559 | #define AR5K_QUEUE_STATUS(_q) AR5K_QUEUE_REG(AR5K_QCU_STS_BASE, _q) | 610 | #define AR5K_QUEUE_STATUS(_q) AR5K_QUEUE_REG(AR5K_QCU_STS_BASE, _q) |
560 | 611 | ||
561 | /* | 612 | /* |
@@ -569,9 +620,11 @@ | |||
569 | */ | 620 | */ |
570 | #define AR5K_QCU_CBB_SELECT 0x0b00 | 621 | #define AR5K_QCU_CBB_SELECT 0x0b00 |
571 | #define AR5K_QCU_CBB_ADDR 0x0b04 | 622 | #define AR5K_QCU_CBB_ADDR 0x0b04 |
623 | #define AR5K_QCU_CBB_ADDR_S 9 | ||
572 | 624 | ||
573 | /* | 625 | /* |
574 | * QCU compression buffer configuration register [5212+] | 626 | * QCU compression buffer configuration register [5212+] |
627 | * (buffer size) | ||
575 | */ | 628 | */ |
576 | #define AR5K_QCU_CBCFG 0x0b08 | 629 | #define AR5K_QCU_CBCFG 0x0b08 |
577 | 630 | ||
@@ -652,80 +705,100 @@ | |||
652 | * No lockout means there is no special handling. | 705 | * No lockout means there is no special handling. |
653 | */ | 706 | */ |
654 | #define AR5K_DCU_MISC_BASE 0x1100 /* Register Address -Queue0 DCU_MISC */ | 707 | #define AR5K_DCU_MISC_BASE 0x1100 /* Register Address -Queue0 DCU_MISC */ |
655 | #define AR5K_DCU_MISC_BACKOFF 0x000007ff /* Mask for backoff setting (?) */ | 708 | #define AR5K_DCU_MISC_BACKOFF 0x000007ff /* Mask for backoff threshold */ |
656 | #define AR5K_DCU_MISC_BACKOFF_FRAG 0x00000200 /* Enable backoff while bursting */ | 709 | #define AR5K_DCU_MISC_BACKOFF_FRAG 0x00000200 /* Enable backoff while bursting */ |
657 | #define AR5K_DCU_MISC_HCFPOLL_ENABLE 0x00000800 /* CF - Poll (?) */ | 710 | #define AR5K_DCU_MISC_HCFPOLL_ENABLE 0x00000800 /* CF - Poll enable */ |
658 | #define AR5K_DCU_MISC_BACKOFF_PERSIST 0x00001000 /* Persistent backoff (?) */ | 711 | #define AR5K_DCU_MISC_BACKOFF_PERSIST 0x00001000 /* Persistent backoff */ |
659 | #define AR5K_DCU_MISC_FRMPRFTCH_ENABLE 0x00002000 /* Enable frame pre-fetch (?) */ | 712 | #define AR5K_DCU_MISC_FRMPRFTCH_ENABLE 0x00002000 /* Enable frame pre-fetch */ |
660 | #define AR5K_DCU_MISC_VIRTCOL 0x0000c000 /* Mask for Virtual Collision (?) */ | 713 | #define AR5K_DCU_MISC_VIRTCOL 0x0000c000 /* Mask for Virtual Collision (?) */ |
661 | #define AR5K_DCU_MISC_VIRTCOL_NORMAL 0 | 714 | #define AR5K_DCU_MISC_VIRTCOL_NORMAL 0 |
662 | #define AR5K_DCU_MISC_VIRTCOL_MODIFIED 1 | 715 | #define AR5K_DCU_MISC_VIRTCOL_MODIFIED 1 |
663 | #define AR5K_DCU_MISC_VIRTCOL_IGNORE 2 | 716 | #define AR5K_DCU_MISC_VIRTCOL_IGNORE 2 |
664 | #define AR5K_DCU_MISC_BCN_ENABLE 0x00010000 /* Beacon enable (?) */ | 717 | #define AR5K_DCU_MISC_BCN_ENABLE 0x00010000 /* Enable Beacon use */ |
665 | #define AR5K_DCU_MISC_ARBLOCK_CTL 0x00060000 /* Arbiter lockout control mask */ | 718 | #define AR5K_DCU_MISC_ARBLOCK_CTL 0x00060000 /* Arbiter lockout control mask */ |
666 | #define AR5K_DCU_MISC_ARBLOCK_CTL_S 17 | 719 | #define AR5K_DCU_MISC_ARBLOCK_CTL_S 17 |
667 | #define AR5K_DCU_MISC_ARBLOCK_CTL_NONE 0 /* No arbiter lockout */ | 720 | #define AR5K_DCU_MISC_ARBLOCK_CTL_NONE 0 /* No arbiter lockout */ |
668 | #define AR5K_DCU_MISC_ARBLOCK_CTL_INTFRM 1 /* Intra-frame lockout */ | 721 | #define AR5K_DCU_MISC_ARBLOCK_CTL_INTFRM 1 /* Intra-frame lockout */ |
669 | #define AR5K_DCU_MISC_ARBLOCK_CTL_GLOBAL 2 /* Global lockout */ | 722 | #define AR5K_DCU_MISC_ARBLOCK_CTL_GLOBAL 2 /* Global lockout */ |
670 | #define AR5K_DCU_MISC_ARBLOCK_IGNORE 0x00080000 | 723 | #define AR5K_DCU_MISC_ARBLOCK_IGNORE 0x00080000 /* Ignore Arbiter lockout */ |
671 | #define AR5K_DCU_MISC_SEQ_NUM_INCR_DIS 0x00100000 /* Disable sequence number increment (?) */ | 724 | #define AR5K_DCU_MISC_SEQ_NUM_INCR_DIS 0x00100000 /* Disable sequence number increment */ |
672 | #define AR5K_DCU_MISC_POST_FR_BKOFF_DIS 0x00200000 /* Disable post-frame backoff (?) */ | 725 | #define AR5K_DCU_MISC_POST_FR_BKOFF_DIS 0x00200000 /* Disable post-frame backoff */ |
673 | #define AR5K_DCU_MISC_VIRT_COLL_POLICY 0x00400000 /* Virtual Collision policy (?) */ | 726 | #define AR5K_DCU_MISC_VIRT_COLL_POLICY 0x00400000 /* Virtual Collision cw policy */ |
674 | #define AR5K_DCU_MISC_BLOWN_IFS_POLICY 0x00800000 | 727 | #define AR5K_DCU_MISC_BLOWN_IFS_POLICY 0x00800000 /* Blown IFS policy (?) */ |
675 | #define AR5K_DCU_MISC_SEQNUM_CTL 0x01000000 /* Sequence number control (?) */ | 728 | #define AR5K_DCU_MISC_SEQNUM_CTL 0x01000000 /* Sequence number control (?) */ |
676 | #define AR5K_QUEUE_DFS_MISC(_q) AR5K_QUEUE_REG(AR5K_DCU_MISC_BASE, _q) | 729 | #define AR5K_QUEUE_DFS_MISC(_q) AR5K_QUEUE_REG(AR5K_DCU_MISC_BASE, _q) |
677 | 730 | ||
678 | /* | 731 | /* |
679 | * DCU frame sequence number registers | 732 | * DCU frame sequence number registers |
680 | */ | 733 | */ |
681 | #define AR5K_DCU_SEQNUM_BASE 0x1140 | 734 | #define AR5K_DCU_SEQNUM_BASE 0x1140 |
682 | #define AR5K_DCU_SEQNUM_M 0x00000fff | 735 | #define AR5K_DCU_SEQNUM_M 0x00000fff |
683 | #define AR5K_QUEUE_DFS_SEQNUM(_q) AR5K_QUEUE_REG(AR5K_DCU_SEQNUM_BASE, _q) | 736 | #define AR5K_QUEUE_DFS_SEQNUM(_q) AR5K_QUEUE_REG(AR5K_DCU_SEQNUM_BASE, _q) |
684 | 737 | ||
685 | /* | 738 | /* |
686 | * DCU global IFS SIFS registers | 739 | * DCU global IFS SIFS register |
687 | */ | 740 | */ |
688 | #define AR5K_DCU_GBL_IFS_SIFS 0x1030 | 741 | #define AR5K_DCU_GBL_IFS_SIFS 0x1030 |
689 | #define AR5K_DCU_GBL_IFS_SIFS_M 0x0000ffff | 742 | #define AR5K_DCU_GBL_IFS_SIFS_M 0x0000ffff |
690 | 743 | ||
691 | /* | 744 | /* |
692 | * DCU global IFS slot interval registers | 745 | * DCU global IFS slot interval register |
693 | */ | 746 | */ |
694 | #define AR5K_DCU_GBL_IFS_SLOT 0x1070 | 747 | #define AR5K_DCU_GBL_IFS_SLOT 0x1070 |
695 | #define AR5K_DCU_GBL_IFS_SLOT_M 0x0000ffff | 748 | #define AR5K_DCU_GBL_IFS_SLOT_M 0x0000ffff |
696 | 749 | ||
697 | /* | 750 | /* |
698 | * DCU global IFS EIFS registers | 751 | * DCU global IFS EIFS register |
699 | */ | 752 | */ |
700 | #define AR5K_DCU_GBL_IFS_EIFS 0x10b0 | 753 | #define AR5K_DCU_GBL_IFS_EIFS 0x10b0 |
701 | #define AR5K_DCU_GBL_IFS_EIFS_M 0x0000ffff | 754 | #define AR5K_DCU_GBL_IFS_EIFS_M 0x0000ffff |
702 | 755 | ||
703 | /* | 756 | /* |
704 | * DCU global IFS misc registers | 757 | * DCU global IFS misc register |
758 | * | ||
759 | * LFSR stands for Linear Feedback Shift Register | ||
760 | * and it's used for generating pseudo-random | ||
761 | * number sequences. | ||
762 | * | ||
763 | * (If i understand corectly, random numbers are | ||
764 | * used for idle sensing -multiplied with cwmin/max etc-) | ||
705 | */ | 765 | */ |
706 | #define AR5K_DCU_GBL_IFS_MISC 0x10f0 /* Register Address */ | 766 | #define AR5K_DCU_GBL_IFS_MISC 0x10f0 /* Register Address */ |
707 | #define AR5K_DCU_GBL_IFS_MISC_LFSR_SLICE 0x00000007 | 767 | #define AR5K_DCU_GBL_IFS_MISC_LFSR_SLICE 0x00000007 /* LFSR Slice Select */ |
708 | #define AR5K_DCU_GBL_IFS_MISC_TURBO_MODE 0x00000008 /* Turbo mode (?) */ | 768 | #define AR5K_DCU_GBL_IFS_MISC_TURBO_MODE 0x00000008 /* Turbo mode */ |
709 | #define AR5K_DCU_GBL_IFS_MISC_SIFS_DUR_USEC 0x000003f0 /* SIFS Duration mask (?) */ | 769 | #define AR5K_DCU_GBL_IFS_MISC_SIFS_DUR_USEC 0x000003f0 /* SIFS Duration mask */ |
710 | #define AR5K_DCU_GBL_IFS_MISC_USEC_DUR 0x000ffc00 | 770 | #define AR5K_DCU_GBL_IFS_MISC_USEC_DUR 0x000ffc00 /* USEC Duration mask */ |
711 | #define AR5K_DCU_GBL_IFS_MISC_DCU_ARB_DELAY 0x00300000 | 771 | #define AR5K_DCU_GBL_IFS_MISC_DCU_ARB_DELAY 0x00300000 /* DCU Arbiter delay mask */ |
772 | #define AR5K_DCU_GBL_IFS_MISC_SIFS_CNT_RST 0x00400000 /* SIFC cnt reset policy (?) */ | ||
773 | #define AR5K_DCU_GBL_IFS_MISC_AIFS_CNT_RST 0x00800000 /* AIFS cnt reset policy (?) */ | ||
774 | #define AR5K_DCU_GBL_IFS_MISC_RND_LFSR_SL_DIS 0x01000000 /* Disable random LFSR slice */ | ||
712 | 775 | ||
713 | /* | 776 | /* |
714 | * DCU frame prefetch control register | 777 | * DCU frame prefetch control register |
715 | */ | 778 | */ |
716 | #define AR5K_DCU_FP 0x1230 | 779 | #define AR5K_DCU_FP 0x1230 /* Register Address */ |
780 | #define AR5K_DCU_FP_NOBURST_DCU_EN 0x00000001 /* Enable non-burst prefetch on DCU (?) */ | ||
781 | #define AR5K_DCU_FP_NOBURST_EN 0x00000010 /* Enable non-burst prefetch (?) */ | ||
782 | #define AR5K_DCU_FP_BURST_DCU_EN 0x00000020 /* Enable burst prefetch on DCU (?) */ | ||
717 | 783 | ||
718 | /* | 784 | /* |
719 | * DCU transmit pause control/status register | 785 | * DCU transmit pause control/status register |
720 | */ | 786 | */ |
721 | #define AR5K_DCU_TXP 0x1270 /* Register Address */ | 787 | #define AR5K_DCU_TXP 0x1270 /* Register Address */ |
722 | #define AR5K_DCU_TXP_M 0x000003ff /* Tx pause mask (?) */ | 788 | #define AR5K_DCU_TXP_M 0x000003ff /* Tx pause mask */ |
723 | #define AR5K_DCU_TXP_STATUS 0x00010000 /* Tx pause status (?) */ | 789 | #define AR5K_DCU_TXP_STATUS 0x00010000 /* Tx pause status */ |
790 | |||
791 | /* | ||
792 | * DCU transmit filter table 0 (32 entries) | ||
793 | */ | ||
794 | #define AR5K_DCU_TX_FILTER_0_BASE 0x1038 | ||
795 | #define AR5K_DCU_TX_FILTER_0(_n) (AR5K_DCU_TX_FILTER_0_BASE + (_n * 64)) | ||
724 | 796 | ||
725 | /* | 797 | /* |
726 | * DCU transmit filter register | 798 | * DCU transmit filter table 1 (16 entries) |
727 | */ | 799 | */ |
728 | #define AR5K_DCU_TX_FILTER 0x1038 | 800 | #define AR5K_DCU_TX_FILTER_1_BASE 0x103c |
801 | #define AR5K_DCU_TX_FILTER_1(_n) (AR5K_DCU_TX_FILTER_1_BASE + ((_n - 32) * 64)) | ||
729 | 802 | ||
730 | /* | 803 | /* |
731 | * DCU clear transmit filter register | 804 | * DCU clear transmit filter register |
@@ -739,9 +812,6 @@ | |||
739 | 812 | ||
740 | /* | 813 | /* |
741 | * Reset control register | 814 | * Reset control register |
742 | * | ||
743 | * 4 and 8 are not used in 5211/5212 and | ||
744 | * 2 means "baseband reset" on 5211/5212. | ||
745 | */ | 815 | */ |
746 | #define AR5K_RESET_CTL 0x4000 /* Register Address */ | 816 | #define AR5K_RESET_CTL 0x4000 /* Register Address */ |
747 | #define AR5K_RESET_CTL_PCU 0x00000001 /* Protocol Control Unit reset */ | 817 | #define AR5K_RESET_CTL_PCU 0x00000001 /* Protocol Control Unit reset */ |
@@ -765,6 +835,7 @@ | |||
765 | #define AR5K_SLEEP_CTL_SLE_SLP 0x00010000 /* Force chip sleep */ | 835 | #define AR5K_SLEEP_CTL_SLE_SLP 0x00010000 /* Force chip sleep */ |
766 | #define AR5K_SLEEP_CTL_SLE_ALLOW 0x00020000 | 836 | #define AR5K_SLEEP_CTL_SLE_ALLOW 0x00020000 |
767 | #define AR5K_SLEEP_CTL_SLE_UNITS 0x00000008 /* [5211+] */ | 837 | #define AR5K_SLEEP_CTL_SLE_UNITS 0x00000008 /* [5211+] */ |
838 | /* more bits */ | ||
768 | 839 | ||
769 | /* | 840 | /* |
770 | * Interrupt pending register | 841 | * Interrupt pending register |
@@ -776,13 +847,14 @@ | |||
776 | * Sleep force register | 847 | * Sleep force register |
777 | */ | 848 | */ |
778 | #define AR5K_SFR 0x400c | 849 | #define AR5K_SFR 0x400c |
779 | #define AR5K_SFR_M 0x00000001 | 850 | #define AR5K_SFR_EN 0x00000001 |
780 | 851 | ||
781 | /* | 852 | /* |
782 | * PCI configuration register | 853 | * PCI configuration register |
783 | */ | 854 | */ |
784 | #define AR5K_PCICFG 0x4010 /* Register Address */ | 855 | #define AR5K_PCICFG 0x4010 /* Register Address */ |
785 | #define AR5K_PCICFG_EEAE 0x00000001 /* Eeprom access enable [5210] */ | 856 | #define AR5K_PCICFG_EEAE 0x00000001 /* Eeprom access enable [5210] */ |
857 | #define AR5K_PCICFG_SLEEP_CLOCK_EN 0x00000002 /* Enable sleep clock (?) */ | ||
786 | #define AR5K_PCICFG_CLKRUNEN 0x00000004 /* CLKRUN enable [5211+] */ | 858 | #define AR5K_PCICFG_CLKRUNEN 0x00000004 /* CLKRUN enable [5211+] */ |
787 | #define AR5K_PCICFG_EESIZE 0x00000018 /* Mask for EEPROM size [5211+] */ | 859 | #define AR5K_PCICFG_EESIZE 0x00000018 /* Mask for EEPROM size [5211+] */ |
788 | #define AR5K_PCICFG_EESIZE_S 3 | 860 | #define AR5K_PCICFG_EESIZE_S 3 |
@@ -798,19 +870,21 @@ | |||
798 | #define AR5K_PCICFG_CBEFIX_DIS 0x00000400 /* Disable CBE fix (?) */ | 870 | #define AR5K_PCICFG_CBEFIX_DIS 0x00000400 /* Disable CBE fix (?) */ |
799 | #define AR5K_PCICFG_SL_INTEN 0x00000800 /* Enable interrupts when asleep (?) */ | 871 | #define AR5K_PCICFG_SL_INTEN 0x00000800 /* Enable interrupts when asleep (?) */ |
800 | #define AR5K_PCICFG_LED_BCTL 0x00001000 /* Led blink (?) [5210] */ | 872 | #define AR5K_PCICFG_LED_BCTL 0x00001000 /* Led blink (?) [5210] */ |
801 | #define AR5K_PCICFG_SL_INPEN 0x00002800 /* Sleep even whith pending interrupts (?) */ | 873 | #define AR5K_PCICFG_UNK 0x00001000 /* Passed on some parts durring attach (?) */ |
874 | #define AR5K_PCICFG_SL_INPEN 0x00002000 /* Sleep even whith pending interrupts (?) */ | ||
802 | #define AR5K_PCICFG_SPWR_DN 0x00010000 /* Mask for power status */ | 875 | #define AR5K_PCICFG_SPWR_DN 0x00010000 /* Mask for power status */ |
803 | #define AR5K_PCICFG_LEDMODE 0x000e0000 /* Ledmode [5211+] */ | 876 | #define AR5K_PCICFG_LEDMODE 0x000e0000 /* Ledmode [5211+] */ |
804 | #define AR5K_PCICFG_LEDMODE_PROP 0x00000000 /* Blink on standard traffic [5211+] */ | 877 | #define AR5K_PCICFG_LEDMODE_PROP 0x00000000 /* Blink on standard traffic [5211+] */ |
805 | #define AR5K_PCICFG_LEDMODE_PROM 0x00020000 /* Default mode (blink on any traffic) [5211+] */ | 878 | #define AR5K_PCICFG_LEDMODE_PROM 0x00020000 /* Default mode (blink on any traffic) [5211+] */ |
806 | #define AR5K_PCICFG_LEDMODE_PWR 0x00040000 /* Some other blinking mode (?) [5211+] */ | 879 | #define AR5K_PCICFG_LEDMODE_PWR 0x00040000 /* Some other blinking mode (?) [5211+] */ |
807 | #define AR5K_PCICFG_LEDMODE_RAND 0x00060000 /* Random blinking (?) [5211+] */ | 880 | #define AR5K_PCICFG_LEDMODE_RAND 0x00060000 /* Random blinking (?) [5211+] */ |
808 | #define AR5K_PCICFG_LEDBLINK 0x00700000 | 881 | #define AR5K_PCICFG_LEDBLINK 0x00700000 /* Led blink rate */ |
809 | #define AR5K_PCICFG_LEDBLINK_S 20 | 882 | #define AR5K_PCICFG_LEDBLINK_S 20 |
810 | #define AR5K_PCICFG_LEDSLOW 0x00800000 /* Slow led blink rate (?) [5211+] */ | 883 | #define AR5K_PCICFG_LEDSLOW 0x00800000 /* Slowest led blink rate [5211+] */ |
811 | #define AR5K_PCICFG_LEDSTATE \ | 884 | #define AR5K_PCICFG_LEDSTATE \ |
812 | (AR5K_PCICFG_LED | AR5K_PCICFG_LEDMODE | \ | 885 | (AR5K_PCICFG_LED | AR5K_PCICFG_LEDMODE | \ |
813 | AR5K_PCICFG_LEDBLINK | AR5K_PCICFG_LEDSLOW) | 886 | AR5K_PCICFG_LEDBLINK | AR5K_PCICFG_LEDSLOW) |
887 | #define AR5K_PCICFG_SLEEP_CLOCK_RATE 0x03000000 /* Sleep clock rate (field) */ | ||
814 | 888 | ||
815 | /* | 889 | /* |
816 | * "General Purpose Input/Output" (GPIO) control register | 890 | * "General Purpose Input/Output" (GPIO) control register |
@@ -947,7 +1021,7 @@ | |||
947 | #define AR5K_EEPROM_VERSION_4_4 0x4004 | 1021 | #define AR5K_EEPROM_VERSION_4_4 0x4004 |
948 | #define AR5K_EEPROM_VERSION_4_5 0x4005 | 1022 | #define AR5K_EEPROM_VERSION_4_5 0x4005 |
949 | #define AR5K_EEPROM_VERSION_4_6 0x4006 /* has ee_scaled_cck_delta */ | 1023 | #define AR5K_EEPROM_VERSION_4_6 0x4006 /* has ee_scaled_cck_delta */ |
950 | #define AR5K_EEPROM_VERSION_4_7 0x3007 | 1024 | #define AR5K_EEPROM_VERSION_4_7 0x4007 |
951 | 1025 | ||
952 | #define AR5K_EEPROM_MODE_11A 0 | 1026 | #define AR5K_EEPROM_MODE_11A 0 |
953 | #define AR5K_EEPROM_MODE_11B 1 | 1027 | #define AR5K_EEPROM_MODE_11B 1 |
@@ -1023,10 +1097,14 @@ | |||
1023 | #define AR5K_EEPROM_STAT_WRDONE 0x00000008 /* EEPROM write successful */ | 1097 | #define AR5K_EEPROM_STAT_WRDONE 0x00000008 /* EEPROM write successful */ |
1024 | 1098 | ||
1025 | /* | 1099 | /* |
1026 | * EEPROM config register (?) | 1100 | * EEPROM config register |
1027 | */ | 1101 | */ |
1028 | #define AR5K_EEPROM_CFG 0x6010 | 1102 | #define AR5K_EEPROM_CFG 0x6010 /* Register Addres */ |
1029 | 1103 | #define AR5K_EEPROM_CFG_SIZE_OVR 0x00000001 | |
1104 | #define AR5K_EEPROM_CFG_WR_WAIT_DIS 0x00000004 /* Disable write wait */ | ||
1105 | #define AR5K_EEPROM_CFG_CLK_RATE 0x00000018 /* Clock rate */ | ||
1106 | #define AR5K_EEPROM_CFG_PROT_KEY 0x00ffff00 /* Protectio key */ | ||
1107 | #define AR5K_EEPROM_CFG_LIND_EN 0x01000000 /* Enable length indicator (?) */ | ||
1030 | 1108 | ||
1031 | 1109 | ||
1032 | /* | 1110 | /* |
@@ -1050,7 +1128,7 @@ | |||
1050 | #define AR5K_STA_ID1 0x8004 /* Register Address */ | 1128 | #define AR5K_STA_ID1 0x8004 /* Register Address */ |
1051 | #define AR5K_STA_ID1_AP 0x00010000 /* Set AP mode */ | 1129 | #define AR5K_STA_ID1_AP 0x00010000 /* Set AP mode */ |
1052 | #define AR5K_STA_ID1_ADHOC 0x00020000 /* Set Ad-Hoc mode */ | 1130 | #define AR5K_STA_ID1_ADHOC 0x00020000 /* Set Ad-Hoc mode */ |
1053 | #define AR5K_STA_ID1_PWR_SV 0x00040000 /* Power save reporting (?) */ | 1131 | #define AR5K_STA_ID1_PWR_SV 0x00040000 /* Power save reporting */ |
1054 | #define AR5K_STA_ID1_NO_KEYSRCH 0x00080000 /* No key search */ | 1132 | #define AR5K_STA_ID1_NO_KEYSRCH 0x00080000 /* No key search */ |
1055 | #define AR5K_STA_ID1_NO_PSPOLL 0x00100000 /* No power save polling [5210] */ | 1133 | #define AR5K_STA_ID1_NO_PSPOLL 0x00100000 /* No power save polling [5210] */ |
1056 | #define AR5K_STA_ID1_PCF_5211 0x00100000 /* Enable PCF on [5211+] */ | 1134 | #define AR5K_STA_ID1_PCF_5211 0x00100000 /* Enable PCF on [5211+] */ |
@@ -1059,9 +1137,13 @@ | |||
1059 | AR5K_STA_ID1_PCF_5210 : AR5K_STA_ID1_PCF_5211) | 1137 | AR5K_STA_ID1_PCF_5210 : AR5K_STA_ID1_PCF_5211) |
1060 | #define AR5K_STA_ID1_DEFAULT_ANTENNA 0x00200000 /* Use default antenna */ | 1138 | #define AR5K_STA_ID1_DEFAULT_ANTENNA 0x00200000 /* Use default antenna */ |
1061 | #define AR5K_STA_ID1_DESC_ANTENNA 0x00400000 /* Update antenna from descriptor */ | 1139 | #define AR5K_STA_ID1_DESC_ANTENNA 0x00400000 /* Update antenna from descriptor */ |
1062 | #define AR5K_STA_ID1_RTS_DEF_ANTENNA 0x00800000 /* Use default antenna for RTS (?) */ | 1140 | #define AR5K_STA_ID1_RTS_DEF_ANTENNA 0x00800000 /* Use default antenna for RTS */ |
1063 | #define AR5K_STA_ID1_ACKCTS_6MB 0x01000000 /* Use 6Mbit/s for ACK/CTS (?) */ | 1141 | #define AR5K_STA_ID1_ACKCTS_6MB 0x01000000 /* Use 6Mbit/s for ACK/CTS */ |
1064 | #define AR5K_STA_ID1_BASE_RATE_11B 0x02000000 /* Use 11b base rate (for ACK/CTS ?) [5211+] */ | 1142 | #define AR5K_STA_ID1_BASE_RATE_11B 0x02000000 /* Use 11b base rate (for ACK/CTS ?) [5211+] */ |
1143 | #define AR5K_STA_ID1_SELF_GEN_SECTORE 0x04000000 /* Self generate sectore (?) */ | ||
1144 | #define AR5K_STA_ID1_CRYPT_MIC_EN 0x08000000 /* Enable MIC */ | ||
1145 | #define AR5K_STA_ID1_KEYSRCH_MODE 0x10000000 /* Keysearch mode (?) */ | ||
1146 | #define AR5K_STA_ID1_PRESERVE_SEQ_NUM 0x20000000 /* Preserve sequence number */ | ||
1065 | 1147 | ||
1066 | /* | 1148 | /* |
1067 | * First BSSID register (MAC address, lower 32bits) | 1149 | * First BSSID register (MAC address, lower 32bits) |
@@ -1117,7 +1199,7 @@ | |||
1117 | * | 1199 | * |
1118 | * Retry limit register for 5210 (no QCU/DCU so it's done in PCU) | 1200 | * Retry limit register for 5210 (no QCU/DCU so it's done in PCU) |
1119 | */ | 1201 | */ |
1120 | #define AR5K_NODCU_RETRY_LMT 0x801c /*Register Address */ | 1202 | #define AR5K_NODCU_RETRY_LMT 0x801c /* Register Address */ |
1121 | #define AR5K_NODCU_RETRY_LMT_SH_RETRY 0x0000000f /* Short retry limit mask */ | 1203 | #define AR5K_NODCU_RETRY_LMT_SH_RETRY 0x0000000f /* Short retry limit mask */ |
1122 | #define AR5K_NODCU_RETRY_LMT_SH_RETRY_S 0 | 1204 | #define AR5K_NODCU_RETRY_LMT_SH_RETRY_S 0 |
1123 | #define AR5K_NODCU_RETRY_LMT_LG_RETRY 0x000000f0 /* Long retry mask */ | 1205 | #define AR5K_NODCU_RETRY_LMT_LG_RETRY 0x000000f0 /* Long retry mask */ |
@@ -1136,9 +1218,9 @@ | |||
1136 | #define AR5K_USEC_5211 0x801c /* Register Address [5211+] */ | 1218 | #define AR5K_USEC_5211 0x801c /* Register Address [5211+] */ |
1137 | #define AR5K_USEC (ah->ah_version == AR5K_AR5210 ? \ | 1219 | #define AR5K_USEC (ah->ah_version == AR5K_AR5210 ? \ |
1138 | AR5K_USEC_5210 : AR5K_USEC_5211) | 1220 | AR5K_USEC_5210 : AR5K_USEC_5211) |
1139 | #define AR5K_USEC_1 0x0000007f | 1221 | #define AR5K_USEC_1 0x0000007f /* clock cycles for 1us */ |
1140 | #define AR5K_USEC_1_S 0 | 1222 | #define AR5K_USEC_1_S 0 |
1141 | #define AR5K_USEC_32 0x00003f80 | 1223 | #define AR5K_USEC_32 0x00003f80 /* clock cycles for 1us while on 32Mhz clock */ |
1142 | #define AR5K_USEC_32_S 7 | 1224 | #define AR5K_USEC_32_S 7 |
1143 | #define AR5K_USEC_TX_LATENCY_5211 0x007fc000 | 1225 | #define AR5K_USEC_TX_LATENCY_5211 0x007fc000 |
1144 | #define AR5K_USEC_TX_LATENCY_5211_S 14 | 1226 | #define AR5K_USEC_TX_LATENCY_5211_S 14 |
@@ -1152,16 +1234,16 @@ | |||
1152 | /* | 1234 | /* |
1153 | * PCU beacon control register | 1235 | * PCU beacon control register |
1154 | */ | 1236 | */ |
1155 | #define AR5K_BEACON_5210 0x8024 | 1237 | #define AR5K_BEACON_5210 0x8024 /*Register Address [5210] */ |
1156 | #define AR5K_BEACON_5211 0x8020 | 1238 | #define AR5K_BEACON_5211 0x8020 /*Register Address [5211+] */ |
1157 | #define AR5K_BEACON (ah->ah_version == AR5K_AR5210 ? \ | 1239 | #define AR5K_BEACON (ah->ah_version == AR5K_AR5210 ? \ |
1158 | AR5K_BEACON_5210 : AR5K_BEACON_5211) | 1240 | AR5K_BEACON_5210 : AR5K_BEACON_5211) |
1159 | #define AR5K_BEACON_PERIOD 0x0000ffff | 1241 | #define AR5K_BEACON_PERIOD 0x0000ffff /* Mask for beacon period */ |
1160 | #define AR5K_BEACON_PERIOD_S 0 | 1242 | #define AR5K_BEACON_PERIOD_S 0 |
1161 | #define AR5K_BEACON_TIM 0x007f0000 | 1243 | #define AR5K_BEACON_TIM 0x007f0000 /* Mask for TIM offset */ |
1162 | #define AR5K_BEACON_TIM_S 16 | 1244 | #define AR5K_BEACON_TIM_S 16 |
1163 | #define AR5K_BEACON_ENABLE 0x00800000 | 1245 | #define AR5K_BEACON_ENABLE 0x00800000 /* Enable beacons */ |
1164 | #define AR5K_BEACON_RESET_TSF 0x01000000 | 1246 | #define AR5K_BEACON_RESET_TSF 0x01000000 /* Force TSF reset */ |
1165 | 1247 | ||
1166 | /* | 1248 | /* |
1167 | * CFP period register | 1249 | * CFP period register |
@@ -1234,7 +1316,6 @@ | |||
1234 | 1316 | ||
1235 | /* | 1317 | /* |
1236 | * Receive filter register | 1318 | * Receive filter register |
1237 | * TODO: Get these out of ar5xxx.h on ath5k | ||
1238 | */ | 1319 | */ |
1239 | #define AR5K_RX_FILTER_5210 0x804c /* Register Address [5210] */ | 1320 | #define AR5K_RX_FILTER_5210 0x804c /* Register Address [5210] */ |
1240 | #define AR5K_RX_FILTER_5211 0x803c /* Register Address [5211+] */ | 1321 | #define AR5K_RX_FILTER_5211 0x803c /* Register Address [5211+] */ |
@@ -1307,11 +1388,11 @@ | |||
1307 | #define AR5K_DIAG_SW_5211 0x8048 /* Register Address [5211+] */ | 1388 | #define AR5K_DIAG_SW_5211 0x8048 /* Register Address [5211+] */ |
1308 | #define AR5K_DIAG_SW (ah->ah_version == AR5K_AR5210 ? \ | 1389 | #define AR5K_DIAG_SW (ah->ah_version == AR5K_AR5210 ? \ |
1309 | AR5K_DIAG_SW_5210 : AR5K_DIAG_SW_5211) | 1390 | AR5K_DIAG_SW_5210 : AR5K_DIAG_SW_5211) |
1310 | #define AR5K_DIAG_SW_DIS_WEP_ACK 0x00000001 | 1391 | #define AR5K_DIAG_SW_DIS_WEP_ACK 0x00000001 /* Disable ACKs if WEP key is invalid */ |
1311 | #define AR5K_DIAG_SW_DIS_ACK 0x00000002 /* Disable ACKs (?) */ | 1392 | #define AR5K_DIAG_SW_DIS_ACK 0x00000002 /* Disable ACKs */ |
1312 | #define AR5K_DIAG_SW_DIS_CTS 0x00000004 /* Disable CTSs (?) */ | 1393 | #define AR5K_DIAG_SW_DIS_CTS 0x00000004 /* Disable CTSs */ |
1313 | #define AR5K_DIAG_SW_DIS_ENC 0x00000008 /* Disable encryption (?) */ | 1394 | #define AR5K_DIAG_SW_DIS_ENC 0x00000008 /* Disable encryption */ |
1314 | #define AR5K_DIAG_SW_DIS_DEC 0x00000010 /* Disable decryption (?) */ | 1395 | #define AR5K_DIAG_SW_DIS_DEC 0x00000010 /* Disable decryption */ |
1315 | #define AR5K_DIAG_SW_DIS_TX 0x00000020 /* Disable transmit [5210] */ | 1396 | #define AR5K_DIAG_SW_DIS_TX 0x00000020 /* Disable transmit [5210] */ |
1316 | #define AR5K_DIAG_SW_DIS_RX_5210 0x00000040 /* Disable recieve */ | 1397 | #define AR5K_DIAG_SW_DIS_RX_5210 0x00000040 /* Disable recieve */ |
1317 | #define AR5K_DIAG_SW_DIS_RX_5211 0x00000020 | 1398 | #define AR5K_DIAG_SW_DIS_RX_5211 0x00000020 |
@@ -1329,13 +1410,13 @@ | |||
1329 | #define AR5K_DIAG_SW_CHAN_INFO_5211 0x00000100 | 1410 | #define AR5K_DIAG_SW_CHAN_INFO_5211 0x00000100 |
1330 | #define AR5K_DIAG_SW_CHAN_INFO (ah->ah_version == AR5K_AR5210 ? \ | 1411 | #define AR5K_DIAG_SW_CHAN_INFO (ah->ah_version == AR5K_AR5210 ? \ |
1331 | AR5K_DIAG_SW_CHAN_INFO_5210 : AR5K_DIAG_SW_CHAN_INFO_5211) | 1412 | AR5K_DIAG_SW_CHAN_INFO_5210 : AR5K_DIAG_SW_CHAN_INFO_5211) |
1332 | #define AR5K_DIAG_SW_EN_SCRAM_SEED_5211 0x00000200 /* Scrambler seed (?) */ | 1413 | #define AR5K_DIAG_SW_EN_SCRAM_SEED_5211 0x00000200 /* Enable scrambler seed */ |
1333 | #define AR5K_DIAG_SW_EN_SCRAM_SEED_5210 0x00000400 | 1414 | #define AR5K_DIAG_SW_EN_SCRAM_SEED_5210 0x00000400 |
1334 | #define AR5K_DIAG_SW_EN_SCRAM_SEED (ah->ah_version == AR5K_AR5210 ? \ | 1415 | #define AR5K_DIAG_SW_EN_SCRAM_SEED (ah->ah_version == AR5K_AR5210 ? \ |
1335 | AR5K_DIAG_SW_EN_SCRAM_SEED_5210 : AR5K_DIAG_SW_EN_SCRAM_SEED_5211) | 1416 | AR5K_DIAG_SW_EN_SCRAM_SEED_5210 : AR5K_DIAG_SW_EN_SCRAM_SEED_5211) |
1336 | #define AR5K_DIAG_SW_ECO_ENABLE 0x00000400 /* [5211+] */ | 1417 | #define AR5K_DIAG_SW_ECO_ENABLE 0x00000400 /* [5211+] */ |
1337 | #define AR5K_DIAG_SW_SCVRAM_SEED 0x0003f800 /* [5210] */ | 1418 | #define AR5K_DIAG_SW_SCVRAM_SEED 0x0003f800 /* [5210] */ |
1338 | #define AR5K_DIAG_SW_SCRAM_SEED_M 0x0001fc00 /* Scrambler seed mask (?) */ | 1419 | #define AR5K_DIAG_SW_SCRAM_SEED_M 0x0001fc00 /* Scrambler seed mask */ |
1339 | #define AR5K_DIAG_SW_SCRAM_SEED_S 10 | 1420 | #define AR5K_DIAG_SW_SCRAM_SEED_S 10 |
1340 | #define AR5K_DIAG_SW_DIS_SEQ_INC 0x00040000 /* Disable seqnum increment (?)[5210] */ | 1421 | #define AR5K_DIAG_SW_DIS_SEQ_INC 0x00040000 /* Disable seqnum increment (?)[5210] */ |
1341 | #define AR5K_DIAG_SW_FRAME_NV0_5210 0x00080000 | 1422 | #define AR5K_DIAG_SW_FRAME_NV0_5210 0x00080000 |
@@ -1344,6 +1425,7 @@ | |||
1344 | AR5K_DIAG_SW_FRAME_NV0_5210 : AR5K_DIAG_SW_FRAME_NV0_5211) | 1425 | AR5K_DIAG_SW_FRAME_NV0_5210 : AR5K_DIAG_SW_FRAME_NV0_5211) |
1345 | #define AR5K_DIAG_SW_OBSPT_M 0x000c0000 | 1426 | #define AR5K_DIAG_SW_OBSPT_M 0x000c0000 |
1346 | #define AR5K_DIAG_SW_OBSPT_S 18 | 1427 | #define AR5K_DIAG_SW_OBSPT_S 18 |
1428 | /* more bits */ | ||
1347 | 1429 | ||
1348 | /* | 1430 | /* |
1349 | * TSF (clock) register (lower 32 bits) | 1431 | * TSF (clock) register (lower 32 bits) |
@@ -1369,15 +1451,34 @@ | |||
1369 | /* | 1451 | /* |
1370 | * ADDAC test register [5211+] | 1452 | * ADDAC test register [5211+] |
1371 | */ | 1453 | */ |
1372 | #define AR5K_ADDAC_TEST 0x8054 | 1454 | #define AR5K_ADDAC_TEST 0x8054 /* Register Address */ |
1373 | #define AR5K_ADDAC_TEST_TXCONT 0x00000001 | 1455 | #define AR5K_ADDAC_TEST_TXCONT 0x00000001 /* Test continuous tx */ |
1456 | #define AR5K_ADDAC_TEST_TST_MODE 0x00000002 /* Test mode */ | ||
1457 | #define AR5K_ADDAC_TEST_LOOP_EN 0x00000004 /* Enable loop */ | ||
1458 | #define AR5K_ADDAC_TEST_LOOP_LEN 0x00000008 /* Loop length (field) */ | ||
1459 | #define AR5K_ADDAC_TEST_USE_U8 0x00004000 /* Use upper 8 bits */ | ||
1460 | #define AR5K_ADDAC_TEST_MSB 0x00008000 /* State of MSB */ | ||
1461 | #define AR5K_ADDAC_TEST_TRIG_SEL 0x00010000 /* Trigger select */ | ||
1462 | #define AR5K_ADDAC_TEST_TRIG_PTY 0x00020000 /* Trigger polarity */ | ||
1463 | #define AR5K_ADDAC_TEST_RXCONT 0x00040000 /* Continuous capture */ | ||
1464 | #define AR5K_ADDAC_TEST_CAPTURE 0x00080000 /* Begin capture */ | ||
1465 | #define AR5K_ADDAC_TEST_TST_ARM 0x00100000 /* Test ARM (Adaptive Radio Mode ?) */ | ||
1374 | 1466 | ||
1375 | /* | 1467 | /* |
1376 | * Default antenna register [5211+] | 1468 | * Default antenna register [5211+] |
1377 | */ | 1469 | */ |
1378 | #define AR5K_DEFAULT_ANTENNA 0x8058 | 1470 | #define AR5K_DEFAULT_ANTENNA 0x8058 |
1379 | 1471 | ||
1472 | /* | ||
1473 | * Frame control QoS mask register (?) [5211+] | ||
1474 | * (FC_QOS_MASK) | ||
1475 | */ | ||
1476 | #define AR5K_FRAME_CTL_QOSM 0x805c | ||
1380 | 1477 | ||
1478 | /* | ||
1479 | * Seq mask register (?) [5211+] | ||
1480 | */ | ||
1481 | #define AR5K_SEQ_MASK 0x8060 | ||
1381 | 1482 | ||
1382 | /* | 1483 | /* |
1383 | * Retry count register [5210] | 1484 | * Retry count register [5210] |
@@ -1449,124 +1550,242 @@ | |||
1449 | /* | 1550 | /* |
1450 | * XR (eXtended Range) mode register | 1551 | * XR (eXtended Range) mode register |
1451 | */ | 1552 | */ |
1452 | #define AR5K_XRMODE 0x80c0 | 1553 | #define AR5K_XRMODE 0x80c0 /* Register Address */ |
1453 | #define AR5K_XRMODE_POLL_TYPE_M 0x0000003f | 1554 | #define AR5K_XRMODE_POLL_TYPE_M 0x0000003f /* Mask for Poll type (?) */ |
1454 | #define AR5K_XRMODE_POLL_TYPE_S 0 | 1555 | #define AR5K_XRMODE_POLL_TYPE_S 0 |
1455 | #define AR5K_XRMODE_POLL_SUBTYPE_M 0x0000003c | 1556 | #define AR5K_XRMODE_POLL_SUBTYPE_M 0x0000003c /* Mask for Poll subtype (?) */ |
1456 | #define AR5K_XRMODE_POLL_SUBTYPE_S 2 | 1557 | #define AR5K_XRMODE_POLL_SUBTYPE_S 2 |
1457 | #define AR5K_XRMODE_POLL_WAIT_ALL 0x00000080 | 1558 | #define AR5K_XRMODE_POLL_WAIT_ALL 0x00000080 /* Wait for poll */ |
1458 | #define AR5K_XRMODE_SIFS_DELAY 0x000fff00 | 1559 | #define AR5K_XRMODE_SIFS_DELAY 0x000fff00 /* Mask for SIFS delay */ |
1459 | #define AR5K_XRMODE_FRAME_HOLD_M 0xfff00000 | 1560 | #define AR5K_XRMODE_FRAME_HOLD_M 0xfff00000 /* Mask for frame hold (?) */ |
1460 | #define AR5K_XRMODE_FRAME_HOLD_S 20 | 1561 | #define AR5K_XRMODE_FRAME_HOLD_S 20 |
1461 | 1562 | ||
1462 | /* | 1563 | /* |
1463 | * XR delay register | 1564 | * XR delay register |
1464 | */ | 1565 | */ |
1465 | #define AR5K_XRDELAY 0x80c4 | 1566 | #define AR5K_XRDELAY 0x80c4 /* Register Address */ |
1466 | #define AR5K_XRDELAY_SLOT_DELAY_M 0x0000ffff | 1567 | #define AR5K_XRDELAY_SLOT_DELAY_M 0x0000ffff /* Mask for slot delay */ |
1467 | #define AR5K_XRDELAY_SLOT_DELAY_S 0 | 1568 | #define AR5K_XRDELAY_SLOT_DELAY_S 0 |
1468 | #define AR5K_XRDELAY_CHIRP_DELAY_M 0xffff0000 | 1569 | #define AR5K_XRDELAY_CHIRP_DELAY_M 0xffff0000 /* Mask for CHIRP data delay */ |
1469 | #define AR5K_XRDELAY_CHIRP_DELAY_S 16 | 1570 | #define AR5K_XRDELAY_CHIRP_DELAY_S 16 |
1470 | 1571 | ||
1471 | /* | 1572 | /* |
1472 | * XR timeout register | 1573 | * XR timeout register |
1473 | */ | 1574 | */ |
1474 | #define AR5K_XRTIMEOUT 0x80c8 | 1575 | #define AR5K_XRTIMEOUT 0x80c8 /* Register Address */ |
1475 | #define AR5K_XRTIMEOUT_CHIRP_M 0x0000ffff | 1576 | #define AR5K_XRTIMEOUT_CHIRP_M 0x0000ffff /* Mask for CHIRP timeout */ |
1476 | #define AR5K_XRTIMEOUT_CHIRP_S 0 | 1577 | #define AR5K_XRTIMEOUT_CHIRP_S 0 |
1477 | #define AR5K_XRTIMEOUT_POLL_M 0xffff0000 | 1578 | #define AR5K_XRTIMEOUT_POLL_M 0xffff0000 /* Mask for Poll timeout */ |
1478 | #define AR5K_XRTIMEOUT_POLL_S 16 | 1579 | #define AR5K_XRTIMEOUT_POLL_S 16 |
1479 | 1580 | ||
1480 | /* | 1581 | /* |
1481 | * XR chirp register | 1582 | * XR chirp register |
1482 | */ | 1583 | */ |
1483 | #define AR5K_XRCHIRP 0x80cc | 1584 | #define AR5K_XRCHIRP 0x80cc /* Register Address */ |
1484 | #define AR5K_XRCHIRP_SEND 0x00000001 | 1585 | #define AR5K_XRCHIRP_SEND 0x00000001 /* Send CHIRP */ |
1485 | #define AR5K_XRCHIRP_GAP 0xffff0000 | 1586 | #define AR5K_XRCHIRP_GAP 0xffff0000 /* Mask for CHIRP gap (?) */ |
1486 | 1587 | ||
1487 | /* | 1588 | /* |
1488 | * XR stomp register | 1589 | * XR stomp register |
1489 | */ | 1590 | */ |
1490 | #define AR5K_XRSTOMP 0x80d0 | 1591 | #define AR5K_XRSTOMP 0x80d0 /* Register Address */ |
1491 | #define AR5K_XRSTOMP_TX 0x00000001 | 1592 | #define AR5K_XRSTOMP_TX 0x00000001 /* Stomp Tx (?) */ |
1492 | #define AR5K_XRSTOMP_RX_ABORT 0x00000002 | 1593 | #define AR5K_XRSTOMP_RX 0x00000002 /* Stomp Rx (?) */ |
1493 | #define AR5K_XRSTOMP_RSSI_THRES 0x0000ff00 | 1594 | #define AR5K_XRSTOMP_TX_RSSI 0x00000004 /* Stomp Tx RSSI (?) */ |
1595 | #define AR5K_XRSTOMP_TX_BSSID 0x00000008 /* Stomp Tx BSSID (?) */ | ||
1596 | #define AR5K_XRSTOMP_DATA 0x00000010 /* Stomp data (?)*/ | ||
1597 | #define AR5K_XRSTOMP_RSSI_THRES 0x0000ff00 /* Mask for XR RSSI threshold */ | ||
1494 | 1598 | ||
1495 | /* | 1599 | /* |
1496 | * First enhanced sleep register | 1600 | * First enhanced sleep register |
1497 | */ | 1601 | */ |
1498 | #define AR5K_SLEEP0 0x80d4 | 1602 | #define AR5K_SLEEP0 0x80d4 /* Register Address */ |
1499 | #define AR5K_SLEEP0_NEXT_DTIM 0x0007ffff | 1603 | #define AR5K_SLEEP0_NEXT_DTIM 0x0007ffff /* Mask for next DTIM (?) */ |
1500 | #define AR5K_SLEEP0_NEXT_DTIM_S 0 | 1604 | #define AR5K_SLEEP0_NEXT_DTIM_S 0 |
1501 | #define AR5K_SLEEP0_ASSUME_DTIM 0x00080000 | 1605 | #define AR5K_SLEEP0_ASSUME_DTIM 0x00080000 /* Assume DTIM */ |
1502 | #define AR5K_SLEEP0_ENH_SLEEP_EN 0x00100000 | 1606 | #define AR5K_SLEEP0_ENH_SLEEP_EN 0x00100000 /* Enable enchanced sleep control */ |
1503 | #define AR5K_SLEEP0_CABTO 0xff000000 | 1607 | #define AR5K_SLEEP0_CABTO 0xff000000 /* Mask for CAB Time Out */ |
1504 | #define AR5K_SLEEP0_CABTO_S 24 | 1608 | #define AR5K_SLEEP0_CABTO_S 24 |
1505 | 1609 | ||
1506 | /* | 1610 | /* |
1507 | * Second enhanced sleep register | 1611 | * Second enhanced sleep register |
1508 | */ | 1612 | */ |
1509 | #define AR5K_SLEEP1 0x80d8 | 1613 | #define AR5K_SLEEP1 0x80d8 /* Register Address */ |
1510 | #define AR5K_SLEEP1_NEXT_TIM 0x0007ffff | 1614 | #define AR5K_SLEEP1_NEXT_TIM 0x0007ffff /* Mask for next TIM (?) */ |
1511 | #define AR5K_SLEEP1_NEXT_TIM_S 0 | 1615 | #define AR5K_SLEEP1_NEXT_TIM_S 0 |
1512 | #define AR5K_SLEEP1_BEACON_TO 0xff000000 | 1616 | #define AR5K_SLEEP1_BEACON_TO 0xff000000 /* Mask for Beacon Time Out */ |
1513 | #define AR5K_SLEEP1_BEACON_TO_S 24 | 1617 | #define AR5K_SLEEP1_BEACON_TO_S 24 |
1514 | 1618 | ||
1515 | /* | 1619 | /* |
1516 | * Third enhanced sleep register | 1620 | * Third enhanced sleep register |
1517 | */ | 1621 | */ |
1518 | #define AR5K_SLEEP2 0x80dc | 1622 | #define AR5K_SLEEP2 0x80dc /* Register Address */ |
1519 | #define AR5K_SLEEP2_TIM_PER 0x0000ffff | 1623 | #define AR5K_SLEEP2_TIM_PER 0x0000ffff /* Mask for TIM period (?) */ |
1520 | #define AR5K_SLEEP2_TIM_PER_S 0 | 1624 | #define AR5K_SLEEP2_TIM_PER_S 0 |
1521 | #define AR5K_SLEEP2_DTIM_PER 0xffff0000 | 1625 | #define AR5K_SLEEP2_DTIM_PER 0xffff0000 /* Mask for DTIM period (?) */ |
1522 | #define AR5K_SLEEP2_DTIM_PER_S 16 | 1626 | #define AR5K_SLEEP2_DTIM_PER_S 16 |
1523 | 1627 | ||
1524 | /* | 1628 | /* |
1525 | * BSSID mask registers | 1629 | * BSSID mask registers |
1526 | */ | 1630 | */ |
1527 | #define AR5K_BSS_IDM0 0x80e0 | 1631 | #define AR5K_BSS_IDM0 0x80e0 /* Upper bits */ |
1528 | #define AR5K_BSS_IDM1 0x80e4 | 1632 | #define AR5K_BSS_IDM1 0x80e4 /* Lower bits */ |
1529 | 1633 | ||
1530 | /* | 1634 | /* |
1531 | * TX power control (TPC) register | 1635 | * TX power control (TPC) register |
1636 | * | ||
1637 | * XXX: PCDAC steps (0.5dbm) or DBM ? | ||
1638 | * | ||
1639 | * XXX: Mask changes for newer chips to 7f | ||
1640 | * like tx power table ? | ||
1532 | */ | 1641 | */ |
1533 | #define AR5K_TXPC 0x80e8 | 1642 | #define AR5K_TXPC 0x80e8 /* Register Address */ |
1534 | #define AR5K_TXPC_ACK_M 0x0000003f | 1643 | #define AR5K_TXPC_ACK_M 0x0000003f /* Mask for ACK tx power */ |
1535 | #define AR5K_TXPC_ACK_S 0 | 1644 | #define AR5K_TXPC_ACK_S 0 |
1536 | #define AR5K_TXPC_CTS_M 0x00003f00 | 1645 | #define AR5K_TXPC_CTS_M 0x00003f00 /* Mask for CTS tx power */ |
1537 | #define AR5K_TXPC_CTS_S 8 | 1646 | #define AR5K_TXPC_CTS_S 8 |
1538 | #define AR5K_TXPC_CHIRP_M 0x003f0000 | 1647 | #define AR5K_TXPC_CHIRP_M 0x003f0000 /* Mask for CHIRP tx power */ |
1539 | #define AR5K_TXPC_CHIRP_S 22 | 1648 | #define AR5K_TXPC_CHIRP_S 22 |
1540 | 1649 | ||
1541 | /* | 1650 | /* |
1542 | * Profile count registers | 1651 | * Profile count registers |
1543 | */ | 1652 | */ |
1544 | #define AR5K_PROFCNT_TX 0x80ec | 1653 | #define AR5K_PROFCNT_TX 0x80ec /* Tx count */ |
1545 | #define AR5K_PROFCNT_RX 0x80f0 | 1654 | #define AR5K_PROFCNT_RX 0x80f0 /* Rx count */ |
1546 | #define AR5K_PROFCNT_RXCLR 0x80f4 | 1655 | #define AR5K_PROFCNT_RXCLR 0x80f4 /* Clear Rx count */ |
1547 | #define AR5K_PROFCNT_CYCLE 0x80f8 | 1656 | #define AR5K_PROFCNT_CYCLE 0x80f8 /* Cycle count (?) */ |
1657 | |||
1658 | /* | ||
1659 | * Quiet (period) control registers (?) | ||
1660 | */ | ||
1661 | #define AR5K_QUIET_CTL1 0x80fc /* Register Address */ | ||
1662 | #define AR5K_QUIET_CTL1_NEXT_QT 0x0000ffff /* Mask for next quiet (period?) (?) */ | ||
1663 | #define AR5K_QUIET_CTL1_QT_EN 0x00010000 /* Enable quiet (period?) */ | ||
1664 | #define AR5K_QUIET_CTL2 0x8100 /* Register Address */ | ||
1665 | #define AR5K_QUIET_CTL2_QT_PER 0x0000ffff /* Mask for quiet period (?) */ | ||
1666 | #define AR5K_QUIET_CTL2_QT_DUR 0xffff0000 /* Mask for quiet duration (?) */ | ||
1548 | 1667 | ||
1549 | /* | 1668 | /* |
1550 | * TSF parameter register | 1669 | * TSF parameter register |
1551 | */ | 1670 | */ |
1552 | #define AR5K_TSF_PARM 0x8104 | 1671 | #define AR5K_TSF_PARM 0x8104 /* Register Address */ |
1553 | #define AR5K_TSF_PARM_INC_M 0x000000ff | 1672 | #define AR5K_TSF_PARM_INC_M 0x000000ff /* Mask for TSF increment */ |
1554 | #define AR5K_TSF_PARM_INC_S 0 | 1673 | #define AR5K_TSF_PARM_INC_S 0 |
1555 | 1674 | ||
1556 | /* | 1675 | /* |
1676 | * QoS register (?) | ||
1677 | */ | ||
1678 | #define AR5K_QOS 0x8108 /* Register Address */ | ||
1679 | #define AR5K_QOS_NOACK_2BIT_VALUES 0x00000000 /* (field) */ | ||
1680 | #define AR5K_QOS_NOACK_BIT_OFFSET 0x00000020 /* (field) */ | ||
1681 | #define AR5K_QOS_NOACK_BYTE_OFFSET 0x00000080 /* (field) */ | ||
1682 | |||
1683 | /* | ||
1557 | * PHY error filter register | 1684 | * PHY error filter register |
1558 | */ | 1685 | */ |
1559 | #define AR5K_PHY_ERR_FIL 0x810c | 1686 | #define AR5K_PHY_ERR_FIL 0x810c |
1560 | #define AR5K_PHY_ERR_FIL_RADAR 0x00000020 | 1687 | #define AR5K_PHY_ERR_FIL_RADAR 0x00000020 /* Radar signal */ |
1561 | #define AR5K_PHY_ERR_FIL_OFDM 0x00020000 | 1688 | #define AR5K_PHY_ERR_FIL_OFDM 0x00020000 /* OFDM false detect (ANI) */ |
1562 | #define AR5K_PHY_ERR_FIL_CCK 0x02000000 | 1689 | #define AR5K_PHY_ERR_FIL_CCK 0x02000000 /* CCK false detect (ANI) */ |
1690 | |||
1691 | /* | ||
1692 | * XR latency register | ||
1693 | */ | ||
1694 | #define AR5K_XRLAT_TX 0x8110 | ||
1563 | 1695 | ||
1564 | /* | 1696 | /* |
1565 | * Rate duration register | 1697 | * ACK SIFS register |
1698 | */ | ||
1699 | #define AR5K_ACKSIFS 0x8114 /* Register Address */ | ||
1700 | #define AR5K_ACKSIFS_INC 0x00000000 /* ACK SIFS Increment (field) */ | ||
1701 | |||
1702 | /* | ||
1703 | * MIC QoS control register (?) | ||
1704 | */ | ||
1705 | #define AR5K_MIC_QOS_CTL 0x8118 /* Register Address */ | ||
1706 | #define AR5K_MIC_QOS_CTL_0 0x00000001 /* MIC QoS control 0 (?) */ | ||
1707 | #define AR5K_MIC_QOS_CTL_1 0x00000004 /* MIC QoS control 1 (?) */ | ||
1708 | #define AR5K_MIC_QOS_CTL_2 0x00000010 /* MIC QoS control 2 (?) */ | ||
1709 | #define AR5K_MIC_QOS_CTL_3 0x00000040 /* MIC QoS control 3 (?) */ | ||
1710 | #define AR5K_MIC_QOS_CTL_4 0x00000100 /* MIC QoS control 4 (?) */ | ||
1711 | #define AR5K_MIC_QOS_CTL_5 0x00000400 /* MIC QoS control 5 (?) */ | ||
1712 | #define AR5K_MIC_QOS_CTL_6 0x00001000 /* MIC QoS control 6 (?) */ | ||
1713 | #define AR5K_MIC_QOS_CTL_7 0x00004000 /* MIC QoS control 7 (?) */ | ||
1714 | #define AR5K_MIC_QOS_CTL_MQ_EN 0x00010000 /* Enable MIC QoS */ | ||
1715 | |||
1716 | /* | ||
1717 | * MIC QoS select register (?) | ||
1718 | */ | ||
1719 | #define AR5K_MIC_QOS_SEL 0x811c | ||
1720 | #define AR5K_MIC_QOS_SEL_0 0x00000001 | ||
1721 | #define AR5K_MIC_QOS_SEL_1 0x00000010 | ||
1722 | #define AR5K_MIC_QOS_SEL_2 0x00000100 | ||
1723 | #define AR5K_MIC_QOS_SEL_3 0x00001000 | ||
1724 | #define AR5K_MIC_QOS_SEL_4 0x00010000 | ||
1725 | #define AR5K_MIC_QOS_SEL_5 0x00100000 | ||
1726 | #define AR5K_MIC_QOS_SEL_6 0x01000000 | ||
1727 | #define AR5K_MIC_QOS_SEL_7 0x10000000 | ||
1728 | |||
1729 | /* | ||
1730 | * Misc mode control register (?) | ||
1731 | */ | ||
1732 | #define AR5K_MISC_MODE 0x8120 /* Register Address */ | ||
1733 | #define AR5K_MISC_MODE_FBSSID_MATCH 0x00000001 /* Force BSSID match */ | ||
1734 | #define AR5K_MISC_MODE_ACKSIFS_MEM 0x00000002 /* ACK SIFS memory (?) */ | ||
1735 | /* more bits */ | ||
1736 | |||
1737 | /* | ||
1738 | * OFDM Filter counter | ||
1739 | */ | ||
1740 | #define AR5K_OFDM_FIL_CNT 0x8124 | ||
1741 | |||
1742 | /* | ||
1743 | * CCK Filter counter | ||
1744 | */ | ||
1745 | #define AR5K_CCK_FIL_CNT 0x8128 | ||
1746 | |||
1747 | /* | ||
1748 | * PHY Error Counters (?) | ||
1749 | */ | ||
1750 | #define AR5K_PHYERR_CNT1 0x812c | ||
1751 | #define AR5K_PHYERR_CNT1_MASK 0x8130 | ||
1752 | |||
1753 | #define AR5K_PHYERR_CNT2 0x8134 | ||
1754 | #define AR5K_PHYERR_CNT2_MASK 0x8138 | ||
1755 | |||
1756 | /* | ||
1757 | * TSF Threshold register (?) | ||
1758 | */ | ||
1759 | #define AR5K_TSF_THRES 0x813c | ||
1760 | |||
1761 | /* | ||
1762 | * Rate -> ACK SIFS mapping table (32 entries) | ||
1763 | */ | ||
1764 | #define AR5K_RATE_ACKSIFS_BASE 0x8680 /* Register Address */ | ||
1765 | #define AR5K_RATE_ACKSIFS(_n) (AR5K_RATE_ACKSIFS_BSE + ((_n) << 2)) | ||
1766 | #define AR5K_RATE_ACKSIFS_NORMAL 0x00000001 /* Normal SIFS (field) */ | ||
1767 | #define AR5K_RATE_ACKSIFS_TURBO 0x00000400 /* Turbo SIFS (field) */ | ||
1768 | |||
1769 | /* | ||
1770 | * Rate -> duration mapping table (32 entries) | ||
1566 | */ | 1771 | */ |
1567 | #define AR5K_RATE_DUR_BASE 0x8700 | 1772 | #define AR5K_RATE_DUR_BASE 0x8700 |
1568 | #define AR5K_RATE_DUR(_n) (AR5K_RATE_DUR_BASE + ((_n) << 2)) | 1773 | #define AR5K_RATE_DUR(_n) (AR5K_RATE_DUR_BASE + ((_n) << 2)) |
1569 | 1774 | ||
1775 | /* | ||
1776 | * Rate -> db mapping table | ||
1777 | * (8 entries, each one has 4 8bit fields) | ||
1778 | */ | ||
1779 | #define AR5K_RATE2DB_BASE 0x87c0 | ||
1780 | #define AR5K_RATE2DB(_n) (AR5K_RATE2DB_BASE + ((_n) << 2)) | ||
1781 | |||
1782 | /* | ||
1783 | * db -> Rate mapping table | ||
1784 | * (8 entries, each one has 4 8bit fields) | ||
1785 | */ | ||
1786 | #define AR5K_DB2RATE_BASE 0x87e0 | ||
1787 | #define AR5K_DB2RATE(_n) (AR5K_DB2RATE_BASE + ((_n) << 2)) | ||
1788 | |||
1570 | /*===5212 end===*/ | 1789 | /*===5212 end===*/ |
1571 | 1790 | ||
1572 | /* | 1791 | /* |
@@ -1613,12 +1832,34 @@ | |||
1613 | /*===PHY REGISTERS===*/ | 1832 | /*===PHY REGISTERS===*/ |
1614 | 1833 | ||
1615 | /* | 1834 | /* |
1616 | * PHY register | 1835 | * PHY registers start |
1617 | */ | 1836 | */ |
1618 | #define AR5K_PHY_BASE 0x9800 | 1837 | #define AR5K_PHY_BASE 0x9800 |
1619 | #define AR5K_PHY(_n) (AR5K_PHY_BASE + ((_n) << 2)) | 1838 | #define AR5K_PHY(_n) (AR5K_PHY_BASE + ((_n) << 2)) |
1620 | #define AR5K_PHY_SHIFT_2GHZ 0x00004007 | 1839 | |
1621 | #define AR5K_PHY_SHIFT_5GHZ 0x00000007 | 1840 | /* |
1841 | * TST_2 (Misc config parameters) | ||
1842 | */ | ||
1843 | #define AR5K_PHY_TST2 0x9800 /* Register Address */ | ||
1844 | #define AR5K_PHY_TST2_TRIG_SEL 0x00000001 /* Trigger select (?) (field ?) */ | ||
1845 | #define AR5K_PHY_TST2_TRIG 0x00000010 /* Trigger (?) (field ?) */ | ||
1846 | #define AR5K_PHY_TST2_CBUS_MODE 0x00000100 /* Cardbus mode (?) */ | ||
1847 | /* bit reserved */ | ||
1848 | #define AR5K_PHY_TST2_CLK32 0x00000400 /* CLK_OUT is CLK32 (32Khz external) */ | ||
1849 | #define AR5K_PHY_TST2_CHANCOR_DUMP_EN 0x00000800 /* Enable Chancor dump (?) */ | ||
1850 | #define AR5K_PHY_TST2_EVEN_CHANCOR_DUMP 0x00001000 /* Even Chancor dump (?) */ | ||
1851 | #define AR5K_PHY_TST2_RFSILENT_EN 0x00002000 /* Enable RFSILENT */ | ||
1852 | #define AR5K_PHY_TST2_ALT_RFDATA 0x00004000 /* Alternate RFDATA (5-2GHz switch) */ | ||
1853 | #define AR5K_PHY_TST2_MINI_OBS_EN 0x00008000 /* Enable mini OBS (?) */ | ||
1854 | #define AR5K_PHY_TST2_RX2_IS_RX5_INV 0x00010000 /* 2GHz rx path is the 5GHz path inverted (?) */ | ||
1855 | #define AR5K_PHY_TST2_SLOW_CLK160 0x00020000 /* Slow CLK160 (?) */ | ||
1856 | #define AR5K_PHY_TST2_AGC_OBS_SEL_3 0x00040000 /* AGC OBS Select 3 (?) */ | ||
1857 | #define AR5K_PHY_TST2_BBB_OBS_SEL 0x00080000 /* BB OBS Select (field ?) */ | ||
1858 | #define AR5K_PHY_TST2_ADC_OBS_SEL 0x00800000 /* ADC OBS Select (field ?) */ | ||
1859 | #define AR5K_PHY_TST2_RX_CLR_SEL 0x08000000 /* RX Clear Select (?) */ | ||
1860 | #define AR5K_PHY_TST2_FORCE_AGC_CLR 0x10000000 /* Force AGC clear (?) */ | ||
1861 | #define AR5K_PHY_SHIFT_2GHZ 0x00004007 /* Used to access 2GHz radios */ | ||
1862 | #define AR5K_PHY_SHIFT_5GHZ 0x00000007 /* Used to access 5GHz radios (default) */ | ||
1622 | 1863 | ||
1623 | /* | 1864 | /* |
1624 | * PHY frame control register [5110] /turbo mode register [5111+] | 1865 | * PHY frame control register [5110] /turbo mode register [5111+] |
@@ -1630,18 +1871,21 @@ | |||
1630 | * a "turbo mode register" for 5110. We treat this one as | 1871 | * a "turbo mode register" for 5110. We treat this one as |
1631 | * a frame control register for 5110 below. | 1872 | * a frame control register for 5110 below. |
1632 | */ | 1873 | */ |
1633 | #define AR5K_PHY_TURBO 0x9804 | 1874 | #define AR5K_PHY_TURBO 0x9804 /* Register Address */ |
1634 | #define AR5K_PHY_TURBO_MODE 0x00000001 | 1875 | #define AR5K_PHY_TURBO_MODE 0x00000001 /* Enable turbo mode */ |
1635 | #define AR5K_PHY_TURBO_SHORT 0x00000002 | 1876 | #define AR5K_PHY_TURBO_SHORT 0x00000002 /* Short mode (20Mhz channels) (?) */ |
1636 | 1877 | ||
1637 | /* | 1878 | /* |
1638 | * PHY agility command register | 1879 | * PHY agility command register |
1880 | * (aka TST_1) | ||
1639 | */ | 1881 | */ |
1640 | #define AR5K_PHY_AGC 0x9808 | 1882 | #define AR5K_PHY_AGC 0x9808 /* Register Address */ |
1641 | #define AR5K_PHY_AGC_DISABLE 0x08000000 | 1883 | #define AR5K_PHY_TST1 0x9808 |
1884 | #define AR5K_PHY_AGC_DISABLE 0x08000000 /* Disable AGC to A2 (?)*/ | ||
1885 | #define AR5K_PHY_TST1_TXHOLD 0x00003800 /* Set tx hold (?) */ | ||
1642 | 1886 | ||
1643 | /* | 1887 | /* |
1644 | * PHY timing register [5112+] | 1888 | * PHY timing register 3 [5112+] |
1645 | */ | 1889 | */ |
1646 | #define AR5K_PHY_TIMING_3 0x9814 | 1890 | #define AR5K_PHY_TIMING_3 0x9814 |
1647 | #define AR5K_PHY_TIMING_3_DSC_MAN 0xfffe0000 | 1891 | #define AR5K_PHY_TIMING_3_DSC_MAN 0xfffe0000 |
@@ -1657,26 +1901,81 @@ | |||
1657 | /* | 1901 | /* |
1658 | * PHY activation register | 1902 | * PHY activation register |
1659 | */ | 1903 | */ |
1660 | #define AR5K_PHY_ACT 0x981c | 1904 | #define AR5K_PHY_ACT 0x981c /* Register Address */ |
1661 | #define AR5K_PHY_ACT_ENABLE 0x00000001 | 1905 | #define AR5K_PHY_ACT_ENABLE 0x00000001 /* Activate PHY */ |
1662 | #define AR5K_PHY_ACT_DISABLE 0x00000002 | 1906 | #define AR5K_PHY_ACT_DISABLE 0x00000002 /* Deactivate PHY */ |
1907 | |||
1908 | /* | ||
1909 | * PHY RF control registers | ||
1910 | * (i think these are delay times, | ||
1911 | * these calibration values exist | ||
1912 | * in EEPROM) | ||
1913 | */ | ||
1914 | #define AR5K_PHY_RF_CTL2 0x9824 /* Register Address */ | ||
1915 | #define AR5K_PHY_RF_CTL2_TXF2TXD_START 0x0000000f /* Mask for TX frame to TX d(esc?) start */ | ||
1916 | |||
1917 | #define AR5K_PHY_RF_CTL3 0x9828 /* Register Address */ | ||
1918 | #define AR5K_PHY_RF_CTL3_TXE2XLNA_ON 0x0000000f /* Mask for TX end to XLNA on */ | ||
1919 | |||
1920 | #define AR5K_PHY_RF_CTL4 0x9834 /* Register Address */ | ||
1921 | #define AR5K_PHY_RF_CTL4_TXF2XPA_A_ON 0x00000001 /* TX frame to XPA A on (field) */ | ||
1922 | #define AR5K_PHY_RF_CTL4_TXF2XPA_B_ON 0x00000100 /* TX frame to XPA B on (field) */ | ||
1923 | #define AR5K_PHY_RF_CTL4_TXE2XPA_A_OFF 0x00010000 /* TX end to XPA A off (field) */ | ||
1924 | #define AR5K_PHY_RF_CTL4_TXE2XPA_B_OFF 0x01000000 /* TX end to XPA B off (field) */ | ||
1925 | |||
1926 | /* | ||
1927 | * Pre-Amplifier control register | ||
1928 | * (XPA -> external pre-amplifier) | ||
1929 | */ | ||
1930 | #define AR5K_PHY_PA_CTL 0x9838 /* Register Address */ | ||
1931 | #define AR5K_PHY_PA_CTL_XPA_A_HI 0x00000001 /* XPA A high (?) */ | ||
1932 | #define AR5K_PHY_PA_CTL_XPA_B_HI 0x00000002 /* XPA B high (?) */ | ||
1933 | #define AR5K_PHY_PA_CTL_XPA_A_EN 0x00000004 /* Enable XPA A */ | ||
1934 | #define AR5K_PHY_PA_CTL_XPA_B_EN 0x00000008 /* Enable XPA B */ | ||
1935 | |||
1936 | /* | ||
1937 | * PHY settling register | ||
1938 | */ | ||
1939 | #define AR5K_PHY_SETTLING 0x9844 /* Register Address */ | ||
1940 | #define AR5K_PHY_SETTLING_AGC 0x0000007f /* Mask for AGC settling time */ | ||
1941 | #define AR5K_PHY_SETTLING_SWITCH 0x00003f80 /* Mask for Switch settlig time */ | ||
1942 | |||
1943 | /* | ||
1944 | * PHY Gain registers | ||
1945 | */ | ||
1946 | #define AR5K_PHY_GAIN 0x9848 /* Register Address */ | ||
1947 | #define AR5K_PHY_GAIN_TXRX_ATTEN 0x0003f000 /* Mask for TX-RX Attenuation */ | ||
1948 | |||
1949 | #define AR5K_PHY_GAIN_OFFSET 0x984c /* Register Address */ | ||
1950 | #define AR5K_PHY_GAIN_OFFSET_RXTX_FLAG 0x00020000 /* RX-TX flag (?) */ | ||
1951 | |||
1952 | /* | ||
1953 | * Desired size register | ||
1954 | * (for more infos read ANI patent) | ||
1955 | */ | ||
1956 | #define AR5K_PHY_DESIRED_SIZE 0x9850 /* Register Address */ | ||
1957 | #define AR5K_PHY_DESIRED_SIZE_ADC 0x000000ff /* Mask for ADC desired size */ | ||
1958 | #define AR5K_PHY_DESIRED_SIZE_PGA 0x0000ff00 /* Mask for PGA desired size */ | ||
1959 | #define AR5K_PHY_DESIRED_SIZE_TOT 0x0ff00000 /* Mask for Total desired size (?) */ | ||
1663 | 1960 | ||
1664 | /* | 1961 | /* |
1665 | * PHY signal register | 1962 | * PHY signal register |
1963 | * (for more infos read ANI patent) | ||
1666 | */ | 1964 | */ |
1667 | #define AR5K_PHY_SIG 0x9858 | 1965 | #define AR5K_PHY_SIG 0x9858 /* Register Address */ |
1668 | #define AR5K_PHY_SIG_FIRSTEP 0x0003f000 | 1966 | #define AR5K_PHY_SIG_FIRSTEP 0x0003f000 /* Mask for FIRSTEP */ |
1669 | #define AR5K_PHY_SIG_FIRSTEP_S 12 | 1967 | #define AR5K_PHY_SIG_FIRSTEP_S 12 |
1670 | #define AR5K_PHY_SIG_FIRPWR 0x03fc0000 | 1968 | #define AR5K_PHY_SIG_FIRPWR 0x03fc0000 /* Mask for FIPWR */ |
1671 | #define AR5K_PHY_SIG_FIRPWR_S 18 | 1969 | #define AR5K_PHY_SIG_FIRPWR_S 18 |
1672 | 1970 | ||
1673 | /* | 1971 | /* |
1674 | * PHY coarse agility control register | 1972 | * PHY coarse agility control register |
1973 | * (for more infos read ANI patent) | ||
1675 | */ | 1974 | */ |
1676 | #define AR5K_PHY_AGCCOARSE 0x985c | 1975 | #define AR5K_PHY_AGCCOARSE 0x985c /* Register Address */ |
1677 | #define AR5K_PHY_AGCCOARSE_LO 0x00007f80 | 1976 | #define AR5K_PHY_AGCCOARSE_LO 0x00007f80 /* Mask for AGC Coarse low */ |
1678 | #define AR5K_PHY_AGCCOARSE_LO_S 7 | 1977 | #define AR5K_PHY_AGCCOARSE_LO_S 7 |
1679 | #define AR5K_PHY_AGCCOARSE_HI 0x003f8000 | 1978 | #define AR5K_PHY_AGCCOARSE_HI 0x003f8000 /* Mask for AGC Coarse high */ |
1680 | #define AR5K_PHY_AGCCOARSE_HI_S 15 | 1979 | #define AR5K_PHY_AGCCOARSE_HI_S 15 |
1681 | 1980 | ||
1682 | /* | 1981 | /* |
@@ -1689,12 +1988,13 @@ | |||
1689 | /* | 1988 | /* |
1690 | * PHY noise floor status register | 1989 | * PHY noise floor status register |
1691 | */ | 1990 | */ |
1692 | #define AR5K_PHY_NF 0x9864 | 1991 | #define AR5K_PHY_NF 0x9864 /* Register address */ |
1693 | #define AR5K_PHY_NF_M 0x000001ff | 1992 | #define AR5K_PHY_NF_M 0x000001ff /* Noise floor mask */ |
1694 | #define AR5K_PHY_NF_ACTIVE 0x00000100 | 1993 | #define AR5K_PHY_NF_ACTIVE 0x00000100 /* Noise floor calibration still active */ |
1695 | #define AR5K_PHY_NF_RVAL(_n) (((_n) >> 19) & AR5K_PHY_NF_M) | 1994 | #define AR5K_PHY_NF_RVAL(_n) (((_n) >> 19) & AR5K_PHY_NF_M) |
1696 | #define AR5K_PHY_NF_AVAL(_n) (-((_n) ^ AR5K_PHY_NF_M) + 1) | 1995 | #define AR5K_PHY_NF_AVAL(_n) (-((_n) ^ AR5K_PHY_NF_M) + 1) |
1697 | #define AR5K_PHY_NF_SVAL(_n) (((_n) & AR5K_PHY_NF_M) | (1 << 9)) | 1996 | #define AR5K_PHY_NF_SVAL(_n) (((_n) & AR5K_PHY_NF_M) | (1 << 9)) |
1997 | #define AR5K_PHY_NF_THRESH62 0x00001000 /* Thresh62 -check ANI patent- (field) */ | ||
1698 | 1998 | ||
1699 | /* | 1999 | /* |
1700 | * PHY ADC saturation register [5110] | 2000 | * PHY ADC saturation register [5110] |
@@ -1706,6 +2006,30 @@ | |||
1706 | #define AR5K_PHY_ADCSAT_THR_S 5 | 2006 | #define AR5K_PHY_ADCSAT_THR_S 5 |
1707 | 2007 | ||
1708 | /* | 2008 | /* |
2009 | * PHY Weak ofdm signal detection threshold registers (ANI) [5212+] | ||
2010 | */ | ||
2011 | |||
2012 | /* High thresholds */ | ||
2013 | #define AR5K_PHY_WEAK_OFDM_HIGH_THR 0x9868 | ||
2014 | #define AR5K_PHY_WEAK_OFDM_HIGH_THR_M2_COUNT 0x0000001f | ||
2015 | #define AR5K_PHY_WEAK_OFDM_HIGH_THR_M2_COUNT_S 0 | ||
2016 | #define AR5K_PHY_WEAK_OFDM_HIGH_THR_M1 0x00fe0000 | ||
2017 | #define AR5K_PHY_WEAK_OFDM_HIGH_THR_M1_S 17 | ||
2018 | #define AR5K_PHY_WEAK_OFDM_HIGH_THR_M2 0x7f000000 | ||
2019 | #define AR5K_PHY_WEAK_OFDM_HIGH_THR_M2_S 24 | ||
2020 | |||
2021 | /* Low thresholds */ | ||
2022 | #define AR5K_PHY_WEAK_OFDM_LOW_THR 0x986c | ||
2023 | #define AR5K_PHY_WEAK_OFDM_LOW_THR_SELFCOR_EN 0x00000001 | ||
2024 | #define AR5K_PHY_WEAK_OFDM_LOW_THR_M2_COUNT 0x00003f00 | ||
2025 | #define AR5K_PHY_WEAK_OFDM_LOW_THR_M2_COUNT_S 8 | ||
2026 | #define AR5K_PHY_WEAK_OFDM_LOW_THR_M1 0x001fc000 | ||
2027 | #define AR5K_PHY_WEAK_OFDM_LOW_THR_M1_S 14 | ||
2028 | #define AR5K_PHY_WEAK_OFDM_LOW_THR_M2 0x0fe00000 | ||
2029 | #define AR5K_PHY_WEAK_OFDM_LOW_THR_M2_S 21 | ||
2030 | |||
2031 | |||
2032 | /* | ||
1709 | * PHY sleep registers [5112+] | 2033 | * PHY sleep registers [5112+] |
1710 | */ | 2034 | */ |
1711 | #define AR5K_PHY_SCR 0x9870 | 2035 | #define AR5K_PHY_SCR 0x9870 |
@@ -1730,6 +2054,8 @@ | |||
1730 | AR5K_PHY_PLL_44MHZ_5211 : AR5K_PHY_PLL_44MHZ_5212) | 2054 | AR5K_PHY_PLL_44MHZ_5211 : AR5K_PHY_PLL_44MHZ_5212) |
1731 | #define AR5K_PHY_PLL_RF5111 0x00000000 | 2055 | #define AR5K_PHY_PLL_RF5111 0x00000000 |
1732 | #define AR5K_PHY_PLL_RF5112 0x00000040 | 2056 | #define AR5K_PHY_PLL_RF5112 0x00000040 |
2057 | #define AR5K_PHY_PLL_HALF_RATE 0x00000100 | ||
2058 | #define AR5K_PHY_PLL_QUARTER_RATE 0x00000200 | ||
1733 | 2059 | ||
1734 | /* | 2060 | /* |
1735 | * RF Buffer register | 2061 | * RF Buffer register |
@@ -1792,23 +2118,74 @@ | |||
1792 | #define AR5K_PHY_RFSTG_DISABLE 0x00000021 | 2118 | #define AR5K_PHY_RFSTG_DISABLE 0x00000021 |
1793 | 2119 | ||
1794 | /* | 2120 | /* |
2121 | * PHY Antenna control register | ||
2122 | */ | ||
2123 | #define AR5K_PHY_ANT_CTL 0x9910 /* Register Address */ | ||
2124 | #define AR5K_PHY_ANT_CTL_TXRX_EN 0x00000001 /* Enable TX/RX (?) */ | ||
2125 | #define AR5K_PHY_ANT_CTL_SECTORED_ANT 0x00000004 /* Sectored Antenna */ | ||
2126 | #define AR5K_PHY_ANT_CTL_HITUNE5 0x00000008 /* Hitune5 (?) */ | ||
2127 | #define AR5K_PHY_ANT_CTL_SWTABLE_IDLE 0x00000010 /* Switch table idle (?) */ | ||
2128 | |||
2129 | /* | ||
1795 | * PHY receiver delay register [5111+] | 2130 | * PHY receiver delay register [5111+] |
1796 | */ | 2131 | */ |
1797 | #define AR5K_PHY_RX_DELAY 0x9914 | 2132 | #define AR5K_PHY_RX_DELAY 0x9914 /* Register Address */ |
1798 | #define AR5K_PHY_RX_DELAY_M 0x00003fff | 2133 | #define AR5K_PHY_RX_DELAY_M 0x00003fff /* Mask for RX activate to receive delay (/100ns) */ |
2134 | |||
2135 | /* | ||
2136 | * PHY max rx length register (?) [5111] | ||
2137 | */ | ||
2138 | #define AR5K_PHY_MAX_RX_LEN 0x991c | ||
1799 | 2139 | ||
1800 | /* | 2140 | /* |
1801 | * PHY timing I(nphase) Q(adrature) control register [5111+] | 2141 | * PHY timing register 4 |
2142 | * I(nphase)/Q(adrature) calibration register [5111+] | ||
1802 | */ | 2143 | */ |
1803 | #define AR5K_PHY_IQ 0x9920 /* Register address */ | 2144 | #define AR5K_PHY_IQ 0x9920 /* Register Address */ |
1804 | #define AR5K_PHY_IQ_CORR_Q_Q_COFF 0x0000001f /* Mask for q correction info */ | 2145 | #define AR5K_PHY_IQ_CORR_Q_Q_COFF 0x0000001f /* Mask for q correction info */ |
1805 | #define AR5K_PHY_IQ_CORR_Q_I_COFF 0x000007e0 /* Mask for i correction info */ | 2146 | #define AR5K_PHY_IQ_CORR_Q_I_COFF 0x000007e0 /* Mask for i correction info */ |
1806 | #define AR5K_PHY_IQ_CORR_Q_I_COFF_S 5 | 2147 | #define AR5K_PHY_IQ_CORR_Q_I_COFF_S 5 |
1807 | #define AR5K_PHY_IQ_CORR_ENABLE 0x00000800 /* Enable i/q correction */ | 2148 | #define AR5K_PHY_IQ_CORR_ENABLE 0x00000800 /* Enable i/q correction */ |
1808 | #define AR5K_PHY_IQ_CAL_NUM_LOG_MAX 0x0000f000 | 2149 | #define AR5K_PHY_IQ_CAL_NUM_LOG_MAX 0x0000f000 /* Mask for max number of samples in log scale */ |
1809 | #define AR5K_PHY_IQ_CAL_NUM_LOG_MAX_S 12 | 2150 | #define AR5K_PHY_IQ_CAL_NUM_LOG_MAX_S 12 |
1810 | #define AR5K_PHY_IQ_RUN 0x00010000 /* Run i/q calibration */ | 2151 | #define AR5K_PHY_IQ_RUN 0x00010000 /* Run i/q calibration */ |
2152 | #define AR5K_PHY_IQ_USE_PT_DF 0x00020000 /* Use pilot track df (?) */ | ||
2153 | #define AR5K_PHY_IQ_EARLY_TRIG_THR 0x00200000 /* Early trigger threshold (?) (field) */ | ||
2154 | #define AR5K_PHY_IQ_PILOT_MASK_EN 0x10000000 /* Enable pilot mask (?) */ | ||
2155 | #define AR5K_PHY_IQ_CHAN_MASK_EN 0x20000000 /* Enable channel mask (?) */ | ||
2156 | #define AR5K_PHY_IQ_SPUR_FILT_EN 0x40000000 /* Enable spur filter */ | ||
2157 | #define AR5K_PHY_IQ_SPUR_RSSI_EN 0x80000000 /* Enable spur rssi */ | ||
1811 | 2158 | ||
2159 | /* | ||
2160 | * PHY timing register 5 | ||
2161 | * OFDM Self-correlator Cyclic RSSI threshold params | ||
2162 | * (Check out bb_cycpwr_thr1 on ANI patent) | ||
2163 | */ | ||
2164 | #define AR5K_PHY_OFDM_SELFCORR 0x9924 /* Register Address */ | ||
2165 | #define AR5K_PHY_OFDM_SELFCORR_CYPWR_THR1_EN 0x00000001 /* Enable cyclic RSSI thr 1 */ | ||
2166 | #define AR5K_PHY_OFDM_SELFCORR_CYPWR_THR1 0x000000fe /* Mask for Cyclic RSSI threshold 1 */ | ||
2167 | #define AR5K_PHY_OFDM_SELFCORR_CYPWR_THR3 0x00000100 /* Cyclic RSSI threshold 3 (field) (?) */ | ||
2168 | #define AR5K_PHY_OFDM_SELFCORR_RSSI_1ATHR_EN 0x00008000 /* Enable 1A RSSI threshold (?) */ | ||
2169 | #define AR5K_PHY_OFDM_SELFCORR_RSSI_1ATHR 0x00010000 /* 1A RSSI threshold (field) (?) */ | ||
2170 | #define AR5K_PHY_OFDM_SELFCORR_LSCTHR_HIRSSI 0x00800000 /* Long sc threshold hi rssi (?) */ | ||
2171 | |||
2172 | /* | ||
2173 | * PHY-only warm reset register | ||
2174 | */ | ||
2175 | #define AR5K_PHY_WARM_RESET 0x9928 | ||
2176 | |||
2177 | /* | ||
2178 | * PHY-only control register | ||
2179 | */ | ||
2180 | #define AR5K_PHY_CTL 0x992c /* Register Address */ | ||
2181 | #define AR5K_PHY_CTL_RX_DRAIN_RATE 0x00000001 /* RX drain rate (?) */ | ||
2182 | #define AR5K_PHY_CTL_LATE_TX_SIG_SYM 0x00000002 /* Late tx signal symbol (?) */ | ||
2183 | #define AR5K_PHY_CTL_GEN_SCRAMBLER 0x00000004 /* Generate scrambler */ | ||
2184 | #define AR5K_PHY_CTL_TX_ANT_SEL 0x00000008 /* TX antenna select */ | ||
2185 | #define AR5K_PHY_CTL_TX_ANT_STATIC 0x00000010 /* Static TX antenna */ | ||
2186 | #define AR5K_PHY_CTL_RX_ANT_SEL 0x00000020 /* RX antenna select */ | ||
2187 | #define AR5K_PHY_CTL_RX_ANT_STATIC 0x00000040 /* Static RX antenna */ | ||
2188 | #define AR5K_PHY_CTL_LOW_FREQ_SLE_EN 0x00000080 /* Enable low freq sleep */ | ||
1812 | 2189 | ||
1813 | /* | 2190 | /* |
1814 | * PHY PAPD probe register [5111+ (?)] | 2191 | * PHY PAPD probe register [5111+ (?)] |
@@ -1816,9 +2193,13 @@ | |||
1816 | * Because it's always 0 in 5211 initialization code | 2193 | * Because it's always 0 in 5211 initialization code |
1817 | */ | 2194 | */ |
1818 | #define AR5K_PHY_PAPD_PROBE 0x9930 | 2195 | #define AR5K_PHY_PAPD_PROBE 0x9930 |
2196 | #define AR5K_PHY_PAPD_PROBE_SH_HI_PAR 0x00000001 | ||
2197 | #define AR5K_PHY_PAPD_PROBE_PCDAC_BIAS 0x00000002 | ||
2198 | #define AR5K_PHY_PAPD_PROBE_COMP_GAIN 0x00000040 | ||
1819 | #define AR5K_PHY_PAPD_PROBE_TXPOWER 0x00007e00 | 2199 | #define AR5K_PHY_PAPD_PROBE_TXPOWER 0x00007e00 |
1820 | #define AR5K_PHY_PAPD_PROBE_TXPOWER_S 9 | 2200 | #define AR5K_PHY_PAPD_PROBE_TXPOWER_S 9 |
1821 | #define AR5K_PHY_PAPD_PROBE_TX_NEXT 0x00008000 | 2201 | #define AR5K_PHY_PAPD_PROBE_TX_NEXT 0x00008000 |
2202 | #define AR5K_PHY_PAPD_PROBE_PREDIST_EN 0x00010000 | ||
1822 | #define AR5K_PHY_PAPD_PROBE_TYPE 0x01800000 /* [5112+] */ | 2203 | #define AR5K_PHY_PAPD_PROBE_TYPE 0x01800000 /* [5112+] */ |
1823 | #define AR5K_PHY_PAPD_PROBE_TYPE_S 23 | 2204 | #define AR5K_PHY_PAPD_PROBE_TYPE_S 23 |
1824 | #define AR5K_PHY_PAPD_PROBE_TYPE_OFDM 0 | 2205 | #define AR5K_PHY_PAPD_PROBE_TYPE_OFDM 0 |
@@ -1848,15 +2229,16 @@ | |||
1848 | #define AR5K_PHY_FRAME_CTL (ah->ah_version == AR5K_AR5210 ? \ | 2229 | #define AR5K_PHY_FRAME_CTL (ah->ah_version == AR5K_AR5210 ? \ |
1849 | AR5K_PHY_FRAME_CTL_5210 : AR5K_PHY_FRAME_CTL_5211) | 2230 | AR5K_PHY_FRAME_CTL_5210 : AR5K_PHY_FRAME_CTL_5211) |
1850 | /*---[5111+]---*/ | 2231 | /*---[5111+]---*/ |
1851 | #define AR5K_PHY_FRAME_CTL_TX_CLIP 0x00000038 | 2232 | #define AR5K_PHY_FRAME_CTL_TX_CLIP 0x00000038 /* Mask for tx clip (?) */ |
1852 | #define AR5K_PHY_FRAME_CTL_TX_CLIP_S 3 | 2233 | #define AR5K_PHY_FRAME_CTL_TX_CLIP_S 3 |
2234 | #define AR5K_PHY_FRAME_CTL_PREP_CHINFO 0x00010000 /* Prepend chan info */ | ||
1853 | /*---[5110/5111]---*/ | 2235 | /*---[5110/5111]---*/ |
1854 | #define AR5K_PHY_FRAME_CTL_TIMING_ERR 0x01000000 | 2236 | #define AR5K_PHY_FRAME_CTL_TIMING_ERR 0x01000000 /* PHY timing error */ |
1855 | #define AR5K_PHY_FRAME_CTL_PARITY_ERR 0x02000000 | 2237 | #define AR5K_PHY_FRAME_CTL_PARITY_ERR 0x02000000 /* Parity error */ |
1856 | #define AR5K_PHY_FRAME_CTL_ILLRATE_ERR 0x04000000 /* illegal rate */ | 2238 | #define AR5K_PHY_FRAME_CTL_ILLRATE_ERR 0x04000000 /* Illegal rate */ |
1857 | #define AR5K_PHY_FRAME_CTL_ILLLEN_ERR 0x08000000 /* illegal length */ | 2239 | #define AR5K_PHY_FRAME_CTL_ILLLEN_ERR 0x08000000 /* Illegal length */ |
1858 | #define AR5K_PHY_FRAME_CTL_SERVICE_ERR 0x20000000 | 2240 | #define AR5K_PHY_FRAME_CTL_SERVICE_ERR 0x20000000 |
1859 | #define AR5K_PHY_FRAME_CTL_TXURN_ERR 0x40000000 /* tx underrun */ | 2241 | #define AR5K_PHY_FRAME_CTL_TXURN_ERR 0x40000000 /* TX underrun */ |
1860 | #define AR5K_PHY_FRAME_CTL_INI AR5K_PHY_FRAME_CTL_SERVICE_ERR | \ | 2242 | #define AR5K_PHY_FRAME_CTL_INI AR5K_PHY_FRAME_CTL_SERVICE_ERR | \ |
1861 | AR5K_PHY_FRAME_CTL_TXURN_ERR | \ | 2243 | AR5K_PHY_FRAME_CTL_TXURN_ERR | \ |
1862 | AR5K_PHY_FRAME_CTL_ILLLEN_ERR | \ | 2244 | AR5K_PHY_FRAME_CTL_ILLLEN_ERR | \ |
@@ -1915,6 +2297,11 @@ after DFS is enabled */ | |||
1915 | #define AR5K_PHY_ANT_SWITCH_TABLE_1 0x9964 | 2297 | #define AR5K_PHY_ANT_SWITCH_TABLE_1 0x9964 |
1916 | 2298 | ||
1917 | /* | 2299 | /* |
2300 | * PHY Noise floor threshold | ||
2301 | */ | ||
2302 | #define AR5K_PHY_NFTHRES 0x9968 | ||
2303 | |||
2304 | /* | ||
1918 | * PHY clock sleep registers [5112+] | 2305 | * PHY clock sleep registers [5112+] |
1919 | */ | 2306 | */ |
1920 | #define AR5K_PHY_SCLOCK 0x99f0 | 2307 | #define AR5K_PHY_SCLOCK 0x99f0 |
@@ -1922,56 +2309,116 @@ after DFS is enabled */ | |||
1922 | #define AR5K_PHY_SDELAY 0x99f4 | 2309 | #define AR5K_PHY_SDELAY 0x99f4 |
1923 | #define AR5K_PHY_SDELAY_32MHZ 0x000000ff | 2310 | #define AR5K_PHY_SDELAY_32MHZ 0x000000ff |
1924 | #define AR5K_PHY_SPENDING 0x99f8 | 2311 | #define AR5K_PHY_SPENDING 0x99f8 |
2312 | #define AR5K_PHY_SPENDING_14 0x00000014 | ||
2313 | #define AR5K_PHY_SPENDING_18 0x00000018 | ||
1925 | #define AR5K_PHY_SPENDING_RF5111 0x00000018 | 2314 | #define AR5K_PHY_SPENDING_RF5111 0x00000018 |
1926 | #define AR5K_PHY_SPENDING_RF5112 0x00000014 /* <- i 've only seen this on 2425 dumps ! */ | 2315 | #define AR5K_PHY_SPENDING_RF5112 0x00000014 |
1927 | #define AR5K_PHY_SPENDING_RF5112A 0x0000000e /* but since i only have 5112A-based chips */ | 2316 | /* #define AR5K_PHY_SPENDING_RF5112A 0x0000000e */ |
1928 | #define AR5K_PHY_SPENDING_RF5424 0x00000012 /* to test it might be also for old 5112. */ | 2317 | /* #define AR5K_PHY_SPENDING_RF5424 0x00000012 */ |
2318 | #define AR5K_PHY_SPENDING_RF5413 0x00000014 | ||
2319 | #define AR5K_PHY_SPENDING_RF2413 0x00000014 | ||
2320 | #define AR5K_PHY_SPENDING_RF2425 0x00000018 | ||
1929 | 2321 | ||
1930 | /* | 2322 | /* |
1931 | * Misc PHY/radio registers [5110 - 5111] | 2323 | * Misc PHY/radio registers [5110 - 5111] |
1932 | */ | 2324 | */ |
1933 | #define AR5K_BB_GAIN_BASE 0x9b00 /* BaseBand Amplifier Gain table base address */ | 2325 | #define AR5K_BB_GAIN_BASE 0x9b00 /* BaseBand Amplifier Gain table base address */ |
1934 | #define AR5K_BB_GAIN(_n) (AR5K_BB_GAIN_BASE + ((_n) << 2)) | 2326 | #define AR5K_BB_GAIN(_n) (AR5K_BB_GAIN_BASE + ((_n) << 2)) |
1935 | #define AR5K_RF_GAIN_BASE 0x9a00 /* RF Amplrifier Gain table base address */ | 2327 | #define AR5K_RF_GAIN_BASE 0x9a00 /* RF Amplrifier Gain table base address */ |
1936 | #define AR5K_RF_GAIN(_n) (AR5K_RF_GAIN_BASE + ((_n) << 2)) | 2328 | #define AR5K_RF_GAIN(_n) (AR5K_RF_GAIN_BASE + ((_n) << 2)) |
1937 | 2329 | ||
1938 | /* | 2330 | /* |
1939 | * PHY timing IQ calibration result register [5111+] | 2331 | * PHY timing IQ calibration result register [5111+] |
1940 | */ | 2332 | */ |
1941 | #define AR5K_PHY_IQRES_CAL_PWR_I 0x9c10 /* I (Inphase) power value */ | 2333 | #define AR5K_PHY_IQRES_CAL_PWR_I 0x9c10 /* I (Inphase) power value */ |
1942 | #define AR5K_PHY_IQRES_CAL_PWR_Q 0x9c14 /* Q (Quadrature) power value */ | 2334 | #define AR5K_PHY_IQRES_CAL_PWR_Q 0x9c14 /* Q (Quadrature) power value */ |
1943 | #define AR5K_PHY_IQRES_CAL_CORR 0x9c18 /* I/Q Correlation */ | 2335 | #define AR5K_PHY_IQRES_CAL_CORR 0x9c18 /* I/Q Correlation */ |
1944 | 2336 | ||
1945 | /* | 2337 | /* |
1946 | * PHY current RSSI register [5111+] | 2338 | * PHY current RSSI register [5111+] |
1947 | */ | 2339 | */ |
1948 | #define AR5K_PHY_CURRENT_RSSI 0x9c1c | 2340 | #define AR5K_PHY_CURRENT_RSSI 0x9c1c |
2341 | |||
2342 | /* | ||
2343 | * PHY RF Bus grant register (?) | ||
2344 | */ | ||
2345 | #define AR5K_PHY_RFBUS_GRANT 0x9c20 | ||
2346 | |||
2347 | /* | ||
2348 | * PHY ADC test register | ||
2349 | */ | ||
2350 | #define AR5K_PHY_ADC_TEST 0x9c24 | ||
2351 | #define AR5K_PHY_ADC_TEST_I 0x00000001 | ||
2352 | #define AR5K_PHY_ADC_TEST_Q 0x00000200 | ||
2353 | |||
2354 | /* | ||
2355 | * PHY DAC test register | ||
2356 | */ | ||
2357 | #define AR5K_PHY_DAC_TEST 0x9c28 | ||
2358 | #define AR5K_PHY_DAC_TEST_I 0x00000001 | ||
2359 | #define AR5K_PHY_DAC_TEST_Q 0x00000200 | ||
2360 | |||
2361 | /* | ||
2362 | * PHY PTAT register (?) | ||
2363 | */ | ||
2364 | #define AR5K_PHY_PTAT 0x9c2c | ||
2365 | |||
2366 | /* | ||
2367 | * PHY Illegal TX rate register [5112+] | ||
2368 | */ | ||
2369 | #define AR5K_PHY_BAD_TX_RATE 0x9c30 | ||
2370 | |||
2371 | /* | ||
2372 | * PHY SPUR Power register [5112+] | ||
2373 | */ | ||
2374 | #define AR5K_PHY_SPUR_PWR 0x9c34 /* Register Address */ | ||
2375 | #define AR5K_PHY_SPUR_PWR_I 0x00000001 /* SPUR Power estimate for I (field) */ | ||
2376 | #define AR5K_PHY_SPUR_PWR_Q 0x00000100 /* SPUR Power estimate for Q (field) */ | ||
2377 | #define AR5K_PHY_SPUR_PWR_FILT 0x00010000 /* Power with SPUR removed (field) */ | ||
2378 | |||
2379 | /* | ||
2380 | * PHY Channel status register [5112+] (?) | ||
2381 | */ | ||
2382 | #define AR5K_PHY_CHAN_STATUS 0x9c38 | ||
2383 | #define AR5K_PHY_CHAN_STATUS_BT_ACT 0x00000001 | ||
2384 | #define AR5K_PHY_CHAN_STATUS_RX_CLR_RAW 0x00000002 | ||
2385 | #define AR5K_PHY_CHAN_STATUS_RX_CLR_MAC 0x00000004 | ||
2386 | #define AR5K_PHY_CHAN_STATUS_RX_CLR_PAP 0x00000008 | ||
2387 | |||
2388 | /* | ||
2389 | * PHY PAPD I (power?) table (?) | ||
2390 | * (92! entries) | ||
2391 | */ | ||
2392 | #define AR5K_PHY_PAPD_I_BASE 0xa000 | ||
2393 | #define AR5K_PHY_PAPD_I(_n) (AR5K_PHY_PAPD_I_BASE + ((_n) << 2)) | ||
1949 | 2394 | ||
1950 | /* | 2395 | /* |
1951 | * PHY PCDAC TX power table | 2396 | * PHY PCDAC TX power table |
1952 | */ | 2397 | */ |
1953 | #define AR5K_PHY_PCDAC_TXPOWER_BASE_5211 0xa180 | 2398 | #define AR5K_PHY_PCDAC_TXPOWER_BASE_5211 0xa180 |
1954 | #define AR5K_PHY_PCDAC_TXPOWER_BASE_5413 0xa280 | 2399 | #define AR5K_PHY_PCDAC_TXPOWER_BASE_2413 0xa280 |
1955 | #define AR5K_PHY_PCDAC_TXPOWER_BASE (ah->ah_radio >= AR5K_RF5413 ? \ | 2400 | #define AR5K_PHY_PCDAC_TXPOWER_BASE (ah->ah_radio >= AR5K_RF2413 ? \ |
1956 | AR5K_PHY_PCDAC_TXPOWER_BASE_5413 :\ | 2401 | AR5K_PHY_PCDAC_TXPOWER_BASE_2413 :\ |
1957 | AR5K_PHY_PCDAC_TXPOWER_BASE_5211) | 2402 | AR5K_PHY_PCDAC_TXPOWER_BASE_5211) |
1958 | #define AR5K_PHY_PCDAC_TXPOWER(_n) (AR5K_PHY_PCDAC_TXPOWER_BASE + ((_n) << 2)) | 2403 | #define AR5K_PHY_PCDAC_TXPOWER(_n) (AR5K_PHY_PCDAC_TXPOWER_BASE + ((_n) << 2)) |
1959 | 2404 | ||
1960 | /* | 2405 | /* |
1961 | * PHY mode register [5111+] | 2406 | * PHY mode register [5111+] |
1962 | */ | 2407 | */ |
1963 | #define AR5K_PHY_MODE 0x0a200 /* Register address */ | 2408 | #define AR5K_PHY_MODE 0x0a200 /* Register Address */ |
1964 | #define AR5K_PHY_MODE_MOD 0x00000001 /* PHY Modulation mask*/ | 2409 | #define AR5K_PHY_MODE_MOD 0x00000001 /* PHY Modulation bit */ |
1965 | #define AR5K_PHY_MODE_MOD_OFDM 0 | 2410 | #define AR5K_PHY_MODE_MOD_OFDM 0 |
1966 | #define AR5K_PHY_MODE_MOD_CCK 1 | 2411 | #define AR5K_PHY_MODE_MOD_CCK 1 |
1967 | #define AR5K_PHY_MODE_FREQ 0x00000002 /* Freq mode mask */ | 2412 | #define AR5K_PHY_MODE_FREQ 0x00000002 /* Freq mode bit */ |
1968 | #define AR5K_PHY_MODE_FREQ_5GHZ 0 | 2413 | #define AR5K_PHY_MODE_FREQ_5GHZ 0 |
1969 | #define AR5K_PHY_MODE_FREQ_2GHZ 2 | 2414 | #define AR5K_PHY_MODE_FREQ_2GHZ 2 |
1970 | #define AR5K_PHY_MODE_MOD_DYN 0x00000004 /* Dynamic OFDM/CCK mode mask [5112+] */ | 2415 | #define AR5K_PHY_MODE_MOD_DYN 0x00000004 /* Enable Dynamic OFDM/CCK mode [5112+] */ |
1971 | #define AR5K_PHY_MODE_RAD 0x00000008 /* [5212+] */ | 2416 | #define AR5K_PHY_MODE_RAD 0x00000008 /* [5212+] */ |
1972 | #define AR5K_PHY_MODE_RAD_RF5111 0 | 2417 | #define AR5K_PHY_MODE_RAD_RF5111 0 |
1973 | #define AR5K_PHY_MODE_RAD_RF5112 8 | 2418 | #define AR5K_PHY_MODE_RAD_RF5112 8 |
1974 | #define AR5K_PHY_MODE_XR 0x00000010 /* [5112+] */ | 2419 | #define AR5K_PHY_MODE_XR 0x00000010 /* Enable XR mode [5112+] */ |
2420 | #define AR5K_PHY_MODE_HALF_RATE 0x00000020 /* Enable Half rate (test) */ | ||
2421 | #define AR5K_PHY_MODE_QUARTER_RATE 0x00000040 /* Enable Quarter rat (test) */ | ||
1975 | 2422 | ||
1976 | /* | 2423 | /* |
1977 | * PHY CCK transmit control register [5111+ (?)] | 2424 | * PHY CCK transmit control register [5111+ (?)] |
@@ -1979,6 +2426,15 @@ after DFS is enabled */ | |||
1979 | #define AR5K_PHY_CCKTXCTL 0xa204 | 2426 | #define AR5K_PHY_CCKTXCTL 0xa204 |
1980 | #define AR5K_PHY_CCKTXCTL_WORLD 0x00000000 | 2427 | #define AR5K_PHY_CCKTXCTL_WORLD 0x00000000 |
1981 | #define AR5K_PHY_CCKTXCTL_JAPAN 0x00000010 | 2428 | #define AR5K_PHY_CCKTXCTL_JAPAN 0x00000010 |
2429 | #define AR5K_PHY_CCKTXCTL_SCRAMBLER_DIS 0x00000001 | ||
2430 | #define AR5K_PHY_CCKTXCTK_DAC_SCALE 0x00000004 | ||
2431 | |||
2432 | /* | ||
2433 | * PHY CCK Cross-correlator Barker RSSI threshold register [5212+] | ||
2434 | */ | ||
2435 | #define AR5K_PHY_CCK_CROSSCORR 0xa208 | ||
2436 | #define AR5K_PHY_CCK_CROSSCORR_WEAK_SIG_THR 0x0000000f | ||
2437 | #define AR5K_PHY_CCK_CROSSCORR_WEAK_SIG_THR_S 0 | ||
1982 | 2438 | ||
1983 | /* | 2439 | /* |
1984 | * PHY 2GHz gain register [5111+] | 2440 | * PHY 2GHz gain register [5111+] |
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index 846a7d051851..36e8d2f6e7b4 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c | |||
@@ -305,9 +305,10 @@ static inline void ipw_write_reg32(struct ipw_priv *a, u32 b, u32 c) | |||
305 | #define _ipw_write8(ipw, ofs, val) writeb((val), (ipw)->hw_base + (ofs)) | 305 | #define _ipw_write8(ipw, ofs, val) writeb((val), (ipw)->hw_base + (ofs)) |
306 | 306 | ||
307 | /* 8-bit direct write (for low 4K of SRAM/regs), with debug wrapper */ | 307 | /* 8-bit direct write (for low 4K of SRAM/regs), with debug wrapper */ |
308 | #define ipw_write8(ipw, ofs, val) \ | 308 | #define ipw_write8(ipw, ofs, val) do { \ |
309 | IPW_DEBUG_IO("%s %d: write_direct8(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \ | 309 | IPW_DEBUG_IO("%s %d: write_direct8(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \ |
310 | _ipw_write8(ipw, ofs, val) | 310 | _ipw_write8(ipw, ofs, val); \ |
311 | } while (0) | ||
311 | 312 | ||
312 | /* 16-bit direct write (low 4K) */ | 313 | /* 16-bit direct write (low 4K) */ |
313 | #define _ipw_write16(ipw, ofs, val) writew((val), (ipw)->hw_base + (ofs)) | 314 | #define _ipw_write16(ipw, ofs, val) writew((val), (ipw)->hw_base + (ofs)) |
diff --git a/drivers/net/wireless/iwlwifi/Kconfig b/drivers/net/wireless/iwlwifi/Kconfig index 82b66a3d3a5d..b0ac0ce3fb9f 100644 --- a/drivers/net/wireless/iwlwifi/Kconfig +++ b/drivers/net/wireless/iwlwifi/Kconfig | |||
@@ -14,18 +14,49 @@ config IWLWIFI_LEDS | |||
14 | default n | 14 | default n |
15 | 15 | ||
16 | config IWLWIFI_RFKILL | 16 | config IWLWIFI_RFKILL |
17 | boolean "IWLWIFI RF kill support" | 17 | boolean "Iwlwifi RF kill support" |
18 | depends on IWLCORE | 18 | depends on IWLCORE |
19 | 19 | ||
20 | config IWL4965 | 20 | config IWLWIFI_DEBUG |
21 | tristate "Intel Wireless WiFi 4965AGN" | 21 | bool "Enable full debugging output in iwlagn driver" |
22 | depends on IWLCORE | ||
23 | ---help--- | ||
24 | This option will enable debug tracing output for the iwlwifi drivers | ||
25 | |||
26 | This will result in the kernel module being ~100k larger. You can | ||
27 | control which debug output is sent to the kernel log by setting the | ||
28 | value in | ||
29 | |||
30 | /sys/class/net/wlan0/device/debug_level | ||
31 | |||
32 | This entry will only exist if this option is enabled. | ||
33 | |||
34 | To set a value, simply echo an 8-byte hex value to the same file: | ||
35 | |||
36 | % echo 0x43fff > /sys/class/net/wlan0/device/debug_level | ||
37 | |||
38 | You can find the list of debug mask values in: | ||
39 | drivers/net/wireless/iwlwifi/iwl-debug.h | ||
40 | |||
41 | If this is your first time using this driver, you should say Y here | ||
42 | as the debug information can assist others in helping you resolve | ||
43 | any problems you may encounter. | ||
44 | |||
45 | config IWLWIFI_DEBUGFS | ||
46 | bool "Iwlwifi debugfs support" | ||
47 | depends on IWLCORE && IWLWIFI_DEBUG && MAC80211_DEBUGFS | ||
48 | ---help--- | ||
49 | Enable creation of debugfs files for the iwlwifi drivers. | ||
50 | |||
51 | config IWLAGN | ||
52 | tristate "Intel Wireless WiFi Next Gen AGN" | ||
22 | depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL | 53 | depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL |
23 | select FW_LOADER | 54 | select FW_LOADER |
24 | select IWLCORE | 55 | select IWLCORE |
25 | ---help--- | 56 | ---help--- |
26 | Select to build the driver supporting the: | 57 | Select to build the driver supporting the: |
27 | 58 | ||
28 | Intel Wireless WiFi Link 4965AGN | 59 | Intel Wireless WiFi Link Next-Gen AGN |
29 | 60 | ||
30 | This driver uses the kernel's mac80211 subsystem. | 61 | This driver uses the kernel's mac80211 subsystem. |
31 | 62 | ||
@@ -42,60 +73,33 @@ config IWL4965 | |||
42 | If you want to compile the driver as a module ( = code which can be | 73 | If you want to compile the driver as a module ( = code which can be |
43 | inserted in and removed from the running kernel whenever you want), | 74 | inserted in and removed from the running kernel whenever you want), |
44 | say M here and read <file:Documentation/kbuild/modules.txt>. The | 75 | say M here and read <file:Documentation/kbuild/modules.txt>. The |
45 | module will be called iwl4965.ko. | 76 | module will be called iwlagn.ko. |
46 | |||
47 | config IWL4965_LEDS | ||
48 | bool "Enable LEDS features in iwl4965 driver" | ||
49 | depends on IWL4965 | ||
50 | select IWLWIFI_LEDS | ||
51 | ---help--- | ||
52 | This option enables LEDS for the iwlwifi drivers | ||
53 | 77 | ||
54 | 78 | config IWLAGN_SPECTRUM_MEASUREMENT | |
55 | config IWL4965_SPECTRUM_MEASUREMENT | 79 | bool "Enable Spectrum Measurement in iwlagn driver" |
56 | bool "Enable Spectrum Measurement in iwl4965 driver" | 80 | depends on IWLAGN |
57 | depends on IWL4965 | ||
58 | ---help--- | 81 | ---help--- |
59 | This option will enable spectrum measurement for the iwl4965 driver. | 82 | This option will enable spectrum measurement for the iwlagn driver. |
60 | 83 | ||
61 | config IWLWIFI_DEBUG | 84 | config IWLAGN_LEDS |
62 | bool "Enable full debugging output in iwl4965 driver" | 85 | bool "Enable LEDS features in iwlagn driver" |
63 | depends on IWL4965 | 86 | depends on IWLAGN |
87 | select IWLWIFI_LEDS | ||
64 | ---help--- | 88 | ---help--- |
65 | This option will enable debug tracing output for the iwl4965 | 89 | This option enables LEDS for the iwlagn drivers |
66 | driver. | ||
67 | |||
68 | This will result in the kernel module being ~100k larger. You can | ||
69 | control which debug output is sent to the kernel log by setting the | ||
70 | value in | ||
71 | |||
72 | /sys/class/net/wlan0/device/debug_level | ||
73 | |||
74 | This entry will only exist if this option is enabled. | ||
75 | |||
76 | To set a value, simply echo an 8-byte hex value to the same file: | ||
77 | |||
78 | % echo 0x43fff > /sys/class/net/wlan0/device/debug_level | ||
79 | 90 | ||
80 | You can find the list of debug mask values in: | ||
81 | drivers/net/wireless/iwlwifi/iwl-4965-debug.h | ||
82 | 91 | ||
83 | If this is your first time using this driver, you should say Y here | 92 | config IWL4965 |
84 | as the debug information can assist others in helping you resolve | 93 | bool "Intel Wireless WiFi 4965AGN" |
85 | any problems you may encounter. | 94 | depends on IWLAGN |
95 | ---help--- | ||
96 | This option enables support for Intel Wireless WiFi Link 4965AGN | ||
86 | 97 | ||
87 | config IWL5000 | 98 | config IWL5000 |
88 | bool "Intel Wireless WiFi 5000AGN" | 99 | bool "Intel Wireless WiFi 5000AGN" |
89 | depends on IWL4965 | 100 | depends on IWLAGN |
90 | ---help--- | 101 | ---help--- |
91 | This option enables support for Intel Wireless WiFi Link 5000AGN Family | 102 | This option enables support for Intel Wireless WiFi Link 5000AGN Family |
92 | Dependency on 4965 is temporary | ||
93 | |||
94 | config IWLWIFI_DEBUGFS | ||
95 | bool "Iwlwifi debugfs support" | ||
96 | depends on IWLCORE && IWLWIFI_DEBUG && MAC80211_DEBUGFS | ||
97 | ---help--- | ||
98 | Enable creation of debugfs files for the iwlwifi drivers. | ||
99 | 103 | ||
100 | config IWL3945 | 104 | config IWL3945 |
101 | tristate "Intel PRO/Wireless 3945ABG/BG Network Connection" | 105 | tristate "Intel PRO/Wireless 3945ABG/BG Network Connection" |
diff --git a/drivers/net/wireless/iwlwifi/Makefile b/drivers/net/wireless/iwlwifi/Makefile index 1f52b92f08b5..47aa28f6a513 100644 --- a/drivers/net/wireless/iwlwifi/Makefile +++ b/drivers/net/wireless/iwlwifi/Makefile | |||
@@ -6,15 +6,14 @@ iwlcore-$(CONFIG_IWLWIFI_DEBUGFS) += iwl-debugfs.o | |||
6 | iwlcore-$(CONFIG_IWLWIFI_LEDS) += iwl-led.o | 6 | iwlcore-$(CONFIG_IWLWIFI_LEDS) += iwl-led.o |
7 | iwlcore-$(CONFIG_IWLWIFI_RFKILL) += iwl-rfkill.o | 7 | iwlcore-$(CONFIG_IWLWIFI_RFKILL) += iwl-rfkill.o |
8 | 8 | ||
9 | obj-$(CONFIG_IWLAGN) += iwlagn.o | ||
10 | iwlagn-objs := iwl-agn.o iwl-agn-rs.o | ||
11 | |||
12 | iwlagn-$(CONFIG_IWL4965) += iwl-4965.o | ||
13 | iwlagn-$(CONFIG_IWL5000) += iwl-5000.o | ||
14 | |||
9 | obj-$(CONFIG_IWL3945) += iwl3945.o | 15 | obj-$(CONFIG_IWL3945) += iwl3945.o |
10 | iwl3945-objs := iwl3945-base.o iwl-3945.o iwl-3945-rs.o | 16 | iwl3945-objs := iwl3945-base.o iwl-3945.o iwl-3945-rs.o |
11 | iwl3945-$(CONFIG_IWL3945_LEDS) += iwl-3945-led.o | 17 | iwl3945-$(CONFIG_IWL3945_LEDS) += iwl-3945-led.o |
12 | 18 | ||
13 | obj-$(CONFIG_IWL4965) += iwl4965.o | ||
14 | iwl4965-objs := iwl4965-base.o iwl-4965.o iwl-4965-rs.o | ||
15 | |||
16 | ifeq ($(CONFIG_IWL5000),y) | ||
17 | iwl4965-objs += iwl-5000.o | ||
18 | endif | ||
19 | |||
20 | 19 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-led.c b/drivers/net/wireless/iwlwifi/iwl-3945-led.c index 6be1fe13fa57..d3336966b6b5 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-led.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945-led.c | |||
@@ -206,12 +206,12 @@ static void iwl3945_led_brightness_set(struct led_classdev *led_cdev, | |||
206 | static int iwl3945_led_register_led(struct iwl3945_priv *priv, | 206 | static int iwl3945_led_register_led(struct iwl3945_priv *priv, |
207 | struct iwl3945_led *led, | 207 | struct iwl3945_led *led, |
208 | enum led_type type, u8 set_led, | 208 | enum led_type type, u8 set_led, |
209 | const char *name, char *trigger) | 209 | char *trigger) |
210 | { | 210 | { |
211 | struct device *device = wiphy_dev(priv->hw->wiphy); | 211 | struct device *device = wiphy_dev(priv->hw->wiphy); |
212 | int ret; | 212 | int ret; |
213 | 213 | ||
214 | led->led_dev.name = name; | 214 | led->led_dev.name = led->name; |
215 | led->led_dev.brightness_set = iwl3945_led_brightness_set; | 215 | led->led_dev.brightness_set = iwl3945_led_brightness_set; |
216 | led->led_dev.default_trigger = trigger; | 216 | led->led_dev.default_trigger = trigger; |
217 | 217 | ||
@@ -308,7 +308,6 @@ void iwl3945_led_background(struct iwl3945_priv *priv) | |||
308 | int iwl3945_led_register(struct iwl3945_priv *priv) | 308 | int iwl3945_led_register(struct iwl3945_priv *priv) |
309 | { | 309 | { |
310 | char *trigger; | 310 | char *trigger; |
311 | char name[32]; | ||
312 | int ret; | 311 | int ret; |
313 | 312 | ||
314 | priv->last_blink_rate = 0; | 313 | priv->last_blink_rate = 0; |
@@ -318,7 +317,8 @@ int iwl3945_led_register(struct iwl3945_priv *priv) | |||
318 | priv->allow_blinking = 0; | 317 | priv->allow_blinking = 0; |
319 | 318 | ||
320 | trigger = ieee80211_get_radio_led_name(priv->hw); | 319 | trigger = ieee80211_get_radio_led_name(priv->hw); |
321 | snprintf(name, sizeof(name), "iwl-%s:radio", | 320 | snprintf(priv->led[IWL_LED_TRG_RADIO].name, |
321 | sizeof(priv->led[IWL_LED_TRG_RADIO].name), "iwl-%s:radio", | ||
322 | wiphy_name(priv->hw->wiphy)); | 322 | wiphy_name(priv->hw->wiphy)); |
323 | 323 | ||
324 | priv->led[IWL_LED_TRG_RADIO].led_on = iwl3945_led_on; | 324 | priv->led[IWL_LED_TRG_RADIO].led_on = iwl3945_led_on; |
@@ -327,19 +327,20 @@ int iwl3945_led_register(struct iwl3945_priv *priv) | |||
327 | 327 | ||
328 | ret = iwl3945_led_register_led(priv, | 328 | ret = iwl3945_led_register_led(priv, |
329 | &priv->led[IWL_LED_TRG_RADIO], | 329 | &priv->led[IWL_LED_TRG_RADIO], |
330 | IWL_LED_TRG_RADIO, 1, | 330 | IWL_LED_TRG_RADIO, 1, trigger); |
331 | name, trigger); | 331 | |
332 | if (ret) | 332 | if (ret) |
333 | goto exit_fail; | 333 | goto exit_fail; |
334 | 334 | ||
335 | trigger = ieee80211_get_assoc_led_name(priv->hw); | 335 | trigger = ieee80211_get_assoc_led_name(priv->hw); |
336 | snprintf(name, sizeof(name), "iwl-%s:assoc", | 336 | snprintf(priv->led[IWL_LED_TRG_ASSOC].name, |
337 | sizeof(priv->led[IWL_LED_TRG_ASSOC].name), "iwl-%s:assoc", | ||
337 | wiphy_name(priv->hw->wiphy)); | 338 | wiphy_name(priv->hw->wiphy)); |
338 | 339 | ||
339 | ret = iwl3945_led_register_led(priv, | 340 | ret = iwl3945_led_register_led(priv, |
340 | &priv->led[IWL_LED_TRG_ASSOC], | 341 | &priv->led[IWL_LED_TRG_ASSOC], |
341 | IWL_LED_TRG_ASSOC, 0, | 342 | IWL_LED_TRG_ASSOC, 0, trigger); |
342 | name, trigger); | 343 | |
343 | /* for assoc always turn led on */ | 344 | /* for assoc always turn led on */ |
344 | priv->led[IWL_LED_TRG_ASSOC].led_on = iwl3945_led_on; | 345 | priv->led[IWL_LED_TRG_ASSOC].led_on = iwl3945_led_on; |
345 | priv->led[IWL_LED_TRG_ASSOC].led_off = iwl3945_led_on; | 346 | priv->led[IWL_LED_TRG_ASSOC].led_off = iwl3945_led_on; |
@@ -349,14 +350,13 @@ int iwl3945_led_register(struct iwl3945_priv *priv) | |||
349 | goto exit_fail; | 350 | goto exit_fail; |
350 | 351 | ||
351 | trigger = ieee80211_get_rx_led_name(priv->hw); | 352 | trigger = ieee80211_get_rx_led_name(priv->hw); |
352 | snprintf(name, sizeof(name), "iwl-%s:RX", | 353 | snprintf(priv->led[IWL_LED_TRG_RX].name, |
354 | sizeof(priv->led[IWL_LED_TRG_RX].name), "iwl-%s:RX", | ||
353 | wiphy_name(priv->hw->wiphy)); | 355 | wiphy_name(priv->hw->wiphy)); |
354 | 356 | ||
355 | |||
356 | ret = iwl3945_led_register_led(priv, | 357 | ret = iwl3945_led_register_led(priv, |
357 | &priv->led[IWL_LED_TRG_RX], | 358 | &priv->led[IWL_LED_TRG_RX], |
358 | IWL_LED_TRG_RX, 0, | 359 | IWL_LED_TRG_RX, 0, trigger); |
359 | name, trigger); | ||
360 | 360 | ||
361 | priv->led[IWL_LED_TRG_RX].led_on = iwl3945_led_associated; | 361 | priv->led[IWL_LED_TRG_RX].led_on = iwl3945_led_associated; |
362 | priv->led[IWL_LED_TRG_RX].led_off = iwl3945_led_associated; | 362 | priv->led[IWL_LED_TRG_RX].led_off = iwl3945_led_associated; |
@@ -366,13 +366,14 @@ int iwl3945_led_register(struct iwl3945_priv *priv) | |||
366 | goto exit_fail; | 366 | goto exit_fail; |
367 | 367 | ||
368 | trigger = ieee80211_get_tx_led_name(priv->hw); | 368 | trigger = ieee80211_get_tx_led_name(priv->hw); |
369 | snprintf(name, sizeof(name), "iwl-%s:TX", | 369 | snprintf(priv->led[IWL_LED_TRG_TX].name, |
370 | sizeof(priv->led[IWL_LED_TRG_TX].name), "iwl-%s:TX", | ||
370 | wiphy_name(priv->hw->wiphy)); | 371 | wiphy_name(priv->hw->wiphy)); |
371 | 372 | ||
372 | ret = iwl3945_led_register_led(priv, | 373 | ret = iwl3945_led_register_led(priv, |
373 | &priv->led[IWL_LED_TRG_TX], | 374 | &priv->led[IWL_LED_TRG_TX], |
374 | IWL_LED_TRG_TX, 0, | 375 | IWL_LED_TRG_TX, 0, trigger); |
375 | name, trigger); | 376 | |
376 | priv->led[IWL_LED_TRG_TX].led_on = iwl3945_led_associated; | 377 | priv->led[IWL_LED_TRG_TX].led_on = iwl3945_led_associated; |
377 | priv->led[IWL_LED_TRG_TX].led_off = iwl3945_led_associated; | 378 | priv->led[IWL_LED_TRG_TX].led_off = iwl3945_led_associated; |
378 | priv->led[IWL_LED_TRG_TX].led_pattern = iwl3945_led_pattern; | 379 | priv->led[IWL_LED_TRG_TX].led_pattern = iwl3945_led_pattern; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-led.h b/drivers/net/wireless/iwlwifi/iwl-3945-led.h index 47b7e0bac802..2fbd126c1347 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-led.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-led.h | |||
@@ -50,6 +50,7 @@ enum led_type { | |||
50 | struct iwl3945_led { | 50 | struct iwl3945_led { |
51 | struct iwl3945_priv *priv; | 51 | struct iwl3945_priv *priv; |
52 | struct led_classdev led_dev; | 52 | struct led_classdev led_dev; |
53 | char name[32]; | ||
53 | 54 | ||
54 | int (*led_on) (struct iwl3945_priv *priv, int led_id); | 55 | int (*led_on) (struct iwl3945_priv *priv, int led_id); |
55 | int (*led_off) (struct iwl3945_priv *priv, int led_id); | 56 | int (*led_off) (struct iwl3945_priv *priv, int led_id); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index a51e0eaa1334..b3931f6135a4 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -710,10 +710,7 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv, | |||
710 | return; | 710 | return; |
711 | } | 711 | } |
712 | 712 | ||
713 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) { | 713 | |
714 | iwl3945_pass_packet_to_mac80211(priv, rxb, &rx_status); | ||
715 | return; | ||
716 | } | ||
717 | 714 | ||
718 | /* Convert 3945's rssi indicator to dBm */ | 715 | /* Convert 3945's rssi indicator to dBm */ |
719 | rx_status.signal = rx_stats->rssi - IWL_RSSI_OFFSET; | 716 | rx_status.signal = rx_stats->rssi - IWL_RSSI_OFFSET; |
@@ -775,6 +772,11 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv, | |||
775 | priv->last_rx_noise = rx_status.noise; | 772 | priv->last_rx_noise = rx_status.noise; |
776 | } | 773 | } |
777 | 774 | ||
775 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) { | ||
776 | iwl3945_pass_packet_to_mac80211(priv, rxb, &rx_status); | ||
777 | return; | ||
778 | } | ||
779 | |||
778 | switch (le16_to_cpu(header->frame_control) & IEEE80211_FCTL_FTYPE) { | 780 | switch (le16_to_cpu(header->frame_control) & IEEE80211_FCTL_FTYPE) { |
779 | case IEEE80211_FTYPE_MGMT: | 781 | case IEEE80211_FTYPE_MGMT: |
780 | switch (le16_to_cpu(header->frame_control) & | 782 | switch (le16_to_cpu(header->frame_control) & |
@@ -793,8 +795,7 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv, | |||
793 | struct ieee80211_mgmt *mgmt = | 795 | struct ieee80211_mgmt *mgmt = |
794 | (struct ieee80211_mgmt *)header; | 796 | (struct ieee80211_mgmt *)header; |
795 | __le32 *pos; | 797 | __le32 *pos; |
796 | pos = | 798 | pos = (__le32 *)&mgmt->u.beacon. |
797 | (__le32 *) & mgmt->u.beacon. | ||
798 | timestamp; | 799 | timestamp; |
799 | priv->timestamp0 = le32_to_cpu(pos[0]); | 800 | priv->timestamp0 = le32_to_cpu(pos[0]); |
800 | priv->timestamp1 = le32_to_cpu(pos[1]); | 801 | priv->timestamp1 = le32_to_cpu(pos[1]); |
@@ -1507,7 +1508,7 @@ static int iwl3945_hw_reg_adjust_power_by_temp(int new_reading, int old_reading) | |||
1507 | */ | 1508 | */ |
1508 | static inline int iwl3945_hw_reg_temp_out_of_range(int temperature) | 1509 | static inline int iwl3945_hw_reg_temp_out_of_range(int temperature) |
1509 | { | 1510 | { |
1510 | return (((temperature < -260) || (temperature > 25)) ? 1 : 0); | 1511 | return ((temperature < -260) || (temperature > 25)) ? 1 : 0; |
1511 | } | 1512 | } |
1512 | 1513 | ||
1513 | int iwl3945_hw_get_temperature(struct iwl3945_priv *priv) | 1514 | int iwl3945_hw_get_temperature(struct iwl3945_priv *priv) |
@@ -2628,7 +2629,7 @@ unsigned int iwl3945_hw_get_beacon_cmd(struct iwl3945_priv *priv, | |||
2628 | tx_beacon_cmd->tx.supp_rates[1] = | 2629 | tx_beacon_cmd->tx.supp_rates[1] = |
2629 | (IWL_CCK_BASIC_RATES_MASK & 0xF); | 2630 | (IWL_CCK_BASIC_RATES_MASK & 0xF); |
2630 | 2631 | ||
2631 | return (sizeof(struct iwl3945_tx_beacon_cmd) + frame_size); | 2632 | return sizeof(struct iwl3945_tx_beacon_cmd) + frame_size; |
2632 | } | 2633 | } |
2633 | 2634 | ||
2634 | void iwl3945_hw_rx_handler_setup(struct iwl3945_priv *priv) | 2635 | void iwl3945_hw_rx_handler_setup(struct iwl3945_priv *priv) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index ba2df1ba32d2..22bb26985c2e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
@@ -341,39 +341,6 @@ err: | |||
341 | return -EINVAL; | 341 | return -EINVAL; |
342 | 342 | ||
343 | } | 343 | } |
344 | int iwl4965_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src) | ||
345 | { | ||
346 | int ret; | ||
347 | unsigned long flags; | ||
348 | |||
349 | spin_lock_irqsave(&priv->lock, flags); | ||
350 | ret = iwl_grab_nic_access(priv); | ||
351 | if (ret) { | ||
352 | spin_unlock_irqrestore(&priv->lock, flags); | ||
353 | return ret; | ||
354 | } | ||
355 | |||
356 | if (src == IWL_PWR_SRC_VAUX) { | ||
357 | u32 val; | ||
358 | ret = pci_read_config_dword(priv->pci_dev, PCI_POWER_SOURCE, | ||
359 | &val); | ||
360 | |||
361 | if (val & PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT) { | ||
362 | iwl_set_bits_mask_prph(priv, APMG_PS_CTRL_REG, | ||
363 | APMG_PS_CTRL_VAL_PWR_SRC_VAUX, | ||
364 | ~APMG_PS_CTRL_MSK_PWR_SRC); | ||
365 | } | ||
366 | } else { | ||
367 | iwl_set_bits_mask_prph(priv, APMG_PS_CTRL_REG, | ||
368 | APMG_PS_CTRL_VAL_PWR_SRC_VMAIN, | ||
369 | ~APMG_PS_CTRL_MSK_PWR_SRC); | ||
370 | } | ||
371 | |||
372 | iwl_release_nic_access(priv); | ||
373 | spin_unlock_irqrestore(&priv->lock, flags); | ||
374 | |||
375 | return ret; | ||
376 | } | ||
377 | 344 | ||
378 | /* | 345 | /* |
379 | * Activate/Deactivat Tx DMA/FIFO channels according tx fifos mask | 346 | * Activate/Deactivat Tx DMA/FIFO channels according tx fifos mask |
@@ -875,18 +842,6 @@ static int iwl4965_hw_set_hw_params(struct iwl_priv *priv) | |||
875 | return 0; | 842 | return 0; |
876 | } | 843 | } |
877 | 844 | ||
878 | /* set card power command */ | ||
879 | static int iwl4965_set_power(struct iwl_priv *priv, | ||
880 | void *cmd) | ||
881 | { | ||
882 | int ret = 0; | ||
883 | |||
884 | ret = iwl_send_cmd_pdu_async(priv, POWER_TABLE_CMD, | ||
885 | sizeof(struct iwl4965_powertable_cmd), | ||
886 | cmd, NULL); | ||
887 | return ret; | ||
888 | } | ||
889 | |||
890 | static s32 iwl4965_math_div_round(s32 num, s32 denom, s32 *res) | 845 | static s32 iwl4965_math_div_round(s32 num, s32 denom, s32 *res) |
891 | { | 846 | { |
892 | s32 sign = 1; | 847 | s32 sign = 1; |
@@ -1560,11 +1515,11 @@ static int iwl4965_fill_txpower_tbl(struct iwl_priv *priv, u8 band, u16 channel, | |||
1560 | c, atten_value, power_index, | 1515 | c, atten_value, power_index, |
1561 | tx_power.s.radio_tx_gain[c], | 1516 | tx_power.s.radio_tx_gain[c], |
1562 | tx_power.s.dsp_predis_atten[c]); | 1517 | tx_power.s.dsp_predis_atten[c]); |
1563 | }/* for each chain */ | 1518 | } /* for each chain */ |
1564 | 1519 | ||
1565 | tx_power_tbl->power_tbl[i].dw = cpu_to_le32(tx_power.dw); | 1520 | tx_power_tbl->power_tbl[i].dw = cpu_to_le32(tx_power.dw); |
1566 | 1521 | ||
1567 | }/* for each rate */ | 1522 | } /* for each rate */ |
1568 | 1523 | ||
1569 | return 0; | 1524 | return 0; |
1570 | } | 1525 | } |
@@ -1701,38 +1656,6 @@ static int iwl4965_shared_mem_rx_idx(struct iwl_priv *priv) | |||
1701 | return le32_to_cpu(s->rb_closed) & 0xFFF; | 1656 | return le32_to_cpu(s->rb_closed) & 0xFFF; |
1702 | } | 1657 | } |
1703 | 1658 | ||
1704 | unsigned int iwl4965_hw_get_beacon_cmd(struct iwl_priv *priv, | ||
1705 | struct iwl_frame *frame, u8 rate) | ||
1706 | { | ||
1707 | struct iwl4965_tx_beacon_cmd *tx_beacon_cmd; | ||
1708 | unsigned int frame_size; | ||
1709 | |||
1710 | tx_beacon_cmd = &frame->u.beacon; | ||
1711 | memset(tx_beacon_cmd, 0, sizeof(*tx_beacon_cmd)); | ||
1712 | |||
1713 | tx_beacon_cmd->tx.sta_id = priv->hw_params.bcast_sta_id; | ||
1714 | tx_beacon_cmd->tx.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; | ||
1715 | |||
1716 | frame_size = iwl4965_fill_beacon_frame(priv, | ||
1717 | tx_beacon_cmd->frame, | ||
1718 | iwl_bcast_addr, | ||
1719 | sizeof(frame->u) - sizeof(*tx_beacon_cmd)); | ||
1720 | |||
1721 | BUG_ON(frame_size > MAX_MPDU_SIZE); | ||
1722 | tx_beacon_cmd->tx.len = cpu_to_le16((u16)frame_size); | ||
1723 | |||
1724 | if ((rate == IWL_RATE_1M_PLCP) || (rate >= IWL_RATE_2M_PLCP)) | ||
1725 | tx_beacon_cmd->tx.rate_n_flags = | ||
1726 | iwl_hw_set_rate_n_flags(rate, RATE_MCS_CCK_MSK); | ||
1727 | else | ||
1728 | tx_beacon_cmd->tx.rate_n_flags = | ||
1729 | iwl_hw_set_rate_n_flags(rate, 0); | ||
1730 | |||
1731 | tx_beacon_cmd->tx.tx_flags = (TX_CMD_FLG_SEQ_CTL_MSK | | ||
1732 | TX_CMD_FLG_TSF_MSK | TX_CMD_FLG_STA_RATE_MSK); | ||
1733 | return (sizeof(*tx_beacon_cmd) + frame_size); | ||
1734 | } | ||
1735 | |||
1736 | static int iwl4965_alloc_shared_mem(struct iwl_priv *priv) | 1659 | static int iwl4965_alloc_shared_mem(struct iwl_priv *priv) |
1737 | { | 1660 | { |
1738 | priv->shared_virt = pci_alloc_consistent(priv->pci_dev, | 1661 | priv->shared_virt = pci_alloc_consistent(priv->pci_dev, |
@@ -2079,39 +2002,6 @@ static int iwl4965_txq_agg_enable(struct iwl_priv *priv, int txq_id, | |||
2079 | return 0; | 2002 | return 0; |
2080 | } | 2003 | } |
2081 | 2004 | ||
2082 | int iwl4965_mac_ampdu_action(struct ieee80211_hw *hw, | ||
2083 | enum ieee80211_ampdu_mlme_action action, | ||
2084 | const u8 *addr, u16 tid, u16 *ssn) | ||
2085 | { | ||
2086 | struct iwl_priv *priv = hw->priv; | ||
2087 | DECLARE_MAC_BUF(mac); | ||
2088 | |||
2089 | IWL_DEBUG_HT("A-MPDU action on addr %s tid %d\n", | ||
2090 | print_mac(mac, addr), tid); | ||
2091 | |||
2092 | if (!(priv->cfg->sku & IWL_SKU_N)) | ||
2093 | return -EACCES; | ||
2094 | |||
2095 | switch (action) { | ||
2096 | case IEEE80211_AMPDU_RX_START: | ||
2097 | IWL_DEBUG_HT("start Rx\n"); | ||
2098 | return iwl_rx_agg_start(priv, addr, tid, *ssn); | ||
2099 | case IEEE80211_AMPDU_RX_STOP: | ||
2100 | IWL_DEBUG_HT("stop Rx\n"); | ||
2101 | return iwl_rx_agg_stop(priv, addr, tid); | ||
2102 | case IEEE80211_AMPDU_TX_START: | ||
2103 | IWL_DEBUG_HT("start Tx\n"); | ||
2104 | return iwl_tx_agg_start(priv, addr, tid, ssn); | ||
2105 | case IEEE80211_AMPDU_TX_STOP: | ||
2106 | IWL_DEBUG_HT("stop Tx\n"); | ||
2107 | return iwl_tx_agg_stop(priv, addr, tid); | ||
2108 | default: | ||
2109 | IWL_DEBUG_HT("unknown\n"); | ||
2110 | return -EINVAL; | ||
2111 | break; | ||
2112 | } | ||
2113 | return 0; | ||
2114 | } | ||
2115 | 2005 | ||
2116 | static u16 iwl4965_get_hcmd_size(u8 cmd_id, u16 len) | 2006 | static u16 iwl4965_get_hcmd_size(u8 cmd_id, u16 len) |
2117 | { | 2007 | { |
@@ -2240,9 +2130,9 @@ static int iwl4965_tx_status_reply_tx(struct iwl_priv *priv, | |||
2240 | bitmap = bitmap << sh; | 2130 | bitmap = bitmap << sh; |
2241 | sh = 0; | 2131 | sh = 0; |
2242 | } | 2132 | } |
2243 | bitmap |= (1 << sh); | 2133 | bitmap |= 1ULL << sh; |
2244 | IWL_DEBUG_TX_REPLY("start=%d bitmap=0x%x\n", | 2134 | IWL_DEBUG_TX_REPLY("start=%d bitmap=0x%llx\n", |
2245 | start, (u32)(bitmap & 0xFFFFFFFF)); | 2135 | start, (unsigned long long)bitmap); |
2246 | } | 2136 | } |
2247 | 2137 | ||
2248 | agg->bitmap = bitmap; | 2138 | agg->bitmap = bitmap; |
@@ -2368,6 +2258,40 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv, | |||
2368 | IWL_ERROR("TODO: Implement Tx ABORT REQUIRED!!!\n"); | 2258 | IWL_ERROR("TODO: Implement Tx ABORT REQUIRED!!!\n"); |
2369 | } | 2259 | } |
2370 | 2260 | ||
2261 | static int iwl4965_calc_rssi(struct iwl_priv *priv, | ||
2262 | struct iwl_rx_phy_res *rx_resp) | ||
2263 | { | ||
2264 | /* data from PHY/DSP regarding signal strength, etc., | ||
2265 | * contents are always there, not configurable by host. */ | ||
2266 | struct iwl4965_rx_non_cfg_phy *ncphy = | ||
2267 | (struct iwl4965_rx_non_cfg_phy *)rx_resp->non_cfg_phy_buf; | ||
2268 | u32 agc = (le16_to_cpu(ncphy->agc_info) & IWL49_AGC_DB_MASK) | ||
2269 | >> IWL49_AGC_DB_POS; | ||
2270 | |||
2271 | u32 valid_antennae = | ||
2272 | (le16_to_cpu(rx_resp->phy_flags) & IWL49_RX_PHY_FLAGS_ANTENNAE_MASK) | ||
2273 | >> IWL49_RX_PHY_FLAGS_ANTENNAE_OFFSET; | ||
2274 | u8 max_rssi = 0; | ||
2275 | u32 i; | ||
2276 | |||
2277 | /* Find max rssi among 3 possible receivers. | ||
2278 | * These values are measured by the digital signal processor (DSP). | ||
2279 | * They should stay fairly constant even as the signal strength varies, | ||
2280 | * if the radio's automatic gain control (AGC) is working right. | ||
2281 | * AGC value (see below) will provide the "interesting" info. */ | ||
2282 | for (i = 0; i < 3; i++) | ||
2283 | if (valid_antennae & (1 << i)) | ||
2284 | max_rssi = max(ncphy->rssi_info[i << 1], max_rssi); | ||
2285 | |||
2286 | IWL_DEBUG_STATS("Rssi In A %d B %d C %d Max %d AGC dB %d\n", | ||
2287 | ncphy->rssi_info[0], ncphy->rssi_info[2], ncphy->rssi_info[4], | ||
2288 | max_rssi, agc); | ||
2289 | |||
2290 | /* dBm = max_rssi dB - agc dB - constant. | ||
2291 | * Higher AGC (higher radio gain) means lower signal. */ | ||
2292 | return max_rssi - agc - IWL_RSSI_OFFSET; | ||
2293 | } | ||
2294 | |||
2371 | 2295 | ||
2372 | /* Set up 4965-specific Rx frame reply handlers */ | 2296 | /* Set up 4965-specific Rx frame reply handlers */ |
2373 | static void iwl4965_rx_handler_setup(struct iwl_priv *priv) | 2297 | static void iwl4965_rx_handler_setup(struct iwl_priv *priv) |
@@ -2399,6 +2323,7 @@ static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = { | |||
2399 | .chain_noise_reset = iwl4965_chain_noise_reset, | 2323 | .chain_noise_reset = iwl4965_chain_noise_reset, |
2400 | .gain_computation = iwl4965_gain_computation, | 2324 | .gain_computation = iwl4965_gain_computation, |
2401 | .rts_tx_cmd_flag = iwl4965_rts_tx_cmd_flag, | 2325 | .rts_tx_cmd_flag = iwl4965_rts_tx_cmd_flag, |
2326 | .calc_rssi = iwl4965_calc_rssi, | ||
2402 | }; | 2327 | }; |
2403 | 2328 | ||
2404 | static struct iwl_lib_ops iwl4965_lib = { | 2329 | static struct iwl_lib_ops iwl4965_lib = { |
@@ -2440,7 +2365,6 @@ static struct iwl_lib_ops iwl4965_lib = { | |||
2440 | .check_version = iwl4965_eeprom_check_version, | 2365 | .check_version = iwl4965_eeprom_check_version, |
2441 | .query_addr = iwlcore_eeprom_query_addr, | 2366 | .query_addr = iwlcore_eeprom_query_addr, |
2442 | }, | 2367 | }, |
2443 | .set_power = iwl4965_set_power, | ||
2444 | .send_tx_power = iwl4965_send_tx_power, | 2368 | .send_tx_power = iwl4965_send_tx_power, |
2445 | .update_chain_flags = iwl4965_update_chain_flags, | 2369 | .update_chain_flags = iwl4965_update_chain_flags, |
2446 | .temperature = iwl4965_temperature_calib, | 2370 | .temperature = iwl4965_temperature_calib, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index 878d6193b232..f3d139b663e6 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
@@ -93,6 +93,13 @@ static int iwl5000_apm_init(struct iwl_priv *priv) | |||
93 | iwl_set_bit(priv, CSR_GIO_CHICKEN_BITS, | 93 | iwl_set_bit(priv, CSR_GIO_CHICKEN_BITS, |
94 | CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX); | 94 | CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX); |
95 | 95 | ||
96 | /* Set FH wait treshold to maximum (HW error during stress W/A) */ | ||
97 | iwl_set_bit(priv, CSR_DBG_HPET_MEM_REG, CSR_DBG_HPET_MEM_REG_VAL); | ||
98 | |||
99 | /* enable HAP INTA to move device L1a -> L0s */ | ||
100 | iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG, | ||
101 | CSR_HW_IF_CONFIG_REG_BIT_HAP_WAKE_L1A); | ||
102 | |||
96 | iwl_set_bit(priv, CSR_ANA_PLL_CFG, CSR50_ANA_PLL_CFG_VAL); | 103 | iwl_set_bit(priv, CSR_ANA_PLL_CFG, CSR50_ANA_PLL_CFG_VAL); |
97 | 104 | ||
98 | /* set "initialization complete" bit to move adapter | 105 | /* set "initialization complete" bit to move adapter |
@@ -230,6 +237,16 @@ static void iwl5000_nic_config(struct iwl_priv *priv) | |||
230 | CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI | | 237 | CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI | |
231 | CSR_HW_IF_CONFIG_REG_BIT_MAC_SI); | 238 | CSR_HW_IF_CONFIG_REG_BIT_MAC_SI); |
232 | 239 | ||
240 | /* W/A : NIC is stuck in a reset state after Early PCIe power off | ||
241 | * (PCIe power is lost before PERST# is asserted), | ||
242 | * causing ME FW to lose ownership and not being able to obtain it back. | ||
243 | */ | ||
244 | iwl_grab_nic_access(priv); | ||
245 | iwl_set_bits_mask_prph(priv, APMG_PS_CTRL_REG, | ||
246 | APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS, | ||
247 | ~APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS); | ||
248 | iwl_release_nic_access(priv); | ||
249 | |||
233 | spin_unlock_irqrestore(&priv->lock, flags); | 250 | spin_unlock_irqrestore(&priv->lock, flags); |
234 | } | 251 | } |
235 | 252 | ||
@@ -924,8 +941,8 @@ static void iwl5000_txq_update_byte_cnt_tbl(struct iwl_priv *priv, | |||
924 | len = byte_cnt + IWL_TX_CRC_SIZE + IWL_TX_DELIMITER_SIZE; | 941 | len = byte_cnt + IWL_TX_CRC_SIZE + IWL_TX_DELIMITER_SIZE; |
925 | 942 | ||
926 | if (txq_id != IWL_CMD_QUEUE_NUM) { | 943 | if (txq_id != IWL_CMD_QUEUE_NUM) { |
927 | sta = txq->cmd[txq->q.write_ptr].cmd.tx.sta_id; | 944 | sta = txq->cmd[txq->q.write_ptr]->cmd.tx.sta_id; |
928 | sec_ctl = txq->cmd[txq->q.write_ptr].cmd.tx.sec_ctl; | 945 | sec_ctl = txq->cmd[txq->q.write_ptr]->cmd.tx.sec_ctl; |
929 | 946 | ||
930 | switch (sec_ctl & TX_CMD_SEC_MSK) { | 947 | switch (sec_ctl & TX_CMD_SEC_MSK) { |
931 | case TX_CMD_SEC_CCM: | 948 | case TX_CMD_SEC_CCM: |
@@ -964,7 +981,7 @@ static void iwl5000_txq_inval_byte_cnt_tbl(struct iwl_priv *priv, | |||
964 | u8 sta = 0; | 981 | u8 sta = 0; |
965 | 982 | ||
966 | if (txq_id != IWL_CMD_QUEUE_NUM) | 983 | if (txq_id != IWL_CMD_QUEUE_NUM) |
967 | sta = txq->cmd[txq->q.read_ptr].cmd.tx.sta_id; | 984 | sta = txq->cmd[txq->q.read_ptr]->cmd.tx.sta_id; |
968 | 985 | ||
969 | shared_data->queues_byte_cnt_tbls[txq_id].tfd_offset[txq->q.read_ptr]. | 986 | shared_data->queues_byte_cnt_tbls[txq_id].tfd_offset[txq->q.read_ptr]. |
970 | val = cpu_to_le16(1 | (sta << 12)); | 987 | val = cpu_to_le16(1 | (sta << 12)); |
@@ -1131,7 +1148,7 @@ static void iwl5000_txq_set_sched(struct iwl_priv *priv, u32 mask) | |||
1131 | 1148 | ||
1132 | static inline u32 iwl5000_get_scd_ssn(struct iwl5000_tx_resp *tx_resp) | 1149 | static inline u32 iwl5000_get_scd_ssn(struct iwl5000_tx_resp *tx_resp) |
1133 | { | 1150 | { |
1134 | return le32_to_cpup((__le32*)&tx_resp->status + | 1151 | return le32_to_cpup((__le32 *)&tx_resp->status + |
1135 | tx_resp->frame_count) & MAX_SN; | 1152 | tx_resp->frame_count) & MAX_SN; |
1136 | } | 1153 | } |
1137 | 1154 | ||
@@ -1228,9 +1245,9 @@ static int iwl5000_tx_status_reply_tx(struct iwl_priv *priv, | |||
1228 | bitmap = bitmap << sh; | 1245 | bitmap = bitmap << sh; |
1229 | sh = 0; | 1246 | sh = 0; |
1230 | } | 1247 | } |
1231 | bitmap |= (1 << sh); | 1248 | bitmap |= 1ULL << sh; |
1232 | IWL_DEBUG_TX_REPLY("start=%d bitmap=0x%x\n", | 1249 | IWL_DEBUG_TX_REPLY("start=%d bitmap=0x%llx\n", |
1233 | start, (u32)(bitmap & 0xFFFFFFFF)); | 1250 | start, (unsigned long long)bitmap); |
1234 | } | 1251 | } |
1235 | 1252 | ||
1236 | agg->bitmap = bitmap; | 1253 | agg->bitmap = bitmap; |
@@ -1444,6 +1461,44 @@ static void iwl5000_temperature(struct iwl_priv *priv) | |||
1444 | priv->temperature = le32_to_cpu(priv->statistics.general.temperature); | 1461 | priv->temperature = le32_to_cpu(priv->statistics.general.temperature); |
1445 | } | 1462 | } |
1446 | 1463 | ||
1464 | /* Calc max signal level (dBm) among 3 possible receivers */ | ||
1465 | static int iwl5000_calc_rssi(struct iwl_priv *priv, | ||
1466 | struct iwl_rx_phy_res *rx_resp) | ||
1467 | { | ||
1468 | /* data from PHY/DSP regarding signal strength, etc., | ||
1469 | * contents are always there, not configurable by host | ||
1470 | */ | ||
1471 | struct iwl5000_non_cfg_phy *ncphy = | ||
1472 | (struct iwl5000_non_cfg_phy *)rx_resp->non_cfg_phy_buf; | ||
1473 | u32 val, rssi_a, rssi_b, rssi_c, max_rssi; | ||
1474 | u8 agc; | ||
1475 | |||
1476 | val = le32_to_cpu(ncphy->non_cfg_phy[IWL50_RX_RES_AGC_IDX]); | ||
1477 | agc = (val & IWL50_OFDM_AGC_MSK) >> IWL50_OFDM_AGC_BIT_POS; | ||
1478 | |||
1479 | /* Find max rssi among 3 possible receivers. | ||
1480 | * These values are measured by the digital signal processor (DSP). | ||
1481 | * They should stay fairly constant even as the signal strength varies, | ||
1482 | * if the radio's automatic gain control (AGC) is working right. | ||
1483 | * AGC value (see below) will provide the "interesting" info. | ||
1484 | */ | ||
1485 | val = le32_to_cpu(ncphy->non_cfg_phy[IWL50_RX_RES_RSSI_AB_IDX]); | ||
1486 | rssi_a = (val & IWL50_OFDM_RSSI_A_MSK) >> IWL50_OFDM_RSSI_A_BIT_POS; | ||
1487 | rssi_b = (val & IWL50_OFDM_RSSI_B_MSK) >> IWL50_OFDM_RSSI_B_BIT_POS; | ||
1488 | val = le32_to_cpu(ncphy->non_cfg_phy[IWL50_RX_RES_RSSI_C_IDX]); | ||
1489 | rssi_c = (val & IWL50_OFDM_RSSI_C_MSK) >> IWL50_OFDM_RSSI_C_BIT_POS; | ||
1490 | |||
1491 | max_rssi = max_t(u32, rssi_a, rssi_b); | ||
1492 | max_rssi = max_t(u32, max_rssi, rssi_c); | ||
1493 | |||
1494 | IWL_DEBUG_STATS("Rssi In A %d B %d C %d Max %d AGC dB %d\n", | ||
1495 | rssi_a, rssi_b, rssi_c, max_rssi, agc); | ||
1496 | |||
1497 | /* dBm = max_rssi dB - agc dB - constant. | ||
1498 | * Higher AGC (higher radio gain) means lower signal. */ | ||
1499 | return max_rssi - agc - IWL_RSSI_OFFSET; | ||
1500 | } | ||
1501 | |||
1447 | static struct iwl_hcmd_ops iwl5000_hcmd = { | 1502 | static struct iwl_hcmd_ops iwl5000_hcmd = { |
1448 | .rxon_assoc = iwl5000_send_rxon_assoc, | 1503 | .rxon_assoc = iwl5000_send_rxon_assoc, |
1449 | }; | 1504 | }; |
@@ -1454,6 +1509,7 @@ static struct iwl_hcmd_utils_ops iwl5000_hcmd_utils = { | |||
1454 | .gain_computation = iwl5000_gain_computation, | 1509 | .gain_computation = iwl5000_gain_computation, |
1455 | .chain_noise_reset = iwl5000_chain_noise_reset, | 1510 | .chain_noise_reset = iwl5000_chain_noise_reset, |
1456 | .rts_tx_cmd_flag = iwl5000_rts_tx_cmd_flag, | 1511 | .rts_tx_cmd_flag = iwl5000_rts_tx_cmd_flag, |
1512 | .calc_rssi = iwl5000_calc_rssi, | ||
1457 | }; | 1513 | }; |
1458 | 1514 | ||
1459 | static struct iwl_lib_ops iwl5000_lib = { | 1515 | static struct iwl_lib_ops iwl5000_lib = { |
@@ -1474,6 +1530,7 @@ static struct iwl_lib_ops iwl5000_lib = { | |||
1474 | .alive_notify = iwl5000_alive_notify, | 1530 | .alive_notify = iwl5000_alive_notify, |
1475 | .send_tx_power = iwl5000_send_tx_power, | 1531 | .send_tx_power = iwl5000_send_tx_power, |
1476 | .temperature = iwl5000_temperature, | 1532 | .temperature = iwl5000_temperature, |
1533 | .update_chain_flags = iwl4965_update_chain_flags, | ||
1477 | .apm_ops = { | 1534 | .apm_ops = { |
1478 | .init = iwl5000_apm_init, | 1535 | .init = iwl5000_apm_init, |
1479 | .reset = iwl5000_apm_reset, | 1536 | .reset = iwl5000_apm_reset, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index 3ccb84aa5dbc..754fef5b592f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
@@ -42,7 +42,7 @@ | |||
42 | #include "iwl-core.h" | 42 | #include "iwl-core.h" |
43 | #include "iwl-helpers.h" | 43 | #include "iwl-helpers.h" |
44 | 44 | ||
45 | #define RS_NAME "iwl-4965-rs" | 45 | #define RS_NAME "iwl-agn-rs" |
46 | 46 | ||
47 | #define NUM_TRY_BEFORE_ANT_TOGGLE 1 | 47 | #define NUM_TRY_BEFORE_ANT_TOGGLE 1 |
48 | #define IWL_NUMBER_TRY 1 | 48 | #define IWL_NUMBER_TRY 1 |
@@ -77,9 +77,9 @@ static const u8 ant_toggle_lookup[] = { | |||
77 | }; | 77 | }; |
78 | 78 | ||
79 | /** | 79 | /** |
80 | * struct iwl4965_rate_scale_data -- tx success history for one rate | 80 | * struct iwl_rate_scale_data -- tx success history for one rate |
81 | */ | 81 | */ |
82 | struct iwl4965_rate_scale_data { | 82 | struct iwl_rate_scale_data { |
83 | u64 data; /* bitmap of successful frames */ | 83 | u64 data; /* bitmap of successful frames */ |
84 | s32 success_counter; /* number of frames successful */ | 84 | s32 success_counter; /* number of frames successful */ |
85 | s32 success_ratio; /* per-cent * 128 */ | 85 | s32 success_ratio; /* per-cent * 128 */ |
@@ -89,12 +89,12 @@ struct iwl4965_rate_scale_data { | |||
89 | }; | 89 | }; |
90 | 90 | ||
91 | /** | 91 | /** |
92 | * struct iwl4965_scale_tbl_info -- tx params and success history for all rates | 92 | * struct iwl_scale_tbl_info -- tx params and success history for all rates |
93 | * | 93 | * |
94 | * There are two of these in struct iwl4965_lq_sta, | 94 | * There are two of these in struct iwl_lq_sta, |
95 | * one for "active", and one for "search". | 95 | * one for "active", and one for "search". |
96 | */ | 96 | */ |
97 | struct iwl4965_scale_tbl_info { | 97 | struct iwl_scale_tbl_info { |
98 | enum iwl_table_type lq_type; | 98 | enum iwl_table_type lq_type; |
99 | u8 ant_type; | 99 | u8 ant_type; |
100 | u8 is_SGI; /* 1 = short guard interval */ | 100 | u8 is_SGI; /* 1 = short guard interval */ |
@@ -103,10 +103,10 @@ struct iwl4965_scale_tbl_info { | |||
103 | u8 action; /* change modulation; IWL_[LEGACY/SISO/MIMO]_SWITCH_* */ | 103 | u8 action; /* change modulation; IWL_[LEGACY/SISO/MIMO]_SWITCH_* */ |
104 | s32 *expected_tpt; /* throughput metrics; expected_tpt_G, etc. */ | 104 | s32 *expected_tpt; /* throughput metrics; expected_tpt_G, etc. */ |
105 | u32 current_rate; /* rate_n_flags, uCode API format */ | 105 | u32 current_rate; /* rate_n_flags, uCode API format */ |
106 | struct iwl4965_rate_scale_data win[IWL_RATE_COUNT]; /* rate histories */ | 106 | struct iwl_rate_scale_data win[IWL_RATE_COUNT]; /* rate histories */ |
107 | }; | 107 | }; |
108 | 108 | ||
109 | struct iwl4965_traffic_load { | 109 | struct iwl_traffic_load { |
110 | unsigned long time_stamp; /* age of the oldest statistics */ | 110 | unsigned long time_stamp; /* age of the oldest statistics */ |
111 | u32 packet_count[TID_QUEUE_MAX_SIZE]; /* packet count in this time | 111 | u32 packet_count[TID_QUEUE_MAX_SIZE]; /* packet count in this time |
112 | * slice */ | 112 | * slice */ |
@@ -118,11 +118,11 @@ struct iwl4965_traffic_load { | |||
118 | }; | 118 | }; |
119 | 119 | ||
120 | /** | 120 | /** |
121 | * struct iwl4965_lq_sta -- driver's rate scaling private structure | 121 | * struct iwl_lq_sta -- driver's rate scaling private structure |
122 | * | 122 | * |
123 | * Pointer to this gets passed back and forth between driver and mac80211. | 123 | * Pointer to this gets passed back and forth between driver and mac80211. |
124 | */ | 124 | */ |
125 | struct iwl4965_lq_sta { | 125 | struct iwl_lq_sta { |
126 | u8 active_tbl; /* index of active table, range 0-1 */ | 126 | u8 active_tbl; /* index of active table, range 0-1 */ |
127 | u8 enable_counter; /* indicates HT mode */ | 127 | u8 enable_counter; /* indicates HT mode */ |
128 | u8 stay_in_tbl; /* 1: disallow, 0: allow search for new mode */ | 128 | u8 stay_in_tbl; /* 1: disallow, 0: allow search for new mode */ |
@@ -153,8 +153,8 @@ struct iwl4965_lq_sta { | |||
153 | u16 active_rate_basic; | 153 | u16 active_rate_basic; |
154 | 154 | ||
155 | struct iwl_link_quality_cmd lq; | 155 | struct iwl_link_quality_cmd lq; |
156 | struct iwl4965_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */ | 156 | struct iwl_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */ |
157 | struct iwl4965_traffic_load load[TID_MAX_LOAD_COUNT]; | 157 | struct iwl_traffic_load load[TID_MAX_LOAD_COUNT]; |
158 | u8 tx_agg_tid_en; | 158 | u8 tx_agg_tid_en; |
159 | #ifdef CONFIG_MAC80211_DEBUGFS | 159 | #ifdef CONFIG_MAC80211_DEBUGFS |
160 | struct dentry *rs_sta_dbgfs_scale_table_file; | 160 | struct dentry *rs_sta_dbgfs_scale_table_file; |
@@ -170,16 +170,15 @@ static void rs_rate_scale_perform(struct iwl_priv *priv, | |||
170 | struct ieee80211_hdr *hdr, | 170 | struct ieee80211_hdr *hdr, |
171 | struct sta_info *sta); | 171 | struct sta_info *sta); |
172 | static void rs_fill_link_cmd(const struct iwl_priv *priv, | 172 | static void rs_fill_link_cmd(const struct iwl_priv *priv, |
173 | struct iwl4965_lq_sta *lq_sta, | 173 | struct iwl_lq_sta *lq_sta, u32 rate_n_flags); |
174 | u32 rate_n_flags); | ||
175 | 174 | ||
176 | 175 | ||
177 | #ifdef CONFIG_MAC80211_DEBUGFS | 176 | #ifdef CONFIG_MAC80211_DEBUGFS |
178 | static void rs_dbgfs_set_mcs(struct iwl4965_lq_sta *lq_sta, | 177 | static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta, |
179 | u32 *rate_n_flags, int index); | 178 | u32 *rate_n_flags, int index); |
180 | #else | 179 | #else |
181 | static void rs_dbgfs_set_mcs(struct iwl4965_lq_sta *lq_sta, | 180 | static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta, |
182 | u32 *rate_n_flags, int index) | 181 | u32 *rate_n_flags, int index) |
183 | {} | 182 | {} |
184 | #endif | 183 | #endif |
185 | 184 | ||
@@ -234,7 +233,7 @@ static inline u8 rs_extract_rate(u32 rate_n_flags) | |||
234 | return (u8)(rate_n_flags & 0xFF); | 233 | return (u8)(rate_n_flags & 0xFF); |
235 | } | 234 | } |
236 | 235 | ||
237 | static void rs_rate_scale_clear_window(struct iwl4965_rate_scale_data *window) | 236 | static void rs_rate_scale_clear_window(struct iwl_rate_scale_data *window) |
238 | { | 237 | { |
239 | window->data = 0; | 238 | window->data = 0; |
240 | window->success_counter = 0; | 239 | window->success_counter = 0; |
@@ -246,14 +245,14 @@ static void rs_rate_scale_clear_window(struct iwl4965_rate_scale_data *window) | |||
246 | 245 | ||
247 | static inline u8 rs_is_valid_ant(u8 valid_antenna, u8 ant_type) | 246 | static inline u8 rs_is_valid_ant(u8 valid_antenna, u8 ant_type) |
248 | { | 247 | { |
249 | return ((ant_type & valid_antenna) == ant_type); | 248 | return (ant_type & valid_antenna) == ant_type; |
250 | } | 249 | } |
251 | 250 | ||
252 | /* | 251 | /* |
253 | * removes the old data from the statistics. All data that is older than | 252 | * removes the old data from the statistics. All data that is older than |
254 | * TID_MAX_TIME_DIFF, will be deleted. | 253 | * TID_MAX_TIME_DIFF, will be deleted. |
255 | */ | 254 | */ |
256 | static void rs_tl_rm_old_stats(struct iwl4965_traffic_load *tl, u32 curr_time) | 255 | static void rs_tl_rm_old_stats(struct iwl_traffic_load *tl, u32 curr_time) |
257 | { | 256 | { |
258 | /* The oldest age we want to keep */ | 257 | /* The oldest age we want to keep */ |
259 | u32 oldest_time = curr_time - TID_MAX_TIME_DIFF; | 258 | u32 oldest_time = curr_time - TID_MAX_TIME_DIFF; |
@@ -274,13 +273,13 @@ static void rs_tl_rm_old_stats(struct iwl4965_traffic_load *tl, u32 curr_time) | |||
274 | * increment traffic load value for tid and also remove | 273 | * increment traffic load value for tid and also remove |
275 | * any old values if passed the certain time period | 274 | * any old values if passed the certain time period |
276 | */ | 275 | */ |
277 | static u8 rs_tl_add_packet(struct iwl4965_lq_sta *lq_data, | 276 | static u8 rs_tl_add_packet(struct iwl_lq_sta *lq_data, |
278 | struct ieee80211_hdr *hdr) | 277 | struct ieee80211_hdr *hdr) |
279 | { | 278 | { |
280 | u32 curr_time = jiffies_to_msecs(jiffies); | 279 | u32 curr_time = jiffies_to_msecs(jiffies); |
281 | u32 time_diff; | 280 | u32 time_diff; |
282 | s32 index; | 281 | s32 index; |
283 | struct iwl4965_traffic_load *tl = NULL; | 282 | struct iwl_traffic_load *tl = NULL; |
284 | __le16 fc = hdr->frame_control; | 283 | __le16 fc = hdr->frame_control; |
285 | u8 tid; | 284 | u8 tid; |
286 | 285 | ||
@@ -325,12 +324,12 @@ static u8 rs_tl_add_packet(struct iwl4965_lq_sta *lq_data, | |||
325 | /* | 324 | /* |
326 | get the traffic load value for tid | 325 | get the traffic load value for tid |
327 | */ | 326 | */ |
328 | static u32 rs_tl_get_load(struct iwl4965_lq_sta *lq_data, u8 tid) | 327 | static u32 rs_tl_get_load(struct iwl_lq_sta *lq_data, u8 tid) |
329 | { | 328 | { |
330 | u32 curr_time = jiffies_to_msecs(jiffies); | 329 | u32 curr_time = jiffies_to_msecs(jiffies); |
331 | u32 time_diff; | 330 | u32 time_diff; |
332 | s32 index; | 331 | s32 index; |
333 | struct iwl4965_traffic_load *tl = NULL; | 332 | struct iwl_traffic_load *tl = NULL; |
334 | 333 | ||
335 | if (tid >= TID_MAX_LOAD_COUNT) | 334 | if (tid >= TID_MAX_LOAD_COUNT) |
336 | return 0; | 335 | return 0; |
@@ -354,8 +353,8 @@ static u32 rs_tl_get_load(struct iwl4965_lq_sta *lq_data, u8 tid) | |||
354 | } | 353 | } |
355 | 354 | ||
356 | static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv, | 355 | static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv, |
357 | struct iwl4965_lq_sta *lq_data, u8 tid, | 356 | struct iwl_lq_sta *lq_data, u8 tid, |
358 | struct sta_info *sta) | 357 | struct sta_info *sta) |
359 | { | 358 | { |
360 | unsigned long state; | 359 | unsigned long state; |
361 | DECLARE_MAC_BUF(mac); | 360 | DECLARE_MAC_BUF(mac); |
@@ -373,8 +372,8 @@ static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv, | |||
373 | } | 372 | } |
374 | 373 | ||
375 | static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid, | 374 | static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid, |
376 | struct iwl4965_lq_sta *lq_data, | 375 | struct iwl_lq_sta *lq_data, |
377 | struct sta_info *sta) | 376 | struct sta_info *sta) |
378 | { | 377 | { |
379 | if ((tid < TID_MAX_LOAD_COUNT)) | 378 | if ((tid < TID_MAX_LOAD_COUNT)) |
380 | rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta); | 379 | rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta); |
@@ -385,9 +384,9 @@ static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid, | |||
385 | 384 | ||
386 | static inline int get_num_of_ant_from_rate(u32 rate_n_flags) | 385 | static inline int get_num_of_ant_from_rate(u32 rate_n_flags) |
387 | { | 386 | { |
388 | return (!!(rate_n_flags & RATE_MCS_ANT_A_MSK) + | 387 | return !!(rate_n_flags & RATE_MCS_ANT_A_MSK) + |
389 | !!(rate_n_flags & RATE_MCS_ANT_B_MSK) + | 388 | !!(rate_n_flags & RATE_MCS_ANT_B_MSK) + |
390 | !!(rate_n_flags & RATE_MCS_ANT_C_MSK)); | 389 | !!(rate_n_flags & RATE_MCS_ANT_C_MSK); |
391 | } | 390 | } |
392 | 391 | ||
393 | /** | 392 | /** |
@@ -397,11 +396,11 @@ static inline int get_num_of_ant_from_rate(u32 rate_n_flags) | |||
397 | * at this rate. window->data contains the bitmask of successful | 396 | * at this rate. window->data contains the bitmask of successful |
398 | * packets. | 397 | * packets. |
399 | */ | 398 | */ |
400 | static int rs_collect_tx_data(struct iwl4965_rate_scale_data *windows, | 399 | static int rs_collect_tx_data(struct iwl_rate_scale_data *windows, |
401 | int scale_index, s32 tpt, int retries, | 400 | int scale_index, s32 tpt, int retries, |
402 | int successes) | 401 | int successes) |
403 | { | 402 | { |
404 | struct iwl4965_rate_scale_data *window = NULL; | 403 | struct iwl_rate_scale_data *window = NULL; |
405 | static const u64 mask = (((u64)1) << (IWL_RATE_MAX_WINDOW - 1)); | 404 | static const u64 mask = (((u64)1) << (IWL_RATE_MAX_WINDOW - 1)); |
406 | s32 fail_count; | 405 | s32 fail_count; |
407 | 406 | ||
@@ -473,7 +472,7 @@ static int rs_collect_tx_data(struct iwl4965_rate_scale_data *windows, | |||
473 | * Fill uCode API rate_n_flags field, based on "search" or "active" table. | 472 | * Fill uCode API rate_n_flags field, based on "search" or "active" table. |
474 | */ | 473 | */ |
475 | /* FIXME:RS:remove this function and put the flags statically in the table */ | 474 | /* FIXME:RS:remove this function and put the flags statically in the table */ |
476 | static u32 rate_n_flags_from_tbl(struct iwl4965_scale_tbl_info *tbl, | 475 | static u32 rate_n_flags_from_tbl(struct iwl_scale_tbl_info *tbl, |
477 | int index, u8 use_green) | 476 | int index, u8 use_green) |
478 | { | 477 | { |
479 | u32 rate_n_flags = 0; | 478 | u32 rate_n_flags = 0; |
@@ -530,7 +529,7 @@ static u32 rate_n_flags_from_tbl(struct iwl4965_scale_tbl_info *tbl, | |||
530 | */ | 529 | */ |
531 | static int rs_get_tbl_info_from_mcs(const u32 rate_n_flags, | 530 | static int rs_get_tbl_info_from_mcs(const u32 rate_n_flags, |
532 | enum ieee80211_band band, | 531 | enum ieee80211_band band, |
533 | struct iwl4965_scale_tbl_info *tbl, | 532 | struct iwl_scale_tbl_info *tbl, |
534 | int *rate_idx) | 533 | int *rate_idx) |
535 | { | 534 | { |
536 | u32 ant_msk = (rate_n_flags & RATE_MCS_ANT_ABC_MSK); | 535 | u32 ant_msk = (rate_n_flags & RATE_MCS_ANT_ABC_MSK); |
@@ -591,7 +590,7 @@ static int rs_get_tbl_info_from_mcs(const u32 rate_n_flags, | |||
591 | /* switch to another antenna/antennas and return 1 */ | 590 | /* switch to another antenna/antennas and return 1 */ |
592 | /* if no other valid antenna found, return 0 */ | 591 | /* if no other valid antenna found, return 0 */ |
593 | static int rs_toggle_antenna(u32 valid_ant, u32 *rate_n_flags, | 592 | static int rs_toggle_antenna(u32 valid_ant, u32 *rate_n_flags, |
594 | struct iwl4965_scale_tbl_info *tbl) | 593 | struct iwl_scale_tbl_info *tbl) |
595 | { | 594 | { |
596 | u8 new_ant_type; | 595 | u8 new_ant_type; |
597 | 596 | ||
@@ -621,9 +620,9 @@ static int rs_toggle_antenna(u32 valid_ant, u32 *rate_n_flags, | |||
621 | #if 0 | 620 | #if 0 |
622 | static inline u8 rs_use_green(struct iwl_priv *priv, struct ieee80211_conf *conf) | 621 | static inline u8 rs_use_green(struct iwl_priv *priv, struct ieee80211_conf *conf) |
623 | { | 622 | { |
624 | return ((conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) && | 623 | return (conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) && |
625 | priv->current_ht_config.is_green_field && | 624 | priv->current_ht_config.is_green_field && |
626 | !priv->current_ht_config.non_GF_STA_present); | 625 | !priv->current_ht_config.non_GF_STA_present; |
627 | } | 626 | } |
628 | #endif | 627 | #endif |
629 | static inline u8 rs_use_green(struct iwl_priv *priv, struct ieee80211_conf *conf) | 628 | static inline u8 rs_use_green(struct iwl_priv *priv, struct ieee80211_conf *conf) |
@@ -638,9 +637,9 @@ static inline u8 rs_use_green(struct iwl_priv *priv, struct ieee80211_conf *conf | |||
638 | * basic available rates. | 637 | * basic available rates. |
639 | * | 638 | * |
640 | */ | 639 | */ |
641 | static u16 rs_get_supported_rates(struct iwl4965_lq_sta *lq_sta, | 640 | static u16 rs_get_supported_rates(struct iwl_lq_sta *lq_sta, |
642 | struct ieee80211_hdr *hdr, | 641 | struct ieee80211_hdr *hdr, |
643 | enum iwl_table_type rate_type) | 642 | enum iwl_table_type rate_type) |
644 | { | 643 | { |
645 | if (hdr && is_multicast_ether_addr(hdr->addr1) && | 644 | if (hdr && is_multicast_ether_addr(hdr->addr1) && |
646 | lq_sta->active_rate_basic) | 645 | lq_sta->active_rate_basic) |
@@ -714,9 +713,9 @@ static u16 rs_get_adjacent_rate(struct iwl_priv *priv, u8 index, u16 rate_mask, | |||
714 | return (high << 8) | low; | 713 | return (high << 8) | low; |
715 | } | 714 | } |
716 | 715 | ||
717 | static u32 rs_get_lower_rate(struct iwl4965_lq_sta *lq_sta, | 716 | static u32 rs_get_lower_rate(struct iwl_lq_sta *lq_sta, |
718 | struct iwl4965_scale_tbl_info *tbl, u8 scale_index, | 717 | struct iwl_scale_tbl_info *tbl, |
719 | u8 ht_possible) | 718 | u8 scale_index, u8 ht_possible) |
720 | { | 719 | { |
721 | s32 low; | 720 | s32 low; |
722 | u16 rate_mask; | 721 | u16 rate_mask; |
@@ -780,7 +779,7 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev, | |||
780 | int status; | 779 | int status; |
781 | u8 retries; | 780 | u8 retries; |
782 | int rs_index, index = 0; | 781 | int rs_index, index = 0; |
783 | struct iwl4965_lq_sta *lq_sta; | 782 | struct iwl_lq_sta *lq_sta; |
784 | struct iwl_link_quality_cmd *table; | 783 | struct iwl_link_quality_cmd *table; |
785 | struct sta_info *sta; | 784 | struct sta_info *sta; |
786 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 785 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
@@ -788,11 +787,11 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev, | |||
788 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 787 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
789 | struct ieee80211_hw *hw = local_to_hw(local); | 788 | struct ieee80211_hw *hw = local_to_hw(local); |
790 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 789 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
791 | struct iwl4965_rate_scale_data *window = NULL; | 790 | struct iwl_rate_scale_data *window = NULL; |
792 | struct iwl4965_rate_scale_data *search_win = NULL; | 791 | struct iwl_rate_scale_data *search_win = NULL; |
793 | u32 tx_rate; | 792 | u32 tx_rate; |
794 | struct iwl4965_scale_tbl_info tbl_type; | 793 | struct iwl_scale_tbl_info tbl_type; |
795 | struct iwl4965_scale_tbl_info *curr_tbl, *search_tbl; | 794 | struct iwl_scale_tbl_info *curr_tbl, *search_tbl; |
796 | u8 active_index = 0; | 795 | u8 active_index = 0; |
797 | __le16 fc = hdr->frame_control; | 796 | __le16 fc = hdr->frame_control; |
798 | s32 tpt = 0; | 797 | s32 tpt = 0; |
@@ -820,7 +819,7 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev, | |||
820 | goto out; | 819 | goto out; |
821 | 820 | ||
822 | 821 | ||
823 | lq_sta = (struct iwl4965_lq_sta *)sta->rate_ctrl_priv; | 822 | lq_sta = (struct iwl_lq_sta *)sta->rate_ctrl_priv; |
824 | 823 | ||
825 | if ((priv->iw_mode == IEEE80211_IF_TYPE_IBSS) && | 824 | if ((priv->iw_mode == IEEE80211_IF_TYPE_IBSS) && |
826 | !lq_sta->ibss_sta_added) | 825 | !lq_sta->ibss_sta_added) |
@@ -831,10 +830,8 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev, | |||
831 | 830 | ||
832 | curr_tbl = &(lq_sta->lq_info[active_index]); | 831 | curr_tbl = &(lq_sta->lq_info[active_index]); |
833 | search_tbl = &(lq_sta->lq_info[(1 - active_index)]); | 832 | search_tbl = &(lq_sta->lq_info[(1 - active_index)]); |
834 | window = (struct iwl4965_rate_scale_data *) | 833 | window = (struct iwl_rate_scale_data *)&(curr_tbl->win[0]); |
835 | &(curr_tbl->win[0]); | 834 | search_win = (struct iwl_rate_scale_data *)&(search_tbl->win[0]); |
836 | search_win = (struct iwl4965_rate_scale_data *) | ||
837 | &(search_tbl->win[0]); | ||
838 | 835 | ||
839 | /* | 836 | /* |
840 | * Ignore this Tx frame response if its initial rate doesn't match | 837 | * Ignore this Tx frame response if its initial rate doesn't match |
@@ -983,7 +980,7 @@ out: | |||
983 | * searching for a new mode. | 980 | * searching for a new mode. |
984 | */ | 981 | */ |
985 | static void rs_set_stay_in_table(struct iwl_priv *priv, u8 is_legacy, | 982 | static void rs_set_stay_in_table(struct iwl_priv *priv, u8 is_legacy, |
986 | struct iwl4965_lq_sta *lq_sta) | 983 | struct iwl_lq_sta *lq_sta) |
987 | { | 984 | { |
988 | IWL_DEBUG_RATE("we are staying in the same table\n"); | 985 | IWL_DEBUG_RATE("we are staying in the same table\n"); |
989 | lq_sta->stay_in_tbl = 1; /* only place this gets set */ | 986 | lq_sta->stay_in_tbl = 1; /* only place this gets set */ |
@@ -1004,8 +1001,8 @@ static void rs_set_stay_in_table(struct iwl_priv *priv, u8 is_legacy, | |||
1004 | /* | 1001 | /* |
1005 | * Find correct throughput table for given mode of modulation | 1002 | * Find correct throughput table for given mode of modulation |
1006 | */ | 1003 | */ |
1007 | static void rs_set_expected_tpt_table(struct iwl4965_lq_sta *lq_sta, | 1004 | static void rs_set_expected_tpt_table(struct iwl_lq_sta *lq_sta, |
1008 | struct iwl4965_scale_tbl_info *tbl) | 1005 | struct iwl_scale_tbl_info *tbl) |
1009 | { | 1006 | { |
1010 | if (is_legacy(tbl->lq_type)) { | 1007 | if (is_legacy(tbl->lq_type)) { |
1011 | if (!is_a_band(tbl->lq_type)) | 1008 | if (!is_a_band(tbl->lq_type)) |
@@ -1050,12 +1047,12 @@ static void rs_set_expected_tpt_table(struct iwl4965_lq_sta *lq_sta, | |||
1050 | * bit rate will typically need to increase, but not if performance was bad. | 1047 | * bit rate will typically need to increase, but not if performance was bad. |
1051 | */ | 1048 | */ |
1052 | static s32 rs_get_best_rate(struct iwl_priv *priv, | 1049 | static s32 rs_get_best_rate(struct iwl_priv *priv, |
1053 | struct iwl4965_lq_sta *lq_sta, | 1050 | struct iwl_lq_sta *lq_sta, |
1054 | struct iwl4965_scale_tbl_info *tbl, /* "search" */ | 1051 | struct iwl_scale_tbl_info *tbl, /* "search" */ |
1055 | u16 rate_mask, s8 index) | 1052 | u16 rate_mask, s8 index) |
1056 | { | 1053 | { |
1057 | /* "active" values */ | 1054 | /* "active" values */ |
1058 | struct iwl4965_scale_tbl_info *active_tbl = | 1055 | struct iwl_scale_tbl_info *active_tbl = |
1059 | &(lq_sta->lq_info[lq_sta->active_tbl]); | 1056 | &(lq_sta->lq_info[lq_sta->active_tbl]); |
1060 | s32 active_sr = active_tbl->win[index].success_ratio; | 1057 | s32 active_sr = active_tbl->win[index].success_ratio; |
1061 | s32 active_tpt = active_tbl->expected_tpt[index]; | 1058 | s32 active_tpt = active_tbl->expected_tpt[index]; |
@@ -1143,10 +1140,10 @@ static s32 rs_get_best_rate(struct iwl_priv *priv, | |||
1143 | * Set up search table for MIMO | 1140 | * Set up search table for MIMO |
1144 | */ | 1141 | */ |
1145 | static int rs_switch_to_mimo2(struct iwl_priv *priv, | 1142 | static int rs_switch_to_mimo2(struct iwl_priv *priv, |
1146 | struct iwl4965_lq_sta *lq_sta, | 1143 | struct iwl_lq_sta *lq_sta, |
1147 | struct ieee80211_conf *conf, | 1144 | struct ieee80211_conf *conf, |
1148 | struct sta_info *sta, | 1145 | struct sta_info *sta, |
1149 | struct iwl4965_scale_tbl_info *tbl, int index) | 1146 | struct iwl_scale_tbl_info *tbl, int index) |
1150 | { | 1147 | { |
1151 | u16 rate_mask; | 1148 | u16 rate_mask; |
1152 | s32 rate; | 1149 | s32 rate; |
@@ -1210,10 +1207,10 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv, | |||
1210 | * Set up search table for SISO | 1207 | * Set up search table for SISO |
1211 | */ | 1208 | */ |
1212 | static int rs_switch_to_siso(struct iwl_priv *priv, | 1209 | static int rs_switch_to_siso(struct iwl_priv *priv, |
1213 | struct iwl4965_lq_sta *lq_sta, | 1210 | struct iwl_lq_sta *lq_sta, |
1214 | struct ieee80211_conf *conf, | 1211 | struct ieee80211_conf *conf, |
1215 | struct sta_info *sta, | 1212 | struct sta_info *sta, |
1216 | struct iwl4965_scale_tbl_info *tbl, int index) | 1213 | struct iwl_scale_tbl_info *tbl, int index) |
1217 | { | 1214 | { |
1218 | u16 rate_mask; | 1215 | u16 rate_mask; |
1219 | u8 is_green = lq_sta->is_green; | 1216 | u8 is_green = lq_sta->is_green; |
@@ -1270,18 +1267,17 @@ static int rs_switch_to_siso(struct iwl_priv *priv, | |||
1270 | * Try to switch to new modulation mode from legacy | 1267 | * Try to switch to new modulation mode from legacy |
1271 | */ | 1268 | */ |
1272 | static int rs_move_legacy_other(struct iwl_priv *priv, | 1269 | static int rs_move_legacy_other(struct iwl_priv *priv, |
1273 | struct iwl4965_lq_sta *lq_sta, | 1270 | struct iwl_lq_sta *lq_sta, |
1274 | struct ieee80211_conf *conf, | 1271 | struct ieee80211_conf *conf, |
1275 | struct sta_info *sta, | 1272 | struct sta_info *sta, |
1276 | int index) | 1273 | int index) |
1277 | { | 1274 | { |
1278 | struct iwl4965_scale_tbl_info *tbl = | 1275 | struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); |
1279 | &(lq_sta->lq_info[lq_sta->active_tbl]); | 1276 | struct iwl_scale_tbl_info *search_tbl = |
1280 | struct iwl4965_scale_tbl_info *search_tbl = | 1277 | &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); |
1281 | &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); | 1278 | struct iwl_rate_scale_data *window = &(tbl->win[index]); |
1282 | struct iwl4965_rate_scale_data *window = &(tbl->win[index]); | 1279 | u32 sz = (sizeof(struct iwl_scale_tbl_info) - |
1283 | u32 sz = (sizeof(struct iwl4965_scale_tbl_info) - | 1280 | (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT)); |
1284 | (sizeof(struct iwl4965_rate_scale_data) * IWL_RATE_COUNT)); | ||
1285 | u8 start_action = tbl->action; | 1281 | u8 start_action = tbl->action; |
1286 | u8 valid_tx_ant = priv->hw_params.valid_tx_ant; | 1282 | u8 valid_tx_ant = priv->hw_params.valid_tx_ant; |
1287 | int ret = 0; | 1283 | int ret = 0; |
@@ -1360,19 +1356,17 @@ static int rs_move_legacy_other(struct iwl_priv *priv, | |||
1360 | * Try to switch to new modulation mode from SISO | 1356 | * Try to switch to new modulation mode from SISO |
1361 | */ | 1357 | */ |
1362 | static int rs_move_siso_to_other(struct iwl_priv *priv, | 1358 | static int rs_move_siso_to_other(struct iwl_priv *priv, |
1363 | struct iwl4965_lq_sta *lq_sta, | 1359 | struct iwl_lq_sta *lq_sta, |
1364 | struct ieee80211_conf *conf, | 1360 | struct ieee80211_conf *conf, |
1365 | struct sta_info *sta, | 1361 | struct sta_info *sta, int index) |
1366 | int index) | ||
1367 | { | 1362 | { |
1368 | u8 is_green = lq_sta->is_green; | 1363 | u8 is_green = lq_sta->is_green; |
1369 | struct iwl4965_scale_tbl_info *tbl = | 1364 | struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); |
1370 | &(lq_sta->lq_info[lq_sta->active_tbl]); | 1365 | struct iwl_scale_tbl_info *search_tbl = |
1371 | struct iwl4965_scale_tbl_info *search_tbl = | 1366 | &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); |
1372 | &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); | 1367 | struct iwl_rate_scale_data *window = &(tbl->win[index]); |
1373 | struct iwl4965_rate_scale_data *window = &(tbl->win[index]); | 1368 | u32 sz = (sizeof(struct iwl_scale_tbl_info) - |
1374 | u32 sz = (sizeof(struct iwl4965_scale_tbl_info) - | 1369 | (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT)); |
1375 | (sizeof(struct iwl4965_rate_scale_data) * IWL_RATE_COUNT)); | ||
1376 | u8 start_action = tbl->action; | 1370 | u8 start_action = tbl->action; |
1377 | u8 valid_tx_ant = priv->hw_params.valid_tx_ant; | 1371 | u8 valid_tx_ant = priv->hw_params.valid_tx_ant; |
1378 | int ret; | 1372 | int ret; |
@@ -1455,18 +1449,16 @@ static int rs_move_siso_to_other(struct iwl_priv *priv, | |||
1455 | * Try to switch to new modulation mode from MIMO | 1449 | * Try to switch to new modulation mode from MIMO |
1456 | */ | 1450 | */ |
1457 | static int rs_move_mimo_to_other(struct iwl_priv *priv, | 1451 | static int rs_move_mimo_to_other(struct iwl_priv *priv, |
1458 | struct iwl4965_lq_sta *lq_sta, | 1452 | struct iwl_lq_sta *lq_sta, |
1459 | struct ieee80211_conf *conf, | 1453 | struct ieee80211_conf *conf, |
1460 | struct sta_info *sta, | 1454 | struct sta_info *sta, int index) |
1461 | int index) | ||
1462 | { | 1455 | { |
1463 | s8 is_green = lq_sta->is_green; | 1456 | s8 is_green = lq_sta->is_green; |
1464 | struct iwl4965_scale_tbl_info *tbl = | 1457 | struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); |
1465 | &(lq_sta->lq_info[lq_sta->active_tbl]); | 1458 | struct iwl_scale_tbl_info *search_tbl = |
1466 | struct iwl4965_scale_tbl_info *search_tbl = | 1459 | &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); |
1467 | &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); | 1460 | u32 sz = (sizeof(struct iwl_scale_tbl_info) - |
1468 | u32 sz = (sizeof(struct iwl4965_scale_tbl_info) - | 1461 | (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT)); |
1469 | (sizeof(struct iwl4965_rate_scale_data) * IWL_RATE_COUNT)); | ||
1470 | u8 start_action = tbl->action; | 1462 | u8 start_action = tbl->action; |
1471 | /*u8 valid_tx_ant = priv->hw_params.valid_tx_ant;*/ | 1463 | /*u8 valid_tx_ant = priv->hw_params.valid_tx_ant;*/ |
1472 | int ret; | 1464 | int ret; |
@@ -1552,9 +1544,9 @@ static int rs_move_mimo_to_other(struct iwl_priv *priv, | |||
1552 | * 2) # times calling this function | 1544 | * 2) # times calling this function |
1553 | * 3) elapsed time in this mode (not used, for now) | 1545 | * 3) elapsed time in this mode (not used, for now) |
1554 | */ | 1546 | */ |
1555 | static void rs_stay_in_table(struct iwl4965_lq_sta *lq_sta) | 1547 | static void rs_stay_in_table(struct iwl_lq_sta *lq_sta) |
1556 | { | 1548 | { |
1557 | struct iwl4965_scale_tbl_info *tbl; | 1549 | struct iwl_scale_tbl_info *tbl; |
1558 | int i; | 1550 | int i; |
1559 | int active_tbl; | 1551 | int active_tbl; |
1560 | int flush_interval_passed = 0; | 1552 | int flush_interval_passed = 0; |
@@ -1642,7 +1634,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv, | |||
1642 | int high = IWL_RATE_INVALID; | 1634 | int high = IWL_RATE_INVALID; |
1643 | int index; | 1635 | int index; |
1644 | int i; | 1636 | int i; |
1645 | struct iwl4965_rate_scale_data *window = NULL; | 1637 | struct iwl_rate_scale_data *window = NULL; |
1646 | int current_tpt = IWL_INVALID_VALUE; | 1638 | int current_tpt = IWL_INVALID_VALUE; |
1647 | int low_tpt = IWL_INVALID_VALUE; | 1639 | int low_tpt = IWL_INVALID_VALUE; |
1648 | int high_tpt = IWL_INVALID_VALUE; | 1640 | int high_tpt = IWL_INVALID_VALUE; |
@@ -1651,8 +1643,8 @@ static void rs_rate_scale_perform(struct iwl_priv *priv, | |||
1651 | __le16 fc; | 1643 | __le16 fc; |
1652 | u16 rate_mask; | 1644 | u16 rate_mask; |
1653 | u8 update_lq = 0; | 1645 | u8 update_lq = 0; |
1654 | struct iwl4965_lq_sta *lq_sta; | 1646 | struct iwl_lq_sta *lq_sta; |
1655 | struct iwl4965_scale_tbl_info *tbl, *tbl1; | 1647 | struct iwl_scale_tbl_info *tbl, *tbl1; |
1656 | u16 rate_scale_index_msk = 0; | 1648 | u16 rate_scale_index_msk = 0; |
1657 | u32 rate; | 1649 | u32 rate; |
1658 | u8 is_green = 0; | 1650 | u8 is_green = 0; |
@@ -1675,7 +1667,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv, | |||
1675 | if (!sta || !sta->rate_ctrl_priv) | 1667 | if (!sta || !sta->rate_ctrl_priv) |
1676 | return; | 1668 | return; |
1677 | 1669 | ||
1678 | lq_sta = (struct iwl4965_lq_sta *)sta->rate_ctrl_priv; | 1670 | lq_sta = (struct iwl_lq_sta *)sta->rate_ctrl_priv; |
1679 | 1671 | ||
1680 | tid = rs_tl_add_packet(lq_sta, hdr); | 1672 | tid = rs_tl_add_packet(lq_sta, hdr); |
1681 | 1673 | ||
@@ -2030,8 +2022,8 @@ static void rs_initialize_lq(struct iwl_priv *priv, | |||
2030 | struct ieee80211_conf *conf, | 2022 | struct ieee80211_conf *conf, |
2031 | struct sta_info *sta) | 2023 | struct sta_info *sta) |
2032 | { | 2024 | { |
2033 | struct iwl4965_lq_sta *lq_sta; | 2025 | struct iwl_lq_sta *lq_sta; |
2034 | struct iwl4965_scale_tbl_info *tbl; | 2026 | struct iwl_scale_tbl_info *tbl; |
2035 | int rate_idx; | 2027 | int rate_idx; |
2036 | int i; | 2028 | int i; |
2037 | u32 rate; | 2029 | u32 rate; |
@@ -2042,7 +2034,7 @@ static void rs_initialize_lq(struct iwl_priv *priv, | |||
2042 | if (!sta || !sta->rate_ctrl_priv) | 2034 | if (!sta || !sta->rate_ctrl_priv) |
2043 | goto out; | 2035 | goto out; |
2044 | 2036 | ||
2045 | lq_sta = (struct iwl4965_lq_sta *)sta->rate_ctrl_priv; | 2037 | lq_sta = (struct iwl_lq_sta *)sta->rate_ctrl_priv; |
2046 | i = sta->last_txrate_idx; | 2038 | i = sta->last_txrate_idx; |
2047 | 2039 | ||
2048 | if ((lq_sta->lq.sta_id == 0xff) && | 2040 | if ((lq_sta->lq.sta_id == 0xff) && |
@@ -2096,7 +2088,7 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev, | |||
2096 | struct sta_info *sta; | 2088 | struct sta_info *sta; |
2097 | __le16 fc; | 2089 | __le16 fc; |
2098 | struct iwl_priv *priv = (struct iwl_priv *)priv_rate; | 2090 | struct iwl_priv *priv = (struct iwl_priv *)priv_rate; |
2099 | struct iwl4965_lq_sta *lq_sta; | 2091 | struct iwl_lq_sta *lq_sta; |
2100 | 2092 | ||
2101 | IWL_DEBUG_RATE_LIMIT("rate scale calculate new rate for skb\n"); | 2093 | IWL_DEBUG_RATE_LIMIT("rate scale calculate new rate for skb\n"); |
2102 | 2094 | ||
@@ -2113,7 +2105,7 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev, | |||
2113 | goto out; | 2105 | goto out; |
2114 | } | 2106 | } |
2115 | 2107 | ||
2116 | lq_sta = (struct iwl4965_lq_sta *)sta->rate_ctrl_priv; | 2108 | lq_sta = (struct iwl_lq_sta *)sta->rate_ctrl_priv; |
2117 | i = sta->last_txrate_idx; | 2109 | i = sta->last_txrate_idx; |
2118 | 2110 | ||
2119 | if ((priv->iw_mode == IEEE80211_IF_TYPE_IBSS) && | 2111 | if ((priv->iw_mode == IEEE80211_IF_TYPE_IBSS) && |
@@ -2149,14 +2141,14 @@ out: | |||
2149 | 2141 | ||
2150 | static void *rs_alloc_sta(void *priv_rate, gfp_t gfp) | 2142 | static void *rs_alloc_sta(void *priv_rate, gfp_t gfp) |
2151 | { | 2143 | { |
2152 | struct iwl4965_lq_sta *lq_sta; | 2144 | struct iwl_lq_sta *lq_sta; |
2153 | struct iwl_priv *priv; | 2145 | struct iwl_priv *priv; |
2154 | int i, j; | 2146 | int i, j; |
2155 | 2147 | ||
2156 | priv = (struct iwl_priv *)priv_rate; | 2148 | priv = (struct iwl_priv *)priv_rate; |
2157 | IWL_DEBUG_RATE("create station rate scale window\n"); | 2149 | IWL_DEBUG_RATE("create station rate scale window\n"); |
2158 | 2150 | ||
2159 | lq_sta = kzalloc(sizeof(struct iwl4965_lq_sta), gfp); | 2151 | lq_sta = kzalloc(sizeof(struct iwl_lq_sta), gfp); |
2160 | 2152 | ||
2161 | if (lq_sta == NULL) | 2153 | if (lq_sta == NULL) |
2162 | return NULL; | 2154 | return NULL; |
@@ -2165,7 +2157,7 @@ static void *rs_alloc_sta(void *priv_rate, gfp_t gfp) | |||
2165 | 2157 | ||
2166 | for (j = 0; j < LQ_SIZE; j++) | 2158 | for (j = 0; j < LQ_SIZE; j++) |
2167 | for (i = 0; i < IWL_RATE_COUNT; i++) | 2159 | for (i = 0; i < IWL_RATE_COUNT; i++) |
2168 | rs_rate_scale_clear_window(&(lq_sta->lq_info[j].win[i])); | 2160 | rs_rate_scale_clear_window(&lq_sta->lq_info[j].win[i]); |
2169 | 2161 | ||
2170 | return lq_sta; | 2162 | return lq_sta; |
2171 | } | 2163 | } |
@@ -2178,7 +2170,7 @@ static void rs_rate_init(void *priv_rate, void *priv_sta, | |||
2178 | struct ieee80211_conf *conf = &local->hw.conf; | 2170 | struct ieee80211_conf *conf = &local->hw.conf; |
2179 | struct ieee80211_supported_band *sband; | 2171 | struct ieee80211_supported_band *sband; |
2180 | struct iwl_priv *priv = (struct iwl_priv *)priv_rate; | 2172 | struct iwl_priv *priv = (struct iwl_priv *)priv_rate; |
2181 | struct iwl4965_lq_sta *lq_sta = priv_sta; | 2173 | struct iwl_lq_sta *lq_sta = priv_sta; |
2182 | 2174 | ||
2183 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; | 2175 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; |
2184 | 2176 | ||
@@ -2187,7 +2179,7 @@ static void rs_rate_init(void *priv_rate, void *priv_sta, | |||
2187 | sta->txrate_idx = 3; | 2179 | sta->txrate_idx = 3; |
2188 | for (j = 0; j < LQ_SIZE; j++) | 2180 | for (j = 0; j < LQ_SIZE; j++) |
2189 | for (i = 0; i < IWL_RATE_COUNT; i++) | 2181 | for (i = 0; i < IWL_RATE_COUNT; i++) |
2190 | rs_rate_scale_clear_window(&(lq_sta->lq_info[j].win[i])); | 2182 | rs_rate_scale_clear_window(&lq_sta->lq_info[j].win[i]); |
2191 | 2183 | ||
2192 | IWL_DEBUG_RATE("LQ: *** rate scale global init ***\n"); | 2184 | IWL_DEBUG_RATE("LQ: *** rate scale global init ***\n"); |
2193 | /* TODO: what is a good starting rate for STA? About middle? Maybe not | 2185 | /* TODO: what is a good starting rate for STA? About middle? Maybe not |
@@ -2271,10 +2263,9 @@ static void rs_rate_init(void *priv_rate, void *priv_sta, | |||
2271 | } | 2263 | } |
2272 | 2264 | ||
2273 | static void rs_fill_link_cmd(const struct iwl_priv *priv, | 2265 | static void rs_fill_link_cmd(const struct iwl_priv *priv, |
2274 | struct iwl4965_lq_sta *lq_sta, | 2266 | struct iwl_lq_sta *lq_sta, u32 new_rate) |
2275 | u32 new_rate) | ||
2276 | { | 2267 | { |
2277 | struct iwl4965_scale_tbl_info tbl_type; | 2268 | struct iwl_scale_tbl_info tbl_type; |
2278 | int index = 0; | 2269 | int index = 0; |
2279 | int rate_idx; | 2270 | int rate_idx; |
2280 | int repeat_rate = 0; | 2271 | int repeat_rate = 0; |
@@ -2402,6 +2393,7 @@ static void rs_free(void *priv_rate) | |||
2402 | 2393 | ||
2403 | static void rs_clear(void *priv_rate) | 2394 | static void rs_clear(void *priv_rate) |
2404 | { | 2395 | { |
2396 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
2405 | struct iwl_priv *priv = (struct iwl_priv *) priv_rate; | 2397 | struct iwl_priv *priv = (struct iwl_priv *) priv_rate; |
2406 | 2398 | ||
2407 | IWL_DEBUG_RATE("enter\n"); | 2399 | IWL_DEBUG_RATE("enter\n"); |
@@ -2409,11 +2401,12 @@ static void rs_clear(void *priv_rate) | |||
2409 | /* TODO - add rate scale state reset */ | 2401 | /* TODO - add rate scale state reset */ |
2410 | 2402 | ||
2411 | IWL_DEBUG_RATE("leave\n"); | 2403 | IWL_DEBUG_RATE("leave\n"); |
2404 | #endif /* CONFIG_IWLWIFI_DEBUG */ | ||
2412 | } | 2405 | } |
2413 | 2406 | ||
2414 | static void rs_free_sta(void *priv_rate, void *priv_sta) | 2407 | static void rs_free_sta(void *priv_rate, void *priv_sta) |
2415 | { | 2408 | { |
2416 | struct iwl4965_lq_sta *lq_sta = priv_sta; | 2409 | struct iwl_lq_sta *lq_sta = priv_sta; |
2417 | struct iwl_priv *priv; | 2410 | struct iwl_priv *priv; |
2418 | 2411 | ||
2419 | priv = (struct iwl_priv *)priv_rate; | 2412 | priv = (struct iwl_priv *)priv_rate; |
@@ -2429,8 +2422,8 @@ static int open_file_generic(struct inode *inode, struct file *file) | |||
2429 | file->private_data = inode->i_private; | 2422 | file->private_data = inode->i_private; |
2430 | return 0; | 2423 | return 0; |
2431 | } | 2424 | } |
2432 | static void rs_dbgfs_set_mcs(struct iwl4965_lq_sta *lq_sta, | 2425 | static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta, |
2433 | u32 *rate_n_flags, int index) | 2426 | u32 *rate_n_flags, int index) |
2434 | { | 2427 | { |
2435 | struct iwl_priv *priv; | 2428 | struct iwl_priv *priv; |
2436 | 2429 | ||
@@ -2453,7 +2446,7 @@ static void rs_dbgfs_set_mcs(struct iwl4965_lq_sta *lq_sta, | |||
2453 | static ssize_t rs_sta_dbgfs_scale_table_write(struct file *file, | 2446 | static ssize_t rs_sta_dbgfs_scale_table_write(struct file *file, |
2454 | const char __user *user_buf, size_t count, loff_t *ppos) | 2447 | const char __user *user_buf, size_t count, loff_t *ppos) |
2455 | { | 2448 | { |
2456 | struct iwl4965_lq_sta *lq_sta = file->private_data; | 2449 | struct iwl_lq_sta *lq_sta = file->private_data; |
2457 | struct iwl_priv *priv; | 2450 | struct iwl_priv *priv; |
2458 | char buf[64]; | 2451 | char buf[64]; |
2459 | int buf_size; | 2452 | int buf_size; |
@@ -2493,7 +2486,7 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, | |||
2493 | int desc = 0; | 2486 | int desc = 0; |
2494 | int i = 0; | 2487 | int i = 0; |
2495 | 2488 | ||
2496 | struct iwl4965_lq_sta *lq_sta = file->private_data; | 2489 | struct iwl_lq_sta *lq_sta = file->private_data; |
2497 | 2490 | ||
2498 | desc += sprintf(buff+desc, "sta_id %d\n", lq_sta->lq.sta_id); | 2491 | desc += sprintf(buff+desc, "sta_id %d\n", lq_sta->lq.sta_id); |
2499 | desc += sprintf(buff+desc, "failed=%d success=%d rate=0%X\n", | 2492 | desc += sprintf(buff+desc, "failed=%d success=%d rate=0%X\n", |
@@ -2541,7 +2534,7 @@ static ssize_t rs_sta_dbgfs_stats_table_read(struct file *file, | |||
2541 | int desc = 0; | 2534 | int desc = 0; |
2542 | int i, j; | 2535 | int i, j; |
2543 | 2536 | ||
2544 | struct iwl4965_lq_sta *lq_sta = file->private_data; | 2537 | struct iwl_lq_sta *lq_sta = file->private_data; |
2545 | for (i = 0; i < LQ_SIZE; i++) { | 2538 | for (i = 0; i < LQ_SIZE; i++) { |
2546 | desc += sprintf(buff+desc, "%s type=%d SGI=%d FAT=%d DUP=%d\n" | 2539 | desc += sprintf(buff+desc, "%s type=%d SGI=%d FAT=%d DUP=%d\n" |
2547 | "rate=0x%X\n", | 2540 | "rate=0x%X\n", |
@@ -2570,7 +2563,7 @@ static const struct file_operations rs_sta_dbgfs_stats_table_ops = { | |||
2570 | static void rs_add_debugfs(void *priv, void *priv_sta, | 2563 | static void rs_add_debugfs(void *priv, void *priv_sta, |
2571 | struct dentry *dir) | 2564 | struct dentry *dir) |
2572 | { | 2565 | { |
2573 | struct iwl4965_lq_sta *lq_sta = priv_sta; | 2566 | struct iwl_lq_sta *lq_sta = priv_sta; |
2574 | lq_sta->rs_sta_dbgfs_scale_table_file = | 2567 | lq_sta->rs_sta_dbgfs_scale_table_file = |
2575 | debugfs_create_file("rate_scale_table", 0600, dir, | 2568 | debugfs_create_file("rate_scale_table", 0600, dir, |
2576 | lq_sta, &rs_sta_dbgfs_scale_table_ops); | 2569 | lq_sta, &rs_sta_dbgfs_scale_table_ops); |
@@ -2585,7 +2578,7 @@ static void rs_add_debugfs(void *priv, void *priv_sta, | |||
2585 | 2578 | ||
2586 | static void rs_remove_debugfs(void *priv, void *priv_sta) | 2579 | static void rs_remove_debugfs(void *priv, void *priv_sta) |
2587 | { | 2580 | { |
2588 | struct iwl4965_lq_sta *lq_sta = priv_sta; | 2581 | struct iwl_lq_sta *lq_sta = priv_sta; |
2589 | debugfs_remove(lq_sta->rs_sta_dbgfs_scale_table_file); | 2582 | debugfs_remove(lq_sta->rs_sta_dbgfs_scale_table_file); |
2590 | debugfs_remove(lq_sta->rs_sta_dbgfs_stats_table_file); | 2583 | debugfs_remove(lq_sta->rs_sta_dbgfs_stats_table_file); |
2591 | debugfs_remove(lq_sta->rs_sta_dbgfs_tx_agg_tid_en_file); | 2584 | debugfs_remove(lq_sta->rs_sta_dbgfs_tx_agg_tid_en_file); |
@@ -2609,104 +2602,12 @@ static struct rate_control_ops rs_ops = { | |||
2609 | #endif | 2602 | #endif |
2610 | }; | 2603 | }; |
2611 | 2604 | ||
2612 | int iwl4965_fill_rs_info(struct ieee80211_hw *hw, char *buf, u8 sta_id) | 2605 | int iwlagn_rate_control_register(void) |
2613 | { | ||
2614 | struct ieee80211_local *local = hw_to_local(hw); | ||
2615 | struct iwl_priv *priv = hw->priv; | ||
2616 | struct iwl4965_lq_sta *lq_sta; | ||
2617 | struct sta_info *sta; | ||
2618 | int cnt = 0, i; | ||
2619 | u32 samples = 0, success = 0, good = 0; | ||
2620 | unsigned long now = jiffies; | ||
2621 | u32 max_time = 0; | ||
2622 | u8 lq_type, antenna; | ||
2623 | |||
2624 | rcu_read_lock(); | ||
2625 | |||
2626 | sta = sta_info_get(local, priv->stations[sta_id].sta.sta.addr); | ||
2627 | if (!sta || !sta->rate_ctrl_priv) { | ||
2628 | if (sta) | ||
2629 | IWL_DEBUG_RATE("leave - no private rate data!\n"); | ||
2630 | else | ||
2631 | IWL_DEBUG_RATE("leave - no station!\n"); | ||
2632 | rcu_read_unlock(); | ||
2633 | return sprintf(buf, "station %d not found\n", sta_id); | ||
2634 | } | ||
2635 | |||
2636 | lq_sta = (void *)sta->rate_ctrl_priv; | ||
2637 | |||
2638 | lq_type = lq_sta->lq_info[lq_sta->active_tbl].lq_type; | ||
2639 | antenna = lq_sta->lq_info[lq_sta->active_tbl].ant_type; | ||
2640 | |||
2641 | if (is_legacy(lq_type)) | ||
2642 | i = IWL_RATE_54M_INDEX; | ||
2643 | else | ||
2644 | i = IWL_RATE_60M_INDEX; | ||
2645 | while (1) { | ||
2646 | u64 mask; | ||
2647 | int j; | ||
2648 | int active = lq_sta->active_tbl; | ||
2649 | |||
2650 | cnt += | ||
2651 | sprintf(&buf[cnt], " %2dMbs: ", iwl_rates[i].ieee / 2); | ||
2652 | |||
2653 | mask = (1ULL << (IWL_RATE_MAX_WINDOW - 1)); | ||
2654 | for (j = 0; j < IWL_RATE_MAX_WINDOW; j++, mask >>= 1) | ||
2655 | buf[cnt++] = | ||
2656 | (lq_sta->lq_info[active].win[i].data & mask) | ||
2657 | ? '1' : '0'; | ||
2658 | |||
2659 | samples += lq_sta->lq_info[active].win[i].counter; | ||
2660 | good += lq_sta->lq_info[active].win[i].success_counter; | ||
2661 | success += lq_sta->lq_info[active].win[i].success_counter * | ||
2662 | iwl_rates[i].ieee; | ||
2663 | |||
2664 | if (lq_sta->lq_info[active].win[i].stamp) { | ||
2665 | int delta = | ||
2666 | jiffies_to_msecs(now - | ||
2667 | lq_sta->lq_info[active].win[i].stamp); | ||
2668 | |||
2669 | if (delta > max_time) | ||
2670 | max_time = delta; | ||
2671 | |||
2672 | cnt += sprintf(&buf[cnt], "%5dms\n", delta); | ||
2673 | } else | ||
2674 | buf[cnt++] = '\n'; | ||
2675 | |||
2676 | j = iwl4965_get_prev_ieee_rate(i); | ||
2677 | if (j == i) | ||
2678 | break; | ||
2679 | i = j; | ||
2680 | } | ||
2681 | |||
2682 | /* | ||
2683 | * Display the average rate of all samples taken. | ||
2684 | * NOTE: We multiply # of samples by 2 since the IEEE measurement | ||
2685 | * added from iwl_rates is actually 2X the rate. | ||
2686 | */ | ||
2687 | if (samples) | ||
2688 | cnt += sprintf(&buf[cnt], | ||
2689 | "\nAverage rate is %3d.%02dMbs over last %4dms\n" | ||
2690 | "%3d%% success (%d good packets over %d tries)\n", | ||
2691 | success / (2 * samples), (success * 5 / samples) % 10, | ||
2692 | max_time, good * 100 / samples, good, samples); | ||
2693 | else | ||
2694 | cnt += sprintf(&buf[cnt], "\nAverage rate: 0Mbs\n"); | ||
2695 | |||
2696 | cnt += sprintf(&buf[cnt], "\nrate scale type %d antenna %d " | ||
2697 | "active_search %d rate index %d\n", lq_type, antenna, | ||
2698 | lq_sta->search_better_tbl, sta->last_txrate_idx); | ||
2699 | |||
2700 | rcu_read_unlock(); | ||
2701 | return cnt; | ||
2702 | } | ||
2703 | |||
2704 | int iwl4965_rate_control_register(void) | ||
2705 | { | 2606 | { |
2706 | return ieee80211_rate_control_register(&rs_ops); | 2607 | return ieee80211_rate_control_register(&rs_ops); |
2707 | } | 2608 | } |
2708 | 2609 | ||
2709 | void iwl4965_rate_control_unregister(void) | 2610 | void iwlagn_rate_control_unregister(void) |
2710 | { | 2611 | { |
2711 | ieee80211_rate_control_unregister(&rs_ops); | 2612 | ieee80211_rate_control_unregister(&rs_ops); |
2712 | } | 2613 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-rs.h b/drivers/net/wireless/iwlwifi/iwl-agn-rs.h index 9b9972885aa5..84d4d1e33755 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965-rs.h +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.h | |||
@@ -24,8 +24,8 @@ | |||
24 | * | 24 | * |
25 | *****************************************************************************/ | 25 | *****************************************************************************/ |
26 | 26 | ||
27 | #ifndef __iwl_4965_rs_h__ | 27 | #ifndef __iwl_agn_rs_h__ |
28 | #define __iwl_4965_rs_h__ | 28 | #define __iwl_agn_rs_h__ |
29 | 29 | ||
30 | #include "iwl-dev.h" | 30 | #include "iwl-dev.h" |
31 | 31 | ||
@@ -88,7 +88,7 @@ enum { | |||
88 | #define IWL_RATE_5M_MASK (1 << IWL_RATE_5M_INDEX) | 88 | #define IWL_RATE_5M_MASK (1 << IWL_RATE_5M_INDEX) |
89 | #define IWL_RATE_11M_MASK (1 << IWL_RATE_11M_INDEX) | 89 | #define IWL_RATE_11M_MASK (1 << IWL_RATE_11M_INDEX) |
90 | 90 | ||
91 | /* 4965 uCode API values for legacy bit rates, both OFDM and CCK */ | 91 | /* uCode API values for legacy bit rates, both OFDM and CCK */ |
92 | enum { | 92 | enum { |
93 | IWL_RATE_6M_PLCP = 13, | 93 | IWL_RATE_6M_PLCP = 13, |
94 | IWL_RATE_9M_PLCP = 15, | 94 | IWL_RATE_9M_PLCP = 15, |
@@ -107,7 +107,7 @@ enum { | |||
107 | /*FIXME:RS:add IWL_RATE_LEGACY_INVM_PLCP = 0,*/ | 107 | /*FIXME:RS:add IWL_RATE_LEGACY_INVM_PLCP = 0,*/ |
108 | }; | 108 | }; |
109 | 109 | ||
110 | /* 4965 uCode API values for OFDM high-throughput (HT) bit rates */ | 110 | /* uCode API values for OFDM high-throughput (HT) bit rates */ |
111 | enum { | 111 | enum { |
112 | IWL_RATE_SISO_6M_PLCP = 0, | 112 | IWL_RATE_SISO_6M_PLCP = 0, |
113 | IWL_RATE_SISO_12M_PLCP = 1, | 113 | IWL_RATE_SISO_12M_PLCP = 1, |
@@ -287,15 +287,6 @@ static inline u8 iwl4965_get_prev_ieee_rate(u8 rate_index) | |||
287 | } | 287 | } |
288 | 288 | ||
289 | /** | 289 | /** |
290 | * iwl4965_fill_rs_info - Fill an output text buffer with the rate representation | ||
291 | * | ||
292 | * NOTE: This is provided as a quick mechanism for a user to visualize | ||
293 | * the performance of the rate control algorithm and is not meant to be | ||
294 | * parsed software. | ||
295 | */ | ||
296 | extern int iwl4965_fill_rs_info(struct ieee80211_hw *, char *buf, u8 sta_id); | ||
297 | |||
298 | /** | ||
299 | * iwl4965_rate_control_register - Register the rate control algorithm callbacks | 290 | * iwl4965_rate_control_register - Register the rate control algorithm callbacks |
300 | * | 291 | * |
301 | * Since the rate control algorithm is hardware specific, there is no need | 292 | * Since the rate control algorithm is hardware specific, there is no need |
@@ -305,7 +296,7 @@ extern int iwl4965_fill_rs_info(struct ieee80211_hw *, char *buf, u8 sta_id); | |||
305 | * ieee80211_register_hw | 296 | * ieee80211_register_hw |
306 | * | 297 | * |
307 | */ | 298 | */ |
308 | extern int iwl4965_rate_control_register(void); | 299 | extern int iwlagn_rate_control_register(void); |
309 | 300 | ||
310 | /** | 301 | /** |
311 | * iwl4965_rate_control_unregister - Unregister the rate control callbacks | 302 | * iwl4965_rate_control_unregister - Unregister the rate control callbacks |
@@ -313,6 +304,6 @@ extern int iwl4965_rate_control_register(void); | |||
313 | * This should be called after calling ieee80211_unregister_hw, but before | 304 | * This should be called after calling ieee80211_unregister_hw, but before |
314 | * the driver is unloaded. | 305 | * the driver is unloaded. |
315 | */ | 306 | */ |
316 | extern void iwl4965_rate_control_unregister(void); | 307 | extern void iwlagn_rate_control_unregister(void); |
317 | 308 | ||
318 | #endif | 309 | #endif /* __iwl_agn__rs__ */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 71f5da3fe5c4..b8407d5704a1 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -65,7 +65,7 @@ | |||
65 | * NOTE: DRV_NAME is defined in iwlwifi.h for use by iwl-debug.h and printk | 65 | * NOTE: DRV_NAME is defined in iwlwifi.h for use by iwl-debug.h and printk |
66 | */ | 66 | */ |
67 | 67 | ||
68 | #define DRV_DESCRIPTION "Intel(R) Wireless WiFi Link 4965AGN driver for Linux" | 68 | #define DRV_DESCRIPTION "Intel(R) Wireless WiFi Link AGN driver for Linux" |
69 | 69 | ||
70 | #ifdef CONFIG_IWLWIFI_DEBUG | 70 | #ifdef CONFIG_IWLWIFI_DEBUG |
71 | #define VD "d" | 71 | #define VD "d" |
@@ -73,7 +73,7 @@ | |||
73 | #define VD | 73 | #define VD |
74 | #endif | 74 | #endif |
75 | 75 | ||
76 | #ifdef CONFIG_IWL4965_SPECTRUM_MEASUREMENT | 76 | #ifdef CONFIG_IWLAGN_SPECTRUM_MEASUREMENT |
77 | #define VS "s" | 77 | #define VS "s" |
78 | #else | 78 | #else |
79 | #define VS | 79 | #define VS |
@@ -86,6 +86,7 @@ MODULE_DESCRIPTION(DRV_DESCRIPTION); | |||
86 | MODULE_VERSION(DRV_VERSION); | 86 | MODULE_VERSION(DRV_VERSION); |
87 | MODULE_AUTHOR(DRV_COPYRIGHT); | 87 | MODULE_AUTHOR(DRV_COPYRIGHT); |
88 | MODULE_LICENSE("GPL"); | 88 | MODULE_LICENSE("GPL"); |
89 | MODULE_ALIAS("iwl4965"); | ||
89 | 90 | ||
90 | /*************** STATION TABLE MANAGEMENT **** | 91 | /*************** STATION TABLE MANAGEMENT **** |
91 | * mac80211 should be examined to determine if sta_info is duplicating | 92 | * mac80211 should be examined to determine if sta_info is duplicating |
@@ -444,11 +445,10 @@ static void iwl_free_frame(struct iwl_priv *priv, struct iwl_frame *frame) | |||
444 | list_add(&frame->list, &priv->free_frames); | 445 | list_add(&frame->list, &priv->free_frames); |
445 | } | 446 | } |
446 | 447 | ||
447 | unsigned int iwl4965_fill_beacon_frame(struct iwl_priv *priv, | 448 | static unsigned int iwl_fill_beacon_frame(struct iwl_priv *priv, |
448 | struct ieee80211_hdr *hdr, | 449 | struct ieee80211_hdr *hdr, |
449 | const u8 *dest, int left) | 450 | const u8 *dest, int left) |
450 | { | 451 | { |
451 | |||
452 | if (!iwl_is_associated(priv) || !priv->ibss_beacon || | 452 | if (!iwl_is_associated(priv) || !priv->ibss_beacon || |
453 | ((priv->iw_mode != IEEE80211_IF_TYPE_IBSS) && | 453 | ((priv->iw_mode != IEEE80211_IF_TYPE_IBSS) && |
454 | (priv->iw_mode != IEEE80211_IF_TYPE_AP))) | 454 | (priv->iw_mode != IEEE80211_IF_TYPE_AP))) |
@@ -487,6 +487,38 @@ static u8 iwl4965_rate_get_lowest_plcp(struct iwl_priv *priv) | |||
487 | return IWL_RATE_6M_PLCP; | 487 | return IWL_RATE_6M_PLCP; |
488 | } | 488 | } |
489 | 489 | ||
490 | unsigned int iwl4965_hw_get_beacon_cmd(struct iwl_priv *priv, | ||
491 | struct iwl_frame *frame, u8 rate) | ||
492 | { | ||
493 | struct iwl_tx_beacon_cmd *tx_beacon_cmd; | ||
494 | unsigned int frame_size; | ||
495 | |||
496 | tx_beacon_cmd = &frame->u.beacon; | ||
497 | memset(tx_beacon_cmd, 0, sizeof(*tx_beacon_cmd)); | ||
498 | |||
499 | tx_beacon_cmd->tx.sta_id = priv->hw_params.bcast_sta_id; | ||
500 | tx_beacon_cmd->tx.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; | ||
501 | |||
502 | frame_size = iwl_fill_beacon_frame(priv, tx_beacon_cmd->frame, | ||
503 | iwl_bcast_addr, | ||
504 | sizeof(frame->u) - sizeof(*tx_beacon_cmd)); | ||
505 | |||
506 | BUG_ON(frame_size > MAX_MPDU_SIZE); | ||
507 | tx_beacon_cmd->tx.len = cpu_to_le16((u16)frame_size); | ||
508 | |||
509 | if ((rate == IWL_RATE_1M_PLCP) || (rate >= IWL_RATE_2M_PLCP)) | ||
510 | tx_beacon_cmd->tx.rate_n_flags = | ||
511 | iwl_hw_set_rate_n_flags(rate, RATE_MCS_CCK_MSK); | ||
512 | else | ||
513 | tx_beacon_cmd->tx.rate_n_flags = | ||
514 | iwl_hw_set_rate_n_flags(rate, 0); | ||
515 | |||
516 | tx_beacon_cmd->tx.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK | | ||
517 | TX_CMD_FLG_TSF_MSK | | ||
518 | TX_CMD_FLG_STA_RATE_MSK; | ||
519 | |||
520 | return sizeof(*tx_beacon_cmd) + frame_size; | ||
521 | } | ||
490 | static int iwl4965_send_beacon_cmd(struct iwl_priv *priv) | 522 | static int iwl4965_send_beacon_cmd(struct iwl_priv *priv) |
491 | { | 523 | { |
492 | struct iwl_frame *frame; | 524 | struct iwl_frame *frame; |
@@ -608,7 +640,6 @@ static void iwl_activate_qos(struct iwl_priv *priv, u8 force) | |||
608 | } | 640 | } |
609 | 641 | ||
610 | #define MAX_UCODE_BEACON_INTERVAL 4096 | 642 | #define MAX_UCODE_BEACON_INTERVAL 4096 |
611 | #define INTEL_CONN_LISTEN_INTERVAL __constant_cpu_to_le16(0xA) | ||
612 | 643 | ||
613 | static __le16 iwl4965_adjust_beacon_interval(u16 beacon_val) | 644 | static __le16 iwl4965_adjust_beacon_interval(u16 beacon_val) |
614 | { | 645 | { |
@@ -638,7 +669,7 @@ static void iwl4965_setup_rxon_timing(struct iwl_priv *priv) | |||
638 | priv->rxon_timing.timestamp.dw[0] = | 669 | priv->rxon_timing.timestamp.dw[0] = |
639 | cpu_to_le32(priv->timestamp & 0xFFFFFFFF); | 670 | cpu_to_le32(priv->timestamp & 0xFFFFFFFF); |
640 | 671 | ||
641 | priv->rxon_timing.listen_interval = INTEL_CONN_LISTEN_INTERVAL; | 672 | priv->rxon_timing.listen_interval = cpu_to_le16(conf->listen_interval); |
642 | 673 | ||
643 | tsf = priv->timestamp; | 674 | tsf = priv->timestamp; |
644 | 675 | ||
@@ -853,7 +884,7 @@ static void iwl4965_set_rate(struct iwl_priv *priv) | |||
853 | (IWL_OFDM_BASIC_RATES_MASK >> IWL_FIRST_OFDM_RATE) & 0xFF; | 884 | (IWL_OFDM_BASIC_RATES_MASK >> IWL_FIRST_OFDM_RATE) & 0xFF; |
854 | } | 885 | } |
855 | 886 | ||
856 | #ifdef CONFIG_IWL4965_SPECTRUM_MEASUREMENT | 887 | #ifdef CONFIG_IWLAGN_SPECTRUM_MEASUREMENT |
857 | 888 | ||
858 | #include "iwl-spectrum.h" | 889 | #include "iwl-spectrum.h" |
859 | 890 | ||
@@ -1057,7 +1088,7 @@ static void iwl4965_rx_csa(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb) | |||
1057 | static void iwl4965_rx_spectrum_measure_notif(struct iwl_priv *priv, | 1088 | static void iwl4965_rx_spectrum_measure_notif(struct iwl_priv *priv, |
1058 | struct iwl_rx_mem_buffer *rxb) | 1089 | struct iwl_rx_mem_buffer *rxb) |
1059 | { | 1090 | { |
1060 | #ifdef CONFIG_IWL4965_SPECTRUM_MEASUREMENT | 1091 | #ifdef CONFIG_IWLAGN_SPECTRUM_MEASUREMENT |
1061 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; | 1092 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; |
1062 | struct iwl4965_spectrum_notification *report = &(pkt->u.spectrum_notif); | 1093 | struct iwl4965_spectrum_notification *report = &(pkt->u.spectrum_notif); |
1063 | 1094 | ||
@@ -1231,6 +1262,37 @@ static void iwl4965_rx_card_state_notif(struct iwl_priv *priv, | |||
1231 | wake_up_interruptible(&priv->wait_command_queue); | 1262 | wake_up_interruptible(&priv->wait_command_queue); |
1232 | } | 1263 | } |
1233 | 1264 | ||
1265 | int iwl4965_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src) | ||
1266 | { | ||
1267 | int ret; | ||
1268 | unsigned long flags; | ||
1269 | |||
1270 | spin_lock_irqsave(&priv->lock, flags); | ||
1271 | ret = iwl_grab_nic_access(priv); | ||
1272 | if (ret) | ||
1273 | goto err; | ||
1274 | |||
1275 | if (src == IWL_PWR_SRC_VAUX) { | ||
1276 | u32 val; | ||
1277 | ret = pci_read_config_dword(priv->pci_dev, PCI_POWER_SOURCE, | ||
1278 | &val); | ||
1279 | |||
1280 | if (val & PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT) | ||
1281 | iwl_set_bits_mask_prph(priv, APMG_PS_CTRL_REG, | ||
1282 | APMG_PS_CTRL_VAL_PWR_SRC_VAUX, | ||
1283 | ~APMG_PS_CTRL_MSK_PWR_SRC); | ||
1284 | } else { | ||
1285 | iwl_set_bits_mask_prph(priv, APMG_PS_CTRL_REG, | ||
1286 | APMG_PS_CTRL_VAL_PWR_SRC_VMAIN, | ||
1287 | ~APMG_PS_CTRL_MSK_PWR_SRC); | ||
1288 | } | ||
1289 | |||
1290 | iwl_release_nic_access(priv); | ||
1291 | err: | ||
1292 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1293 | return ret; | ||
1294 | } | ||
1295 | |||
1234 | /** | 1296 | /** |
1235 | * iwl4965_setup_rx_handlers - Initialize Rx handler callbacks | 1297 | * iwl4965_setup_rx_handlers - Initialize Rx handler callbacks |
1236 | * | 1298 | * |
@@ -2170,17 +2232,16 @@ static int __iwl4965_up(struct iwl_priv *priv) | |||
2170 | } | 2232 | } |
2171 | 2233 | ||
2172 | /* If platform's RF_KILL switch is NOT set to KILL */ | 2234 | /* If platform's RF_KILL switch is NOT set to KILL */ |
2173 | if (iwl_read32(priv, CSR_GP_CNTRL) & | 2235 | if (iwl_read32(priv, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW) |
2174 | CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW) | ||
2175 | clear_bit(STATUS_RF_KILL_HW, &priv->status); | 2236 | clear_bit(STATUS_RF_KILL_HW, &priv->status); |
2176 | else | 2237 | else |
2177 | set_bit(STATUS_RF_KILL_HW, &priv->status); | 2238 | set_bit(STATUS_RF_KILL_HW, &priv->status); |
2178 | 2239 | ||
2179 | if (!test_bit(STATUS_IN_SUSPEND, &priv->status) && | 2240 | if (iwl_is_rfkill(priv)) { |
2180 | iwl_is_rfkill(priv)) { | 2241 | iwl4965_enable_interrupts(priv); |
2181 | IWL_WARNING("Radio disabled by %s RF Kill switch\n", | 2242 | IWL_WARNING("Radio disabled by %s RF Kill switch\n", |
2182 | test_bit(STATUS_RF_KILL_HW, &priv->status) ? "HW" : "SW"); | 2243 | test_bit(STATUS_RF_KILL_HW, &priv->status) ? "HW" : "SW"); |
2183 | return -ENODEV; | 2244 | return 0; |
2184 | } | 2245 | } |
2185 | 2246 | ||
2186 | iwl_write32(priv, CSR_INT, 0xFFFFFFFF); | 2247 | iwl_write32(priv, CSR_INT, 0xFFFFFFFF); |
@@ -2216,11 +2277,6 @@ static int __iwl4965_up(struct iwl_priv *priv) | |||
2216 | memcpy(priv->ucode_data_backup.v_addr, priv->ucode_data.v_addr, | 2277 | memcpy(priv->ucode_data_backup.v_addr, priv->ucode_data.v_addr, |
2217 | priv->ucode_data.len); | 2278 | priv->ucode_data.len); |
2218 | 2279 | ||
2219 | /* We return success when we resume from suspend and rf_kill is on. */ | ||
2220 | if (test_bit(STATUS_RF_KILL_HW, &priv->status) || | ||
2221 | test_bit(STATUS_RF_KILL_SW, &priv->status)) | ||
2222 | return 0; | ||
2223 | |||
2224 | for (i = 0; i < MAX_HW_RESTARTS; i++) { | 2280 | for (i = 0; i < MAX_HW_RESTARTS; i++) { |
2225 | 2281 | ||
2226 | iwl_clear_stations_table(priv); | 2282 | iwl_clear_stations_table(priv); |
@@ -2415,7 +2471,7 @@ static void iwl4965_post_associate(struct iwl_priv *priv) | |||
2415 | unsigned long flags; | 2471 | unsigned long flags; |
2416 | 2472 | ||
2417 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) { | 2473 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) { |
2418 | IWL_ERROR("%s Should not be called in AP mode\n", __FUNCTION__); | 2474 | IWL_ERROR("%s Should not be called in AP mode\n", __func__); |
2419 | return; | 2475 | return; |
2420 | } | 2476 | } |
2421 | 2477 | ||
@@ -2491,7 +2547,7 @@ static void iwl4965_post_associate(struct iwl_priv *priv) | |||
2491 | 2547 | ||
2492 | default: | 2548 | default: |
2493 | IWL_ERROR("%s Should not be called in %d mode\n", | 2549 | IWL_ERROR("%s Should not be called in %d mode\n", |
2494 | __FUNCTION__, priv->iw_mode); | 2550 | __func__, priv->iw_mode); |
2495 | break; | 2551 | break; |
2496 | } | 2552 | } |
2497 | 2553 | ||
@@ -2589,6 +2645,9 @@ static int iwl4965_mac_start(struct ieee80211_hw *hw) | |||
2589 | if (ret) | 2645 | if (ret) |
2590 | goto out_release_irq; | 2646 | goto out_release_irq; |
2591 | 2647 | ||
2648 | if (iwl_is_rfkill(priv)) | ||
2649 | goto out; | ||
2650 | |||
2592 | IWL_DEBUG_INFO("Start UP work done.\n"); | 2651 | IWL_DEBUG_INFO("Start UP work done.\n"); |
2593 | 2652 | ||
2594 | if (test_bit(STATUS_IN_SUSPEND, &priv->status)) | 2653 | if (test_bit(STATUS_IN_SUSPEND, &priv->status)) |
@@ -2608,6 +2667,7 @@ static int iwl4965_mac_start(struct ieee80211_hw *hw) | |||
2608 | } | 2667 | } |
2609 | } | 2668 | } |
2610 | 2669 | ||
2670 | out: | ||
2611 | priv->is_open = 1; | 2671 | priv->is_open = 1; |
2612 | IWL_DEBUG_MAC80211("leave\n"); | 2672 | IWL_DEBUG_MAC80211("leave\n"); |
2613 | return 0; | 2673 | return 0; |
@@ -2773,6 +2833,7 @@ static int iwl4965_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *co | |||
2773 | 2833 | ||
2774 | spin_lock_irqsave(&priv->lock, flags); | 2834 | spin_lock_irqsave(&priv->lock, flags); |
2775 | 2835 | ||
2836 | |||
2776 | /* if we are switching from ht to 2.4 clear flags | 2837 | /* if we are switching from ht to 2.4 clear flags |
2777 | * from any ht related info since 2.4 does not | 2838 | * from any ht related info since 2.4 does not |
2778 | * support ht */ | 2839 | * support ht */ |
@@ -3102,6 +3163,7 @@ static void iwl4965_bss_info_changed(struct ieee80211_hw *hw, | |||
3102 | if (bss_conf->assoc) { | 3163 | if (bss_conf->assoc) { |
3103 | priv->assoc_id = bss_conf->aid; | 3164 | priv->assoc_id = bss_conf->aid; |
3104 | priv->beacon_int = bss_conf->beacon_int; | 3165 | priv->beacon_int = bss_conf->beacon_int; |
3166 | priv->power_data.dtim_period = bss_conf->dtim_period; | ||
3105 | priv->timestamp = bss_conf->timestamp; | 3167 | priv->timestamp = bss_conf->timestamp; |
3106 | priv->assoc_capability = bss_conf->assoc_capability; | 3168 | priv->assoc_capability = bss_conf->assoc_capability; |
3107 | priv->next_scan_jiffies = jiffies + | 3169 | priv->next_scan_jiffies = jiffies + |
@@ -3345,6 +3407,39 @@ static int iwl4965_mac_conf_tx(struct ieee80211_hw *hw, u16 queue, | |||
3345 | return 0; | 3407 | return 0; |
3346 | } | 3408 | } |
3347 | 3409 | ||
3410 | static int iwl4965_mac_ampdu_action(struct ieee80211_hw *hw, | ||
3411 | enum ieee80211_ampdu_mlme_action action, | ||
3412 | const u8 *addr, u16 tid, u16 *ssn) | ||
3413 | { | ||
3414 | struct iwl_priv *priv = hw->priv; | ||
3415 | DECLARE_MAC_BUF(mac); | ||
3416 | |||
3417 | IWL_DEBUG_HT("A-MPDU action on addr %s tid %d\n", | ||
3418 | print_mac(mac, addr), tid); | ||
3419 | |||
3420 | if (!(priv->cfg->sku & IWL_SKU_N)) | ||
3421 | return -EACCES; | ||
3422 | |||
3423 | switch (action) { | ||
3424 | case IEEE80211_AMPDU_RX_START: | ||
3425 | IWL_DEBUG_HT("start Rx\n"); | ||
3426 | return iwl_rx_agg_start(priv, addr, tid, *ssn); | ||
3427 | case IEEE80211_AMPDU_RX_STOP: | ||
3428 | IWL_DEBUG_HT("stop Rx\n"); | ||
3429 | return iwl_rx_agg_stop(priv, addr, tid); | ||
3430 | case IEEE80211_AMPDU_TX_START: | ||
3431 | IWL_DEBUG_HT("start Tx\n"); | ||
3432 | return iwl_tx_agg_start(priv, addr, tid, ssn); | ||
3433 | case IEEE80211_AMPDU_TX_STOP: | ||
3434 | IWL_DEBUG_HT("stop Tx\n"); | ||
3435 | return iwl_tx_agg_stop(priv, addr, tid); | ||
3436 | default: | ||
3437 | IWL_DEBUG_HT("unknown\n"); | ||
3438 | return -EINVAL; | ||
3439 | break; | ||
3440 | } | ||
3441 | return 0; | ||
3442 | } | ||
3348 | static int iwl4965_mac_get_tx_stats(struct ieee80211_hw *hw, | 3443 | static int iwl4965_mac_get_tx_stats(struct ieee80211_hw *hw, |
3349 | struct ieee80211_tx_queue_stats *stats) | 3444 | struct ieee80211_tx_queue_stats *stats) |
3350 | { | 3445 | { |
@@ -3592,15 +3687,6 @@ static ssize_t show_temperature(struct device *d, | |||
3592 | 3687 | ||
3593 | static DEVICE_ATTR(temperature, S_IRUGO, show_temperature, NULL); | 3688 | static DEVICE_ATTR(temperature, S_IRUGO, show_temperature, NULL); |
3594 | 3689 | ||
3595 | static ssize_t show_rs_window(struct device *d, | ||
3596 | struct device_attribute *attr, | ||
3597 | char *buf) | ||
3598 | { | ||
3599 | struct iwl_priv *priv = d->driver_data; | ||
3600 | return iwl4965_fill_rs_info(priv->hw, buf, IWL_AP_ID); | ||
3601 | } | ||
3602 | static DEVICE_ATTR(rs_window, S_IRUGO, show_rs_window, NULL); | ||
3603 | |||
3604 | static ssize_t show_tx_power(struct device *d, | 3690 | static ssize_t show_tx_power(struct device *d, |
3605 | struct device_attribute *attr, char *buf) | 3691 | struct device_attribute *attr, char *buf) |
3606 | { | 3692 | { |
@@ -3699,7 +3785,7 @@ static ssize_t store_filter_flags(struct device *d, | |||
3699 | static DEVICE_ATTR(filter_flags, S_IWUSR | S_IRUGO, show_filter_flags, | 3785 | static DEVICE_ATTR(filter_flags, S_IWUSR | S_IRUGO, show_filter_flags, |
3700 | store_filter_flags); | 3786 | store_filter_flags); |
3701 | 3787 | ||
3702 | #ifdef CONFIG_IWL4965_SPECTRUM_MEASUREMENT | 3788 | #ifdef CONFIG_IWLAGN_SPECTRUM_MEASUREMENT |
3703 | 3789 | ||
3704 | static ssize_t show_measurement(struct device *d, | 3790 | static ssize_t show_measurement(struct device *d, |
3705 | struct device_attribute *attr, char *buf) | 3791 | struct device_attribute *attr, char *buf) |
@@ -3707,7 +3793,7 @@ static ssize_t show_measurement(struct device *d, | |||
3707 | struct iwl_priv *priv = dev_get_drvdata(d); | 3793 | struct iwl_priv *priv = dev_get_drvdata(d); |
3708 | struct iwl4965_spectrum_notification measure_report; | 3794 | struct iwl4965_spectrum_notification measure_report; |
3709 | u32 size = sizeof(measure_report), len = 0, ofs = 0; | 3795 | u32 size = sizeof(measure_report), len = 0, ofs = 0; |
3710 | u8 *data = (u8 *) & measure_report; | 3796 | u8 *data = (u8 *)&measure_report; |
3711 | unsigned long flags; | 3797 | unsigned long flags; |
3712 | 3798 | ||
3713 | spin_lock_irqsave(&priv->lock, flags); | 3799 | spin_lock_irqsave(&priv->lock, flags); |
@@ -3770,7 +3856,7 @@ static ssize_t store_measurement(struct device *d, | |||
3770 | 3856 | ||
3771 | static DEVICE_ATTR(measurement, S_IRUSR | S_IWUSR, | 3857 | static DEVICE_ATTR(measurement, S_IRUSR | S_IWUSR, |
3772 | show_measurement, store_measurement); | 3858 | show_measurement, store_measurement); |
3773 | #endif /* CONFIG_IWL4965_SPECTRUM_MEASUREMENT */ | 3859 | #endif /* CONFIG_IWLAGN_SPECTRUM_MEASUREMENT */ |
3774 | 3860 | ||
3775 | static ssize_t store_retry_rate(struct device *d, | 3861 | static ssize_t store_retry_rate(struct device *d, |
3776 | struct device_attribute *attr, | 3862 | struct device_attribute *attr, |
@@ -3800,77 +3886,54 @@ static ssize_t store_power_level(struct device *d, | |||
3800 | const char *buf, size_t count) | 3886 | const char *buf, size_t count) |
3801 | { | 3887 | { |
3802 | struct iwl_priv *priv = dev_get_drvdata(d); | 3888 | struct iwl_priv *priv = dev_get_drvdata(d); |
3803 | int rc; | 3889 | int ret; |
3804 | int mode; | 3890 | int mode; |
3805 | 3891 | ||
3806 | mode = simple_strtoul(buf, NULL, 0); | 3892 | mode = simple_strtoul(buf, NULL, 0); |
3807 | mutex_lock(&priv->mutex); | 3893 | mutex_lock(&priv->mutex); |
3808 | 3894 | ||
3809 | if (!iwl_is_ready(priv)) { | 3895 | if (!iwl_is_ready(priv)) { |
3810 | rc = -EAGAIN; | 3896 | ret = -EAGAIN; |
3811 | goto out; | 3897 | goto out; |
3812 | } | 3898 | } |
3813 | 3899 | ||
3814 | rc = iwl_power_set_user_mode(priv, mode); | 3900 | ret = iwl_power_set_user_mode(priv, mode); |
3815 | if (rc) { | 3901 | if (ret) { |
3816 | IWL_DEBUG_MAC80211("failed setting power mode.\n"); | 3902 | IWL_DEBUG_MAC80211("failed setting power mode.\n"); |
3817 | goto out; | 3903 | goto out; |
3818 | } | 3904 | } |
3819 | rc = count; | 3905 | ret = count; |
3820 | 3906 | ||
3821 | out: | 3907 | out: |
3822 | mutex_unlock(&priv->mutex); | 3908 | mutex_unlock(&priv->mutex); |
3823 | return rc; | 3909 | return ret; |
3824 | } | 3910 | } |
3825 | 3911 | ||
3826 | #define MAX_WX_STRING 80 | ||
3827 | |||
3828 | /* Values are in microsecond */ | ||
3829 | static const s32 timeout_duration[] = { | ||
3830 | 350000, | ||
3831 | 250000, | ||
3832 | 75000, | ||
3833 | 37000, | ||
3834 | 25000, | ||
3835 | }; | ||
3836 | static const s32 period_duration[] = { | ||
3837 | 400000, | ||
3838 | 700000, | ||
3839 | 1000000, | ||
3840 | 1000000, | ||
3841 | 1000000 | ||
3842 | }; | ||
3843 | |||
3844 | static ssize_t show_power_level(struct device *d, | 3912 | static ssize_t show_power_level(struct device *d, |
3845 | struct device_attribute *attr, char *buf) | 3913 | struct device_attribute *attr, char *buf) |
3846 | { | 3914 | { |
3847 | struct iwl_priv *priv = dev_get_drvdata(d); | 3915 | struct iwl_priv *priv = dev_get_drvdata(d); |
3916 | int mode = priv->power_data.user_power_setting; | ||
3917 | int system = priv->power_data.system_power_setting; | ||
3848 | int level = priv->power_data.power_mode; | 3918 | int level = priv->power_data.power_mode; |
3849 | char *p = buf; | 3919 | char *p = buf; |
3850 | 3920 | ||
3851 | p += sprintf(p, "%d ", level); | 3921 | switch (system) { |
3852 | switch (level) { | 3922 | case IWL_POWER_SYS_AUTO: |
3853 | case IWL_POWER_MODE_CAM: | 3923 | p += sprintf(p, "SYSTEM:auto"); |
3854 | case IWL_POWER_AC: | ||
3855 | p += sprintf(p, "(AC)"); | ||
3856 | break; | 3924 | break; |
3857 | case IWL_POWER_BATTERY: | 3925 | case IWL_POWER_SYS_AC: |
3858 | p += sprintf(p, "(BATTERY)"); | 3926 | p += sprintf(p, "SYSTEM:ac"); |
3927 | break; | ||
3928 | case IWL_POWER_SYS_BATTERY: | ||
3929 | p += sprintf(p, "SYSTEM:battery"); | ||
3859 | break; | 3930 | break; |
3860 | default: | ||
3861 | p += sprintf(p, | ||
3862 | "(Timeout %dms, Period %dms)", | ||
3863 | timeout_duration[level - 1] / 1000, | ||
3864 | period_duration[level - 1] / 1000); | ||
3865 | } | 3931 | } |
3866 | /* | 3932 | |
3867 | if (!(priv->power_mode & IWL_POWER_ENABLED)) | 3933 | p += sprintf(p, "\tMODE:%s", (mode < IWL_POWER_AUTO)?"fixed":"auto"); |
3868 | p += sprintf(p, " OFF\n"); | 3934 | p += sprintf(p, "\tINDEX:%d", level); |
3869 | else | 3935 | p += sprintf(p, "\n"); |
3870 | p += sprintf(p, " \n"); | 3936 | return p - buf + 1; |
3871 | */ | ||
3872 | p += sprintf(p, " \n"); | ||
3873 | return (p - buf + 1); | ||
3874 | } | 3937 | } |
3875 | 3938 | ||
3876 | static DEVICE_ATTR(power_level, S_IWUSR | S_IRUSR, show_power_level, | 3939 | static DEVICE_ATTR(power_level, S_IWUSR | S_IRUSR, show_power_level, |
@@ -3945,7 +4008,7 @@ static ssize_t show_statistics(struct device *d, | |||
3945 | struct iwl_priv *priv = dev_get_drvdata(d); | 4008 | struct iwl_priv *priv = dev_get_drvdata(d); |
3946 | u32 size = sizeof(struct iwl_notif_statistics); | 4009 | u32 size = sizeof(struct iwl_notif_statistics); |
3947 | u32 len = 0, ofs = 0; | 4010 | u32 len = 0, ofs = 0; |
3948 | u8 *data = (u8 *) & priv->statistics; | 4011 | u8 *data = (u8 *)&priv->statistics; |
3949 | int rc = 0; | 4012 | int rc = 0; |
3950 | 4013 | ||
3951 | if (!iwl_is_alive(priv)) | 4014 | if (!iwl_is_alive(priv)) |
@@ -4041,12 +4104,11 @@ static struct attribute *iwl4965_sysfs_entries[] = { | |||
4041 | &dev_attr_channels.attr, | 4104 | &dev_attr_channels.attr, |
4042 | &dev_attr_flags.attr, | 4105 | &dev_attr_flags.attr, |
4043 | &dev_attr_filter_flags.attr, | 4106 | &dev_attr_filter_flags.attr, |
4044 | #ifdef CONFIG_IWL4965_SPECTRUM_MEASUREMENT | 4107 | #ifdef CONFIG_IWLAGN_SPECTRUM_MEASUREMENT |
4045 | &dev_attr_measurement.attr, | 4108 | &dev_attr_measurement.attr, |
4046 | #endif | 4109 | #endif |
4047 | &dev_attr_power_level.attr, | 4110 | &dev_attr_power_level.attr, |
4048 | &dev_attr_retry_rate.attr, | 4111 | &dev_attr_retry_rate.attr, |
4049 | &dev_attr_rs_window.attr, | ||
4050 | &dev_attr_statistics.attr, | 4112 | &dev_attr_statistics.attr, |
4051 | &dev_attr_status.attr, | 4113 | &dev_attr_status.attr, |
4052 | &dev_attr_temperature.attr, | 4114 | &dev_attr_temperature.attr, |
@@ -4394,8 +4456,10 @@ static int iwl4965_pci_resume(struct pci_dev *pdev) | |||
4394 | 4456 | ||
4395 | /* Hardware specific file defines the PCI IDs table for that hardware module */ | 4457 | /* Hardware specific file defines the PCI IDs table for that hardware module */ |
4396 | static struct pci_device_id iwl_hw_card_ids[] = { | 4458 | static struct pci_device_id iwl_hw_card_ids[] = { |
4459 | #ifdef CONFIG_IWL4965 | ||
4397 | {IWL_PCI_DEVICE(0x4229, PCI_ANY_ID, iwl4965_agn_cfg)}, | 4460 | {IWL_PCI_DEVICE(0x4229, PCI_ANY_ID, iwl4965_agn_cfg)}, |
4398 | {IWL_PCI_DEVICE(0x4230, PCI_ANY_ID, iwl4965_agn_cfg)}, | 4461 | {IWL_PCI_DEVICE(0x4230, PCI_ANY_ID, iwl4965_agn_cfg)}, |
4462 | #endif /* CONFIG_IWL4965 */ | ||
4399 | #ifdef CONFIG_IWL5000 | 4463 | #ifdef CONFIG_IWL5000 |
4400 | {IWL_PCI_DEVICE(0x4232, 0x1205, iwl5100_bg_cfg)}, | 4464 | {IWL_PCI_DEVICE(0x4232, 0x1205, iwl5100_bg_cfg)}, |
4401 | {IWL_PCI_DEVICE(0x4232, 0x1305, iwl5100_bg_cfg)}, | 4465 | {IWL_PCI_DEVICE(0x4232, 0x1305, iwl5100_bg_cfg)}, |
@@ -4431,7 +4495,7 @@ static int __init iwl4965_init(void) | |||
4431 | printk(KERN_INFO DRV_NAME ": " DRV_DESCRIPTION ", " DRV_VERSION "\n"); | 4495 | printk(KERN_INFO DRV_NAME ": " DRV_DESCRIPTION ", " DRV_VERSION "\n"); |
4432 | printk(KERN_INFO DRV_NAME ": " DRV_COPYRIGHT "\n"); | 4496 | printk(KERN_INFO DRV_NAME ": " DRV_COPYRIGHT "\n"); |
4433 | 4497 | ||
4434 | ret = iwl4965_rate_control_register(); | 4498 | ret = iwlagn_rate_control_register(); |
4435 | if (ret) { | 4499 | if (ret) { |
4436 | IWL_ERROR("Unable to register rate control algorithm: %d\n", ret); | 4500 | IWL_ERROR("Unable to register rate control algorithm: %d\n", ret); |
4437 | return ret; | 4501 | return ret; |
@@ -4446,14 +4510,14 @@ static int __init iwl4965_init(void) | |||
4446 | return ret; | 4510 | return ret; |
4447 | 4511 | ||
4448 | error_register: | 4512 | error_register: |
4449 | iwl4965_rate_control_unregister(); | 4513 | iwlagn_rate_control_unregister(); |
4450 | return ret; | 4514 | return ret; |
4451 | } | 4515 | } |
4452 | 4516 | ||
4453 | static void __exit iwl4965_exit(void) | 4517 | static void __exit iwl4965_exit(void) |
4454 | { | 4518 | { |
4455 | pci_unregister_driver(&iwl_driver); | 4519 | pci_unregister_driver(&iwl_driver); |
4456 | iwl4965_rate_control_unregister(); | 4520 | iwlagn_rate_control_unregister(); |
4457 | } | 4521 | } |
4458 | 4522 | ||
4459 | module_exit(iwl4965_exit); | 4523 | module_exit(iwl4965_exit); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h index e9bb1de0ce3f..28b5b09996ed 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h | |||
@@ -666,8 +666,7 @@ struct iwl4965_rxon_assoc_cmd { | |||
666 | __le16 reserved; | 666 | __le16 reserved; |
667 | } __attribute__ ((packed)); | 667 | } __attribute__ ((packed)); |
668 | 668 | ||
669 | 669 | #define IWL_CONN_MAX_LISTEN_INTERVAL 10 | |
670 | |||
671 | 670 | ||
672 | /* | 671 | /* |
673 | * REPLY_RXON_TIMING = 0x14 (command, has simple generic response) | 672 | * REPLY_RXON_TIMING = 0x14 (command, has simple generic response) |
@@ -1076,10 +1075,12 @@ struct iwl4965_rx_frame { | |||
1076 | } __attribute__ ((packed)); | 1075 | } __attribute__ ((packed)); |
1077 | 1076 | ||
1078 | /* Fixed (non-configurable) rx data from phy */ | 1077 | /* Fixed (non-configurable) rx data from phy */ |
1079 | #define RX_PHY_FLAGS_ANTENNAE_OFFSET (4) | 1078 | |
1080 | #define RX_PHY_FLAGS_ANTENNAE_MASK (0x70) | 1079 | #define IWL49_RX_RES_PHY_CNT 14 |
1081 | #define IWL_AGC_DB_MASK (0x3f80) /* MASK(7,13) */ | 1080 | #define IWL49_RX_PHY_FLAGS_ANTENNAE_OFFSET (4) |
1082 | #define IWL_AGC_DB_POS (7) | 1081 | #define IWL49_RX_PHY_FLAGS_ANTENNAE_MASK (0x70) |
1082 | #define IWL49_AGC_DB_MASK (0x3f80) /* MASK(7,13) */ | ||
1083 | #define IWL49_AGC_DB_POS (7) | ||
1083 | struct iwl4965_rx_non_cfg_phy { | 1084 | struct iwl4965_rx_non_cfg_phy { |
1084 | __le16 ant_selection; /* ant A bit 4, ant B bit 5, ant C bit 6 */ | 1085 | __le16 ant_selection; /* ant A bit 4, ant B bit 5, ant C bit 6 */ |
1085 | __le16 agc_info; /* agc code 0:6, agc dB 7:13, reserved 14:15 */ | 1086 | __le16 agc_info; /* agc code 0:6, agc dB 7:13, reserved 14:15 */ |
@@ -1087,12 +1088,30 @@ struct iwl4965_rx_non_cfg_phy { | |||
1087 | u8 pad[0]; | 1088 | u8 pad[0]; |
1088 | } __attribute__ ((packed)); | 1089 | } __attribute__ ((packed)); |
1089 | 1090 | ||
1091 | |||
1092 | #define IWL50_RX_RES_PHY_CNT 8 | ||
1093 | #define IWL50_RX_RES_AGC_IDX 1 | ||
1094 | #define IWL50_RX_RES_RSSI_AB_IDX 2 | ||
1095 | #define IWL50_RX_RES_RSSI_C_IDX 3 | ||
1096 | #define IWL50_OFDM_AGC_MSK 0xfe00 | ||
1097 | #define IWL50_OFDM_AGC_BIT_POS 9 | ||
1098 | #define IWL50_OFDM_RSSI_A_MSK 0x00ff | ||
1099 | #define IWL50_OFDM_RSSI_A_BIT_POS 0 | ||
1100 | #define IWL50_OFDM_RSSI_B_MSK 0xff0000 | ||
1101 | #define IWL50_OFDM_RSSI_B_BIT_POS 16 | ||
1102 | #define IWL50_OFDM_RSSI_C_MSK 0x00ff | ||
1103 | #define IWL50_OFDM_RSSI_C_BIT_POS 0 | ||
1104 | |||
1105 | struct iwl5000_non_cfg_phy { | ||
1106 | __le32 non_cfg_phy[IWL50_RX_RES_PHY_CNT]; /* upto 8 phy entries */ | ||
1107 | } __attribute__ ((packed)); | ||
1108 | |||
1109 | |||
1090 | /* | 1110 | /* |
1091 | * REPLY_RX = 0xc3 (response only, not a command) | 1111 | * REPLY_RX = 0xc3 (response only, not a command) |
1092 | * Used only for legacy (non 11n) frames. | 1112 | * Used only for legacy (non 11n) frames. |
1093 | */ | 1113 | */ |
1094 | #define RX_RES_PHY_CNT 14 | 1114 | struct iwl_rx_phy_res { |
1095 | struct iwl4965_rx_phy_res { | ||
1096 | u8 non_cfg_phy_cnt; /* non configurable DSP phy data byte count */ | 1115 | u8 non_cfg_phy_cnt; /* non configurable DSP phy data byte count */ |
1097 | u8 cfg_phy_cnt; /* configurable DSP phy data byte count */ | 1116 | u8 cfg_phy_cnt; /* configurable DSP phy data byte count */ |
1098 | u8 stat_id; /* configurable DSP phy data set ID */ | 1117 | u8 stat_id; /* configurable DSP phy data set ID */ |
@@ -1101,8 +1120,7 @@ struct iwl4965_rx_phy_res { | |||
1101 | __le32 beacon_time_stamp; /* beacon at on-air rise */ | 1120 | __le32 beacon_time_stamp; /* beacon at on-air rise */ |
1102 | __le16 phy_flags; /* general phy flags: band, modulation, ... */ | 1121 | __le16 phy_flags; /* general phy flags: band, modulation, ... */ |
1103 | __le16 channel; /* channel number */ | 1122 | __le16 channel; /* channel number */ |
1104 | __le16 non_cfg_phy[RX_RES_PHY_CNT]; /* upto 14 phy entries */ | 1123 | u8 non_cfg_phy_buf[32]; /* for various implementations of non_cfg_phy */ |
1105 | __le32 reserved2; | ||
1106 | __le32 rate_n_flags; /* RATE_MCS_* */ | 1124 | __le32 rate_n_flags; /* RATE_MCS_* */ |
1107 | __le16 byte_count; /* frame's byte-count */ | 1125 | __le16 byte_count; /* frame's byte-count */ |
1108 | __le16 reserved3; | 1126 | __le16 reserved3; |
@@ -1993,7 +2011,7 @@ struct iwl4965_spectrum_notification { | |||
1993 | *****************************************************************************/ | 2011 | *****************************************************************************/ |
1994 | 2012 | ||
1995 | /** | 2013 | /** |
1996 | * struct iwl4965_powertable_cmd - Power Table Command | 2014 | * struct iwl_powertable_cmd - Power Table Command |
1997 | * @flags: See below: | 2015 | * @flags: See below: |
1998 | * | 2016 | * |
1999 | * POWER_TABLE_CMD = 0x77 (command, has simple generic response) | 2017 | * POWER_TABLE_CMD = 0x77 (command, has simple generic response) |
@@ -2027,7 +2045,7 @@ struct iwl4965_spectrum_notification { | |||
2027 | #define IWL_POWER_PCI_PM_MSK __constant_cpu_to_le16(1 << 3) | 2045 | #define IWL_POWER_PCI_PM_MSK __constant_cpu_to_le16(1 << 3) |
2028 | #define IWL_POWER_FAST_PD __constant_cpu_to_le16(1 << 4) | 2046 | #define IWL_POWER_FAST_PD __constant_cpu_to_le16(1 << 4) |
2029 | 2047 | ||
2030 | struct iwl4965_powertable_cmd { | 2048 | struct iwl_powertable_cmd { |
2031 | __le16 flags; | 2049 | __le16 flags; |
2032 | u8 keep_alive_seconds; | 2050 | u8 keep_alive_seconds; |
2033 | u8 debug_flags; | 2051 | u8 debug_flags; |
@@ -2324,7 +2342,7 @@ struct iwl4965_beacon_notif { | |||
2324 | /* | 2342 | /* |
2325 | * REPLY_TX_BEACON = 0x91 (command, has simple generic response) | 2343 | * REPLY_TX_BEACON = 0x91 (command, has simple generic response) |
2326 | */ | 2344 | */ |
2327 | struct iwl4965_tx_beacon_cmd { | 2345 | struct iwl_tx_beacon_cmd { |
2328 | struct iwl_tx_cmd tx; | 2346 | struct iwl_tx_cmd tx; |
2329 | __le16 tim_idx; | 2347 | __le16 tim_idx; |
2330 | u8 tim_size; | 2348 | u8 tim_size; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index e3427c205ccf..9bd61809129f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -383,8 +383,8 @@ void iwl_reset_qos(struct iwl_priv *priv) | |||
383 | } | 383 | } |
384 | EXPORT_SYMBOL(iwl_reset_qos); | 384 | EXPORT_SYMBOL(iwl_reset_qos); |
385 | 385 | ||
386 | #define MAX_BIT_RATE_40_MHZ 0x96; /* 150 Mbps */ | 386 | #define MAX_BIT_RATE_40_MHZ 0x96 /* 150 Mbps */ |
387 | #define MAX_BIT_RATE_20_MHZ 0x48; /* 72 Mbps */ | 387 | #define MAX_BIT_RATE_20_MHZ 0x48 /* 72 Mbps */ |
388 | static void iwlcore_init_ht_hw_capab(const struct iwl_priv *priv, | 388 | static void iwlcore_init_ht_hw_capab(const struct iwl_priv *priv, |
389 | struct ieee80211_ht_info *ht_info, | 389 | struct ieee80211_ht_info *ht_info, |
390 | enum ieee80211_band band) | 390 | enum ieee80211_band band) |
@@ -815,7 +815,7 @@ int iwl_setup_mac(struct iwl_priv *priv) | |||
815 | { | 815 | { |
816 | int ret; | 816 | int ret; |
817 | struct ieee80211_hw *hw = priv->hw; | 817 | struct ieee80211_hw *hw = priv->hw; |
818 | hw->rate_control_algorithm = "iwl-4965-rs"; | 818 | hw->rate_control_algorithm = "iwl-agn-rs"; |
819 | 819 | ||
820 | /* Tell mac80211 our characteristics */ | 820 | /* Tell mac80211 our characteristics */ |
821 | hw->flags = IEEE80211_HW_SIGNAL_DBM | | 821 | hw->flags = IEEE80211_HW_SIGNAL_DBM | |
@@ -827,6 +827,7 @@ int iwl_setup_mac(struct iwl_priv *priv) | |||
827 | hw->ampdu_queues = priv->cfg->mod_params->num_of_ampdu_queues; | 827 | hw->ampdu_queues = priv->cfg->mod_params->num_of_ampdu_queues; |
828 | 828 | ||
829 | hw->conf.beacon_int = 100; | 829 | hw->conf.beacon_int = 100; |
830 | hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL; | ||
830 | 831 | ||
831 | if (priv->bands[IEEE80211_BAND_2GHZ].n_channels) | 832 | if (priv->bands[IEEE80211_BAND_2GHZ].n_channels) |
832 | priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = | 833 | priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index db66114f1e56..64f139e97444 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
@@ -95,6 +95,8 @@ struct iwl_hcmd_utils_ops { | |||
95 | void (*chain_noise_reset)(struct iwl_priv *priv); | 95 | void (*chain_noise_reset)(struct iwl_priv *priv); |
96 | void (*rts_tx_cmd_flag)(struct ieee80211_tx_info *info, | 96 | void (*rts_tx_cmd_flag)(struct ieee80211_tx_info *info, |
97 | __le32 *tx_flags); | 97 | __le32 *tx_flags); |
98 | int (*calc_rssi)(struct iwl_priv *priv, | ||
99 | struct iwl_rx_phy_res *rx_resp); | ||
98 | }; | 100 | }; |
99 | 101 | ||
100 | struct iwl_lib_ops { | 102 | struct iwl_lib_ops { |
@@ -139,7 +141,6 @@ struct iwl_lib_ops { | |||
139 | int (*set_pwr_src)(struct iwl_priv *priv, enum iwl_pwr_src src); | 141 | int (*set_pwr_src)(struct iwl_priv *priv, enum iwl_pwr_src src); |
140 | } apm_ops; | 142 | } apm_ops; |
141 | /* power */ | 143 | /* power */ |
142 | int (*set_power)(struct iwl_priv *priv, void *cmd); | ||
143 | int (*send_tx_power) (struct iwl_priv *priv); | 144 | int (*send_tx_power) (struct iwl_priv *priv); |
144 | void (*update_chain_flags)(struct iwl_priv *priv); | 145 | void (*update_chain_flags)(struct iwl_priv *priv); |
145 | void (*temperature) (struct iwl_priv *priv); | 146 | void (*temperature) (struct iwl_priv *priv); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-csr.h b/drivers/net/wireless/iwlwifi/iwl-csr.h index 545ed692d889..52629fbd835a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-csr.h +++ b/drivers/net/wireless/iwlwifi/iwl-csr.h | |||
@@ -104,6 +104,7 @@ | |||
104 | * 3-2: 0 = A, 1 = B, 2 = C, 3 = D step | 104 | * 3-2: 0 = A, 1 = B, 2 = C, 3 = D step |
105 | */ | 105 | */ |
106 | #define CSR_HW_REV_WA_REG (CSR_BASE+0x22C) | 106 | #define CSR_HW_REV_WA_REG (CSR_BASE+0x22C) |
107 | #define CSR_DBG_HPET_MEM_REG (CSR_BASE+0x240) | ||
107 | 108 | ||
108 | /* Bits for CSR_HW_IF_CONFIG_REG */ | 109 | /* Bits for CSR_HW_IF_CONFIG_REG */ |
109 | #define CSR49_HW_IF_CONFIG_REG_BIT_4965_R (0x00000010) | 110 | #define CSR49_HW_IF_CONFIG_REG_BIT_4965_R (0x00000010) |
@@ -118,7 +119,12 @@ | |||
118 | #define CSR39_HW_IF_CONFIG_REG_BITS_SILICON_TYPE_A (0x00000000) | 119 | #define CSR39_HW_IF_CONFIG_REG_BITS_SILICON_TYPE_A (0x00000000) |
119 | #define CSR39_HW_IF_CONFIG_REG_BITS_SILICON_TYPE_B (0x00001000) | 120 | #define CSR39_HW_IF_CONFIG_REG_BITS_SILICON_TYPE_B (0x00001000) |
120 | 121 | ||
121 | #define CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM (0x00200000) | 122 | #define CSR_HW_IF_CONFIG_REG_BIT_HAP_WAKE_L1A (0x00080000) |
123 | #define CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM (0x00200000) | ||
124 | #define CSR_HW_IF_CONFIG_REG_BIT_PCI_OWN_SEM (0x00400000) | ||
125 | #define CSR_HW_IF_CONFIG_REG_BIT_ME_OWN (0x02000000) | ||
126 | #define CSR_HW_IF_CONFIG_REG_BIT_WAKE_ME (0x08000000) | ||
127 | |||
122 | 128 | ||
123 | /* interrupt flags in INTA, set by uCode or hardware (e.g. dma), | 129 | /* interrupt flags in INTA, set by uCode or hardware (e.g. dma), |
124 | * acknowledged (reset) by host writing "1" to flagged bits. */ | 130 | * acknowledged (reset) by host writing "1" to flagged bits. */ |
@@ -236,6 +242,8 @@ | |||
236 | #define CSR39_ANA_PLL_CFG_VAL (0x01000000) | 242 | #define CSR39_ANA_PLL_CFG_VAL (0x01000000) |
237 | #define CSR50_ANA_PLL_CFG_VAL (0x00880300) | 243 | #define CSR50_ANA_PLL_CFG_VAL (0x00880300) |
238 | 244 | ||
245 | /* HPET MEM debug */ | ||
246 | #define CSR_DBG_HPET_MEM_REG_VAL (0xFFFF0000) | ||
239 | /*=== HBUS (Host-side Bus) ===*/ | 247 | /*=== HBUS (Host-side Bus) ===*/ |
240 | #define HBUS_BASE (0x400) | 248 | #define HBUS_BASE (0x400) |
241 | /* | 249 | /* |
diff --git a/drivers/net/wireless/iwlwifi/iwl-debug.h b/drivers/net/wireless/iwlwifi/iwl-debug.h index d6d729e86bdb..b4ffd33ef98c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debug.h +++ b/drivers/net/wireless/iwlwifi/iwl-debug.h | |||
@@ -33,12 +33,12 @@ | |||
33 | #define IWL_DEBUG(level, fmt, args...) \ | 33 | #define IWL_DEBUG(level, fmt, args...) \ |
34 | do { if (priv->debug_level & (level)) \ | 34 | do { if (priv->debug_level & (level)) \ |
35 | dev_printk(KERN_ERR, &(priv->hw->wiphy->dev), "%c %s " fmt, \ | 35 | dev_printk(KERN_ERR, &(priv->hw->wiphy->dev), "%c %s " fmt, \ |
36 | in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0) | 36 | in_interrupt() ? 'I' : 'U', __func__ , ## args); } while (0) |
37 | 37 | ||
38 | #define IWL_DEBUG_LIMIT(level, fmt, args...) \ | 38 | #define IWL_DEBUG_LIMIT(level, fmt, args...) \ |
39 | do { if ((priv->debug_level & (level)) && net_ratelimit()) \ | 39 | do { if ((priv->debug_level & (level)) && net_ratelimit()) \ |
40 | dev_printk(KERN_ERR, &(priv->hw->wiphy->dev), "%c %s " fmt, \ | 40 | dev_printk(KERN_ERR, &(priv->hw->wiphy->dev), "%c %s " fmt, \ |
41 | in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0) | 41 | in_interrupt() ? 'I' : 'U', __func__ , ## args); } while (0) |
42 | 42 | ||
43 | #ifdef CONFIG_IWLWIFI_DEBUGFS | 43 | #ifdef CONFIG_IWLWIFI_DEBUGFS |
44 | struct iwl_debugfs { | 44 | struct iwl_debugfs { |
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c index ed948dc59b3d..20db0eb636a8 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c +++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c | |||
@@ -231,7 +231,7 @@ static ssize_t iwl_dbgfs_stations_read(struct file *file, char __user *user_buf, | |||
231 | DECLARE_MAC_BUF(mac); | 231 | DECLARE_MAC_BUF(mac); |
232 | 232 | ||
233 | buf = kmalloc(bufsz, GFP_KERNEL); | 233 | buf = kmalloc(bufsz, GFP_KERNEL); |
234 | if(!buf) | 234 | if (!buf) |
235 | return -ENOMEM; | 235 | return -ENOMEM; |
236 | 236 | ||
237 | pos += scnprintf(buf + pos, bufsz - pos, "num of stations: %d\n\n", | 237 | pos += scnprintf(buf + pos, bufsz - pos, "num of stations: %d\n\n", |
@@ -364,16 +364,19 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name) | |||
364 | { | 364 | { |
365 | struct iwl_debugfs *dbgfs; | 365 | struct iwl_debugfs *dbgfs; |
366 | struct dentry *phyd = priv->hw->wiphy->debugfsdir; | 366 | struct dentry *phyd = priv->hw->wiphy->debugfsdir; |
367 | int ret = 0; | ||
367 | 368 | ||
368 | dbgfs = kzalloc(sizeof(struct iwl_debugfs), GFP_KERNEL); | 369 | dbgfs = kzalloc(sizeof(struct iwl_debugfs), GFP_KERNEL); |
369 | if (!dbgfs) { | 370 | if (!dbgfs) { |
371 | ret = -ENOMEM; | ||
370 | goto err; | 372 | goto err; |
371 | } | 373 | } |
372 | 374 | ||
373 | priv->dbgfs = dbgfs; | 375 | priv->dbgfs = dbgfs; |
374 | dbgfs->name = name; | 376 | dbgfs->name = name; |
375 | dbgfs->dir_drv = debugfs_create_dir(name, phyd); | 377 | dbgfs->dir_drv = debugfs_create_dir(name, phyd); |
376 | if (!dbgfs->dir_drv || IS_ERR(dbgfs->dir_drv)){ | 378 | if (!dbgfs->dir_drv || IS_ERR(dbgfs->dir_drv)) { |
379 | ret = -ENOENT; | ||
377 | goto err; | 380 | goto err; |
378 | } | 381 | } |
379 | 382 | ||
@@ -394,7 +397,7 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name) | |||
394 | err: | 397 | err: |
395 | IWL_ERROR("Can't open the debugfs directory\n"); | 398 | IWL_ERROR("Can't open the debugfs directory\n"); |
396 | iwl_dbgfs_unregister(priv); | 399 | iwl_dbgfs_unregister(priv); |
397 | return -ENOENT; | 400 | return ret; |
398 | } | 401 | } |
399 | EXPORT_SYMBOL(iwl_dbgfs_register); | 402 | EXPORT_SYMBOL(iwl_dbgfs_register); |
400 | 403 | ||
@@ -404,7 +407,7 @@ EXPORT_SYMBOL(iwl_dbgfs_register); | |||
404 | */ | 407 | */ |
405 | void iwl_dbgfs_unregister(struct iwl_priv *priv) | 408 | void iwl_dbgfs_unregister(struct iwl_priv *priv) |
406 | { | 409 | { |
407 | if (!(priv->dbgfs)) | 410 | if (!priv->dbgfs) |
408 | return; | 411 | return; |
409 | 412 | ||
410 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_eeprom); | 413 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_data_files.file_eeprom); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index 4d789e353e3a..c19db438306c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -36,7 +36,7 @@ | |||
36 | #include <linux/kernel.h> | 36 | #include <linux/kernel.h> |
37 | #include <net/ieee80211_radiotap.h> | 37 | #include <net/ieee80211_radiotap.h> |
38 | 38 | ||
39 | #define DRV_NAME "iwl4965" | 39 | #define DRV_NAME "iwlagn" |
40 | #include "iwl-rfkill.h" | 40 | #include "iwl-rfkill.h" |
41 | #include "iwl-eeprom.h" | 41 | #include "iwl-eeprom.h" |
42 | #include "iwl-4965-hw.h" | 42 | #include "iwl-4965-hw.h" |
@@ -45,6 +45,7 @@ | |||
45 | #include "iwl-debug.h" | 45 | #include "iwl-debug.h" |
46 | #include "iwl-led.h" | 46 | #include "iwl-led.h" |
47 | #include "iwl-power.h" | 47 | #include "iwl-power.h" |
48 | #include "iwl-agn-rs.h" | ||
48 | 49 | ||
49 | /* configuration for the iwl4965 */ | 50 | /* configuration for the iwl4965 */ |
50 | extern struct iwl_cfg iwl4965_agn_cfg; | 51 | extern struct iwl_cfg iwl4965_agn_cfg; |
@@ -134,8 +135,7 @@ struct iwl_tx_info { | |||
134 | struct iwl_tx_queue { | 135 | struct iwl_tx_queue { |
135 | struct iwl_queue q; | 136 | struct iwl_queue q; |
136 | struct iwl_tfd_frame *bd; | 137 | struct iwl_tfd_frame *bd; |
137 | struct iwl_cmd *cmd; | 138 | struct iwl_cmd *cmd[TFD_TX_CMD_SLOTS]; |
138 | dma_addr_t dma_addr_cmd; | ||
139 | struct iwl_tx_info *txb; | 139 | struct iwl_tx_info *txb; |
140 | int need_update; | 140 | int need_update; |
141 | int sched_retry; | 141 | int sched_retry; |
@@ -191,7 +191,6 @@ struct iwl4965_clip_group { | |||
191 | const s8 clip_powers[IWL_MAX_RATES]; | 191 | const s8 clip_powers[IWL_MAX_RATES]; |
192 | }; | 192 | }; |
193 | 193 | ||
194 | #include "iwl-4965-rs.h" | ||
195 | 194 | ||
196 | #define IWL_TX_FIFO_AC0 0 | 195 | #define IWL_TX_FIFO_AC0 0 |
197 | #define IWL_TX_FIFO_AC1 1 | 196 | #define IWL_TX_FIFO_AC1 1 |
@@ -219,7 +218,7 @@ enum iwl_pwr_src { | |||
219 | struct iwl_frame { | 218 | struct iwl_frame { |
220 | union { | 219 | union { |
221 | struct ieee80211_hdr frame; | 220 | struct ieee80211_hdr frame; |
222 | struct iwl4965_tx_beacon_cmd beacon; | 221 | struct iwl_tx_beacon_cmd beacon; |
223 | u8 raw[IEEE80211_FRAME_LEN]; | 222 | u8 raw[IEEE80211_FRAME_LEN]; |
224 | u8 cmd[360]; | 223 | u8 cmd[360]; |
225 | } u; | 224 | } u; |
@@ -283,10 +282,9 @@ struct iwl_cmd { | |||
283 | u32 val32; | 282 | u32 val32; |
284 | struct iwl4965_bt_cmd bt; | 283 | struct iwl4965_bt_cmd bt; |
285 | struct iwl4965_rxon_time_cmd rxon_time; | 284 | struct iwl4965_rxon_time_cmd rxon_time; |
286 | struct iwl4965_powertable_cmd powertable; | 285 | struct iwl_powertable_cmd powertable; |
287 | struct iwl_qosparam_cmd qosparam; | 286 | struct iwl_qosparam_cmd qosparam; |
288 | struct iwl_tx_cmd tx; | 287 | struct iwl_tx_cmd tx; |
289 | struct iwl4965_tx_beacon_cmd tx_beacon; | ||
290 | struct iwl4965_rxon_assoc_cmd rxon_assoc; | 288 | struct iwl4965_rxon_assoc_cmd rxon_assoc; |
291 | struct iwl_rem_sta_cmd rm_sta; | 289 | struct iwl_rem_sta_cmd rm_sta; |
292 | u8 *indirect; | 290 | u8 *indirect; |
@@ -590,6 +588,7 @@ extern unsigned int iwl4965_fill_beacon_frame(struct iwl_priv *priv, | |||
590 | const u8 *dest, int left); | 588 | const u8 *dest, int left); |
591 | extern void iwl4965_update_chain_flags(struct iwl_priv *priv); | 589 | extern void iwl4965_update_chain_flags(struct iwl_priv *priv); |
592 | int iwl4965_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src); | 590 | int iwl4965_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src); |
591 | extern int iwl4965_set_power(struct iwl_priv *priv, void *cmd); | ||
593 | 592 | ||
594 | extern const u8 iwl_bcast_addr[ETH_ALEN]; | 593 | extern const u8 iwl_bcast_addr[ETH_ALEN]; |
595 | 594 | ||
@@ -642,10 +641,6 @@ struct iwl_priv; | |||
642 | * Forward declare iwl-4965.c functions for iwl-base.c | 641 | * Forward declare iwl-4965.c functions for iwl-base.c |
643 | */ | 642 | */ |
644 | extern void iwl4965_rf_kill_ct_config(struct iwl_priv *priv); | 643 | extern void iwl4965_rf_kill_ct_config(struct iwl_priv *priv); |
645 | |||
646 | int iwl4965_mac_ampdu_action(struct ieee80211_hw *hw, | ||
647 | enum ieee80211_ampdu_mlme_action action, | ||
648 | const u8 *addr, u16 tid, u16 *ssn); | ||
649 | int iwl4965_check_empty_hw_queue(struct iwl_priv *priv, int sta_id, | 644 | int iwl4965_check_empty_hw_queue(struct iwl_priv *priv, int sta_id, |
650 | u8 tid, int txq_id); | 645 | u8 tid, int txq_id); |
651 | 646 | ||
@@ -812,14 +807,11 @@ struct iwl_chain_noise_data { | |||
812 | #define EEPROM_SEM_RETRY_LIMIT 1000 /* number of attempts (not time) */ | 807 | #define EEPROM_SEM_RETRY_LIMIT 1000 /* number of attempts (not time) */ |
813 | 808 | ||
814 | 809 | ||
815 | #ifdef CONFIG_IWL4965_SPECTRUM_MEASUREMENT | ||
816 | |||
817 | enum { | 810 | enum { |
818 | MEASUREMENT_READY = (1 << 0), | 811 | MEASUREMENT_READY = (1 << 0), |
819 | MEASUREMENT_ACTIVE = (1 << 1), | 812 | MEASUREMENT_ACTIVE = (1 << 1), |
820 | }; | 813 | }; |
821 | 814 | ||
822 | #endif | ||
823 | 815 | ||
824 | #define IWL_MAX_NUM_QUEUES 20 /* FIXME: do dynamic allocation */ | 816 | #define IWL_MAX_NUM_QUEUES 20 /* FIXME: do dynamic allocation */ |
825 | 817 | ||
@@ -844,7 +836,7 @@ struct iwl_priv { | |||
844 | 836 | ||
845 | struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS]; | 837 | struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS]; |
846 | 838 | ||
847 | #ifdef CONFIG_IWL4965_SPECTRUM_MEASUREMENT | 839 | #ifdef CONFIG_IWLAGN_SPECTRUM_MEASUREMENT |
848 | /* spectrum measurement report caching */ | 840 | /* spectrum measurement report caching */ |
849 | struct iwl4965_spectrum_notification measure_report; | 841 | struct iwl4965_spectrum_notification measure_report; |
850 | u8 measurement_status; | 842 | u8 measurement_status; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c index 4a08a1b50979..bce53830b301 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c | |||
@@ -273,8 +273,7 @@ EXPORT_SYMBOL(iwl_eeprom_init); | |||
273 | 273 | ||
274 | void iwl_eeprom_free(struct iwl_priv *priv) | 274 | void iwl_eeprom_free(struct iwl_priv *priv) |
275 | { | 275 | { |
276 | if(priv->eeprom) | 276 | kfree(priv->eeprom); |
277 | kfree(priv->eeprom); | ||
278 | priv->eeprom = NULL; | 277 | priv->eeprom = NULL; |
279 | } | 278 | } |
280 | EXPORT_SYMBOL(iwl_eeprom_free); | 279 | EXPORT_SYMBOL(iwl_eeprom_free); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-hcmd.c b/drivers/net/wireless/iwlwifi/iwl-hcmd.c index 8fa991b7202a..6512834bb916 100644 --- a/drivers/net/wireless/iwlwifi/iwl-hcmd.c +++ b/drivers/net/wireless/iwlwifi/iwl-hcmd.c | |||
@@ -228,7 +228,7 @@ cancel: | |||
228 | * TX cmd queue. Otherwise in case the cmd comes | 228 | * TX cmd queue. Otherwise in case the cmd comes |
229 | * in later, it will possibly set an invalid | 229 | * in later, it will possibly set an invalid |
230 | * address (cmd->meta.source). */ | 230 | * address (cmd->meta.source). */ |
231 | qcmd = &priv->txq[IWL_CMD_QUEUE_NUM].cmd[cmd_idx]; | 231 | qcmd = priv->txq[IWL_CMD_QUEUE_NUM].cmd[cmd_idx]; |
232 | qcmd->meta.flags &= ~CMD_WANT_SKB; | 232 | qcmd->meta.flags &= ~CMD_WANT_SKB; |
233 | } | 233 | } |
234 | fail: | 234 | fail: |
diff --git a/drivers/net/wireless/iwlwifi/iwl-led.c b/drivers/net/wireless/iwlwifi/iwl-led.c index 61250e6a7d1b..cb11c4a4d691 100644 --- a/drivers/net/wireless/iwlwifi/iwl-led.c +++ b/drivers/net/wireless/iwlwifi/iwl-led.c | |||
@@ -161,12 +161,32 @@ int iwl4965_led_off(struct iwl_priv *priv, int led_id) | |||
161 | /* Set led register off */ | 161 | /* Set led register off */ |
162 | static int iwl4965_led_off_reg(struct iwl_priv *priv, int led_id) | 162 | static int iwl4965_led_off_reg(struct iwl_priv *priv, int led_id) |
163 | { | 163 | { |
164 | IWL_DEBUG_LED("radio off\n"); | 164 | IWL_DEBUG_LED("LED Reg off\n"); |
165 | iwl_write32(priv, CSR_LED_REG, CSR_LED_REG_TRUN_OFF); | 165 | iwl_write32(priv, CSR_LED_REG, CSR_LED_REG_TRUN_OFF); |
166 | return 0; | 166 | return 0; |
167 | } | 167 | } |
168 | 168 | ||
169 | /* | 169 | /* |
170 | * Set led register in case of disassociation according to rfkill state | ||
171 | */ | ||
172 | static int iwl_led_associate(struct iwl_priv *priv, int led_id) | ||
173 | { | ||
174 | IWL_DEBUG_LED("Associated\n"); | ||
175 | priv->allow_blinking = 1; | ||
176 | return iwl4965_led_on_reg(priv, led_id); | ||
177 | } | ||
178 | static int iwl_led_disassociate(struct iwl_priv *priv, int led_id) | ||
179 | { | ||
180 | priv->allow_blinking = 0; | ||
181 | if (iwl_is_rfkill(priv)) | ||
182 | iwl4965_led_off_reg(priv, led_id); | ||
183 | else | ||
184 | iwl4965_led_on_reg(priv, led_id); | ||
185 | |||
186 | return 0; | ||
187 | } | ||
188 | |||
189 | /* | ||
170 | * brightness call back function for Tx/Rx LED | 190 | * brightness call back function for Tx/Rx LED |
171 | */ | 191 | */ |
172 | static int iwl_led_associated(struct iwl_priv *priv, int led_id) | 192 | static int iwl_led_associated(struct iwl_priv *priv, int led_id) |
@@ -199,16 +219,10 @@ static void iwl_led_brightness_set(struct led_classdev *led_cdev, | |||
199 | led_type_str[led->type], brightness); | 219 | led_type_str[led->type], brightness); |
200 | switch (brightness) { | 220 | switch (brightness) { |
201 | case LED_FULL: | 221 | case LED_FULL: |
202 | if (led->type == IWL_LED_TRG_ASSOC) | ||
203 | priv->allow_blinking = 1; | ||
204 | |||
205 | if (led->led_on) | 222 | if (led->led_on) |
206 | led->led_on(priv, IWL_LED_LINK); | 223 | led->led_on(priv, IWL_LED_LINK); |
207 | break; | 224 | break; |
208 | case LED_OFF: | 225 | case LED_OFF: |
209 | if (led->type == IWL_LED_TRG_ASSOC) | ||
210 | priv->allow_blinking = 0; | ||
211 | |||
212 | if (led->led_off) | 226 | if (led->led_off) |
213 | led->led_off(priv, IWL_LED_LINK); | 227 | led->led_off(priv, IWL_LED_LINK); |
214 | break; | 228 | break; |
@@ -228,12 +242,12 @@ static void iwl_led_brightness_set(struct led_classdev *led_cdev, | |||
228 | */ | 242 | */ |
229 | static int iwl_leds_register_led(struct iwl_priv *priv, struct iwl_led *led, | 243 | static int iwl_leds_register_led(struct iwl_priv *priv, struct iwl_led *led, |
230 | enum led_type type, u8 set_led, | 244 | enum led_type type, u8 set_led, |
231 | const char *name, char *trigger) | 245 | char *trigger) |
232 | { | 246 | { |
233 | struct device *device = wiphy_dev(priv->hw->wiphy); | 247 | struct device *device = wiphy_dev(priv->hw->wiphy); |
234 | int ret; | 248 | int ret; |
235 | 249 | ||
236 | led->led_dev.name = name; | 250 | led->led_dev.name = led->name; |
237 | led->led_dev.brightness_set = iwl_led_brightness_set; | 251 | led->led_dev.brightness_set = iwl_led_brightness_set; |
238 | led->led_dev.default_trigger = trigger; | 252 | led->led_dev.default_trigger = trigger; |
239 | 253 | ||
@@ -284,12 +298,6 @@ static int iwl_get_blink_rate(struct iwl_priv *priv) | |||
284 | return i; | 298 | return i; |
285 | } | 299 | } |
286 | 300 | ||
287 | static inline int is_rf_kill(struct iwl_priv *priv) | ||
288 | { | ||
289 | return test_bit(STATUS_RF_KILL_HW, &priv->status) || | ||
290 | test_bit(STATUS_RF_KILL_SW, &priv->status); | ||
291 | } | ||
292 | |||
293 | /* | 301 | /* |
294 | * this function called from handler. Since setting Led command can | 302 | * this function called from handler. Since setting Led command can |
295 | * happen very frequent we postpone led command to be called from | 303 | * happen very frequent we postpone led command to be called from |
@@ -303,7 +311,7 @@ void iwl_leds_background(struct iwl_priv *priv) | |||
303 | priv->last_blink_time = 0; | 311 | priv->last_blink_time = 0; |
304 | return; | 312 | return; |
305 | } | 313 | } |
306 | if (is_rf_kill(priv)) { | 314 | if (iwl_is_rfkill(priv)) { |
307 | priv->last_blink_time = 0; | 315 | priv->last_blink_time = 0; |
308 | return; | 316 | return; |
309 | } | 317 | } |
@@ -337,7 +345,6 @@ EXPORT_SYMBOL(iwl_leds_background); | |||
337 | int iwl_leds_register(struct iwl_priv *priv) | 345 | int iwl_leds_register(struct iwl_priv *priv) |
338 | { | 346 | { |
339 | char *trigger; | 347 | char *trigger; |
340 | char name[32]; | ||
341 | int ret; | 348 | int ret; |
342 | 349 | ||
343 | priv->last_blink_rate = 0; | 350 | priv->last_blink_rate = 0; |
@@ -346,7 +353,8 @@ int iwl_leds_register(struct iwl_priv *priv) | |||
346 | priv->allow_blinking = 0; | 353 | priv->allow_blinking = 0; |
347 | 354 | ||
348 | trigger = ieee80211_get_radio_led_name(priv->hw); | 355 | trigger = ieee80211_get_radio_led_name(priv->hw); |
349 | snprintf(name, sizeof(name), "iwl-%s:radio", | 356 | snprintf(priv->led[IWL_LED_TRG_RADIO].name, |
357 | sizeof(priv->led[IWL_LED_TRG_RADIO].name), "iwl-%s:radio", | ||
350 | wiphy_name(priv->hw->wiphy)); | 358 | wiphy_name(priv->hw->wiphy)); |
351 | 359 | ||
352 | priv->led[IWL_LED_TRG_RADIO].led_on = iwl4965_led_on_reg; | 360 | priv->led[IWL_LED_TRG_RADIO].led_on = iwl4965_led_on_reg; |
@@ -354,31 +362,33 @@ int iwl_leds_register(struct iwl_priv *priv) | |||
354 | priv->led[IWL_LED_TRG_RADIO].led_pattern = NULL; | 362 | priv->led[IWL_LED_TRG_RADIO].led_pattern = NULL; |
355 | 363 | ||
356 | ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_RADIO], | 364 | ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_RADIO], |
357 | IWL_LED_TRG_RADIO, 1, name, trigger); | 365 | IWL_LED_TRG_RADIO, 1, trigger); |
358 | if (ret) | 366 | if (ret) |
359 | goto exit_fail; | 367 | goto exit_fail; |
360 | 368 | ||
361 | trigger = ieee80211_get_assoc_led_name(priv->hw); | 369 | trigger = ieee80211_get_assoc_led_name(priv->hw); |
362 | snprintf(name, sizeof(name), "iwl-%s:assoc", | 370 | snprintf(priv->led[IWL_LED_TRG_ASSOC].name, |
371 | sizeof(priv->led[IWL_LED_TRG_ASSOC].name), "iwl-%s:assoc", | ||
363 | wiphy_name(priv->hw->wiphy)); | 372 | wiphy_name(priv->hw->wiphy)); |
364 | 373 | ||
365 | ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_ASSOC], | 374 | ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_ASSOC], |
366 | IWL_LED_TRG_ASSOC, 0, name, trigger); | 375 | IWL_LED_TRG_ASSOC, 0, trigger); |
367 | 376 | ||
368 | /* for assoc always turn led on */ | 377 | /* for assoc always turn led on */ |
369 | priv->led[IWL_LED_TRG_ASSOC].led_on = iwl4965_led_on_reg; | 378 | priv->led[IWL_LED_TRG_ASSOC].led_on = iwl_led_associate; |
370 | priv->led[IWL_LED_TRG_ASSOC].led_off = iwl4965_led_on_reg; | 379 | priv->led[IWL_LED_TRG_ASSOC].led_off = iwl_led_disassociate; |
371 | priv->led[IWL_LED_TRG_ASSOC].led_pattern = NULL; | 380 | priv->led[IWL_LED_TRG_ASSOC].led_pattern = NULL; |
372 | 381 | ||
373 | if (ret) | 382 | if (ret) |
374 | goto exit_fail; | 383 | goto exit_fail; |
375 | 384 | ||
376 | trigger = ieee80211_get_rx_led_name(priv->hw); | 385 | trigger = ieee80211_get_rx_led_name(priv->hw); |
377 | snprintf(name, sizeof(name), "iwl-%s:RX", wiphy_name(priv->hw->wiphy)); | 386 | snprintf(priv->led[IWL_LED_TRG_RX].name, |
378 | 387 | sizeof(priv->led[IWL_LED_TRG_RX].name), "iwl-%s:RX", | |
388 | wiphy_name(priv->hw->wiphy)); | ||
379 | 389 | ||
380 | ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_RX], | 390 | ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_RX], |
381 | IWL_LED_TRG_RX, 0, name, trigger); | 391 | IWL_LED_TRG_RX, 0, trigger); |
382 | 392 | ||
383 | priv->led[IWL_LED_TRG_RX].led_on = iwl_led_associated; | 393 | priv->led[IWL_LED_TRG_RX].led_on = iwl_led_associated; |
384 | priv->led[IWL_LED_TRG_RX].led_off = iwl_led_associated; | 394 | priv->led[IWL_LED_TRG_RX].led_off = iwl_led_associated; |
@@ -388,9 +398,12 @@ int iwl_leds_register(struct iwl_priv *priv) | |||
388 | goto exit_fail; | 398 | goto exit_fail; |
389 | 399 | ||
390 | trigger = ieee80211_get_tx_led_name(priv->hw); | 400 | trigger = ieee80211_get_tx_led_name(priv->hw); |
391 | snprintf(name, sizeof(name), "iwl-%s:TX", wiphy_name(priv->hw->wiphy)); | 401 | snprintf(priv->led[IWL_LED_TRG_TX].name, |
402 | sizeof(priv->led[IWL_LED_TRG_TX].name), "iwl-%s:TX", | ||
403 | wiphy_name(priv->hw->wiphy)); | ||
404 | |||
392 | ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_TX], | 405 | ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_TX], |
393 | IWL_LED_TRG_TX, 0, name, trigger); | 406 | IWL_LED_TRG_TX, 0, trigger); |
394 | 407 | ||
395 | priv->led[IWL_LED_TRG_TX].led_on = iwl_led_associated; | 408 | priv->led[IWL_LED_TRG_TX].led_on = iwl_led_associated; |
396 | priv->led[IWL_LED_TRG_TX].led_off = iwl_led_associated; | 409 | priv->led[IWL_LED_TRG_TX].led_off = iwl_led_associated; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-led.h b/drivers/net/wireless/iwlwifi/iwl-led.h index 1980ae5a7e82..588c9ad20e83 100644 --- a/drivers/net/wireless/iwlwifi/iwl-led.h +++ b/drivers/net/wireless/iwlwifi/iwl-led.h | |||
@@ -52,6 +52,7 @@ enum led_type { | |||
52 | struct iwl_led { | 52 | struct iwl_led { |
53 | struct iwl_priv *priv; | 53 | struct iwl_priv *priv; |
54 | struct led_classdev led_dev; | 54 | struct led_classdev led_dev; |
55 | char name[32]; | ||
55 | 56 | ||
56 | int (*led_on) (struct iwl_priv *priv, int led_id); | 57 | int (*led_on) (struct iwl_priv *priv, int led_id); |
57 | int (*led_off) (struct iwl_priv *priv, int led_id); | 58 | int (*led_off) (struct iwl_priv *priv, int led_id); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-power.c b/drivers/net/wireless/iwlwifi/iwl-power.c index 2e71803e09ba..028e3053c0ca 100644 --- a/drivers/net/wireless/iwlwifi/iwl-power.c +++ b/drivers/net/wireless/iwlwifi/iwl-power.c | |||
@@ -82,7 +82,7 @@ | |||
82 | 82 | ||
83 | /* default power management (not Tx power) table values */ | 83 | /* default power management (not Tx power) table values */ |
84 | /* for tim 0-10 */ | 84 | /* for tim 0-10 */ |
85 | static struct iwl_power_vec_entry range_0[IWL_POWER_AC] = { | 85 | static struct iwl_power_vec_entry range_0[IWL_POWER_MAX] = { |
86 | {{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0}, | 86 | {{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0}, |
87 | {{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 2, 2, 0xFF)}, 0}, | 87 | {{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 2, 2, 0xFF)}, 0}, |
88 | {{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(1, 2, 2, 2, 0xFF)}, 0}, | 88 | {{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(1, 2, 2, 2, 0xFF)}, 0}, |
@@ -93,7 +93,7 @@ static struct iwl_power_vec_entry range_0[IWL_POWER_AC] = { | |||
93 | 93 | ||
94 | 94 | ||
95 | /* for tim = 3-10 */ | 95 | /* for tim = 3-10 */ |
96 | static struct iwl_power_vec_entry range_1[IWL_POWER_AC] = { | 96 | static struct iwl_power_vec_entry range_1[IWL_POWER_MAX] = { |
97 | {{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0}, | 97 | {{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0}, |
98 | {{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 3, 4, 4)}, 0}, | 98 | {{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 3, 4, 4)}, 0}, |
99 | {{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(1, 2, 3, 4, 7)}, 0}, | 99 | {{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(1, 2, 3, 4, 7)}, 0}, |
@@ -103,7 +103,7 @@ static struct iwl_power_vec_entry range_1[IWL_POWER_AC] = { | |||
103 | }; | 103 | }; |
104 | 104 | ||
105 | /* for tim > 11 */ | 105 | /* for tim > 11 */ |
106 | static struct iwl_power_vec_entry range_2[IWL_POWER_AC] = { | 106 | static struct iwl_power_vec_entry range_2[IWL_POWER_MAX] = { |
107 | {{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0}, | 107 | {{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0}, |
108 | {{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 3, 4, 0xFF)}, 0}, | 108 | {{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 3, 4, 0xFF)}, 0}, |
109 | {{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(2, 4, 6, 7, 0xFF)}, 0}, | 109 | {{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(2, 4, 6, 7, 0xFF)}, 0}, |
@@ -112,12 +112,19 @@ static struct iwl_power_vec_entry range_2[IWL_POWER_AC] = { | |||
112 | {{SLP, SLP_TOUT(25), SLP_TOUT(25), SLP_VEC(4, 7, 10, 10, 0xFF)}, 0} | 112 | {{SLP, SLP_TOUT(25), SLP_TOUT(25), SLP_VEC(4, 7, 10, 10, 0xFF)}, 0} |
113 | }; | 113 | }; |
114 | 114 | ||
115 | /* set card power command */ | ||
116 | static int iwl_set_power(struct iwl_priv *priv, void *cmd) | ||
117 | { | ||
118 | return iwl_send_cmd_pdu_async(priv, POWER_TABLE_CMD, | ||
119 | sizeof(struct iwl_powertable_cmd), | ||
120 | cmd, NULL); | ||
121 | } | ||
115 | /* decide the right power level according to association status | 122 | /* decide the right power level according to association status |
116 | * and battery status | 123 | * and battery status |
117 | */ | 124 | */ |
118 | static u16 iwl_get_auto_power_mode(struct iwl_priv *priv) | 125 | static u16 iwl_get_auto_power_mode(struct iwl_priv *priv) |
119 | { | 126 | { |
120 | u16 mode = priv->power_data.user_power_setting; | 127 | u16 mode; |
121 | 128 | ||
122 | switch (priv->power_data.user_power_setting) { | 129 | switch (priv->power_data.user_power_setting) { |
123 | case IWL_POWER_AUTO: | 130 | case IWL_POWER_AUTO: |
@@ -129,12 +136,16 @@ static u16 iwl_get_auto_power_mode(struct iwl_priv *priv) | |||
129 | else | 136 | else |
130 | mode = IWL_POWER_ON_AC_DISASSOC; | 137 | mode = IWL_POWER_ON_AC_DISASSOC; |
131 | break; | 138 | break; |
139 | /* FIXME: remove battery and ac from here */ | ||
132 | case IWL_POWER_BATTERY: | 140 | case IWL_POWER_BATTERY: |
133 | mode = IWL_POWER_INDEX_3; | 141 | mode = IWL_POWER_INDEX_3; |
134 | break; | 142 | break; |
135 | case IWL_POWER_AC: | 143 | case IWL_POWER_AC: |
136 | mode = IWL_POWER_MODE_CAM; | 144 | mode = IWL_POWER_MODE_CAM; |
137 | break; | 145 | break; |
146 | default: | ||
147 | mode = priv->power_data.user_power_setting; | ||
148 | break; | ||
138 | } | 149 | } |
139 | return mode; | 150 | return mode; |
140 | } | 151 | } |
@@ -144,7 +155,7 @@ static int iwl_power_init_handle(struct iwl_priv *priv) | |||
144 | { | 155 | { |
145 | int ret = 0, i; | 156 | int ret = 0, i; |
146 | struct iwl_power_mgr *pow_data; | 157 | struct iwl_power_mgr *pow_data; |
147 | int size = sizeof(struct iwl_power_vec_entry) * IWL_POWER_AC; | 158 | int size = sizeof(struct iwl_power_vec_entry) * IWL_POWER_MAX; |
148 | u16 pci_pm; | 159 | u16 pci_pm; |
149 | 160 | ||
150 | IWL_DEBUG_POWER("Initialize power \n"); | 161 | IWL_DEBUG_POWER("Initialize power \n"); |
@@ -162,11 +173,11 @@ static int iwl_power_init_handle(struct iwl_priv *priv) | |||
162 | if (ret != 0) | 173 | if (ret != 0) |
163 | return 0; | 174 | return 0; |
164 | else { | 175 | else { |
165 | struct iwl4965_powertable_cmd *cmd; | 176 | struct iwl_powertable_cmd *cmd; |
166 | 177 | ||
167 | IWL_DEBUG_POWER("adjust power command flags\n"); | 178 | IWL_DEBUG_POWER("adjust power command flags\n"); |
168 | 179 | ||
169 | for (i = 0; i < IWL_POWER_AC; i++) { | 180 | for (i = 0; i < IWL_POWER_MAX; i++) { |
170 | cmd = &pow_data->pwr_range_0[i].cmd; | 181 | cmd = &pow_data->pwr_range_0[i].cmd; |
171 | 182 | ||
172 | if (pci_pm & 0x1) | 183 | if (pci_pm & 0x1) |
@@ -180,7 +191,7 @@ static int iwl_power_init_handle(struct iwl_priv *priv) | |||
180 | 191 | ||
181 | /* adjust power command according to dtim period and power level*/ | 192 | /* adjust power command according to dtim period and power level*/ |
182 | static int iwl_update_power_command(struct iwl_priv *priv, | 193 | static int iwl_update_power_command(struct iwl_priv *priv, |
183 | struct iwl4965_powertable_cmd *cmd, | 194 | struct iwl_powertable_cmd *cmd, |
184 | u16 mode) | 195 | u16 mode) |
185 | { | 196 | { |
186 | int ret = 0, i; | 197 | int ret = 0, i; |
@@ -204,7 +215,7 @@ static int iwl_update_power_command(struct iwl_priv *priv, | |||
204 | range = &pow_data->pwr_range_2[0]; | 215 | range = &pow_data->pwr_range_2[0]; |
205 | 216 | ||
206 | period = pow_data->dtim_period; | 217 | period = pow_data->dtim_period; |
207 | memcpy(cmd, &range[mode].cmd, sizeof(struct iwl4965_powertable_cmd)); | 218 | memcpy(cmd, &range[mode].cmd, sizeof(struct iwl_powertable_cmd)); |
208 | 219 | ||
209 | if (period == 0) { | 220 | if (period == 0) { |
210 | period = 1; | 221 | period = 1; |
@@ -258,17 +269,18 @@ int iwl_power_update_mode(struct iwl_priv *priv, u8 refresh) | |||
258 | * else user level */ | 269 | * else user level */ |
259 | 270 | ||
260 | switch (setting->system_power_setting) { | 271 | switch (setting->system_power_setting) { |
261 | case IWL_POWER_AUTO: | 272 | case IWL_POWER_SYS_AUTO: |
262 | final_mode = iwl_get_auto_power_mode(priv); | 273 | final_mode = iwl_get_auto_power_mode(priv); |
263 | break; | 274 | break; |
264 | case IWL_POWER_BATTERY: | 275 | case IWL_POWER_SYS_BATTERY: |
265 | final_mode = IWL_POWER_INDEX_3; | 276 | final_mode = IWL_POWER_INDEX_3; |
266 | break; | 277 | break; |
267 | case IWL_POWER_AC: | 278 | case IWL_POWER_SYS_AC: |
268 | final_mode = IWL_POWER_MODE_CAM; | 279 | final_mode = IWL_POWER_MODE_CAM; |
269 | break; | 280 | break; |
270 | default: | 281 | default: |
271 | final_mode = setting->system_power_setting; | 282 | final_mode = IWL_POWER_INDEX_3; |
283 | WARN_ON(1); | ||
272 | } | 284 | } |
273 | 285 | ||
274 | if (setting->critical_power_setting > final_mode) | 286 | if (setting->critical_power_setting > final_mode) |
@@ -280,7 +292,7 @@ int iwl_power_update_mode(struct iwl_priv *priv, u8 refresh) | |||
280 | 292 | ||
281 | if (!iwl_is_rfkill(priv) && !setting->power_disabled && | 293 | if (!iwl_is_rfkill(priv) && !setting->power_disabled && |
282 | ((setting->power_mode != final_mode) || refresh)) { | 294 | ((setting->power_mode != final_mode) || refresh)) { |
283 | struct iwl4965_powertable_cmd cmd; | 295 | struct iwl_powertable_cmd cmd; |
284 | 296 | ||
285 | if (final_mode != IWL_POWER_MODE_CAM) | 297 | if (final_mode != IWL_POWER_MODE_CAM) |
286 | set_bit(STATUS_POWER_PMI, &priv->status); | 298 | set_bit(STATUS_POWER_PMI, &priv->status); |
@@ -291,8 +303,7 @@ int iwl_power_update_mode(struct iwl_priv *priv, u8 refresh) | |||
291 | if (final_mode == IWL_POWER_INDEX_5) | 303 | if (final_mode == IWL_POWER_INDEX_5) |
292 | cmd.flags |= IWL_POWER_FAST_PD; | 304 | cmd.flags |= IWL_POWER_FAST_PD; |
293 | 305 | ||
294 | if (priv->cfg->ops->lib->set_power) | 306 | ret = iwl_set_power(priv, &cmd); |
295 | ret = priv->cfg->ops->lib->set_power(priv, &cmd); | ||
296 | 307 | ||
297 | if (final_mode == IWL_POWER_MODE_CAM) | 308 | if (final_mode == IWL_POWER_MODE_CAM) |
298 | clear_bit(STATUS_POWER_PMI, &priv->status); | 309 | clear_bit(STATUS_POWER_PMI, &priv->status); |
@@ -388,7 +399,7 @@ void iwl_power_initialize(struct iwl_priv *priv) | |||
388 | iwl_power_init_handle(priv); | 399 | iwl_power_init_handle(priv); |
389 | priv->power_data.user_power_setting = IWL_POWER_AUTO; | 400 | priv->power_data.user_power_setting = IWL_POWER_AUTO; |
390 | priv->power_data.power_disabled = 0; | 401 | priv->power_data.power_disabled = 0; |
391 | priv->power_data.system_power_setting = IWL_POWER_AUTO; | 402 | priv->power_data.system_power_setting = IWL_POWER_SYS_AUTO; |
392 | priv->power_data.is_battery_active = 0; | 403 | priv->power_data.is_battery_active = 0; |
393 | priv->power_data.power_disabled = 0; | 404 | priv->power_data.power_disabled = 0; |
394 | priv->power_data.critical_power_setting = 0; | 405 | priv->power_data.critical_power_setting = 0; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-power.h b/drivers/net/wireless/iwlwifi/iwl-power.h index b066724a1c2b..abcbbf96a84e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-power.h +++ b/drivers/net/wireless/iwlwifi/iwl-power.h | |||
@@ -33,12 +33,25 @@ | |||
33 | 33 | ||
34 | struct iwl_priv; | 34 | struct iwl_priv; |
35 | 35 | ||
36 | #define IWL_POWER_MODE_CAM 0x00 /* Continuously Aware Mode, always on */ | 36 | enum { |
37 | #define IWL_POWER_INDEX_3 0x03 | 37 | IWL_POWER_MODE_CAM, /* Continuously Aware Mode, always on */ |
38 | #define IWL_POWER_INDEX_5 0x05 | 38 | IWL_POWER_INDEX_1, |
39 | #define IWL_POWER_AC 0x06 | 39 | IWL_POWER_INDEX_2, |
40 | #define IWL_POWER_BATTERY 0x07 | 40 | IWL_POWER_INDEX_3, |
41 | #define IWL_POWER_AUTO 0x08 | 41 | IWL_POWER_INDEX_4, |
42 | IWL_POWER_INDEX_5, | ||
43 | IWL_POWER_AUTO, | ||
44 | IWL_POWER_MAX = IWL_POWER_AUTO, | ||
45 | IWL_POWER_AC, | ||
46 | IWL_POWER_BATTERY, | ||
47 | }; | ||
48 | |||
49 | enum { | ||
50 | IWL_POWER_SYS_AUTO, | ||
51 | IWL_POWER_SYS_AC, | ||
52 | IWL_POWER_SYS_BATTERY, | ||
53 | }; | ||
54 | |||
42 | #define IWL_POWER_LIMIT 0x08 | 55 | #define IWL_POWER_LIMIT 0x08 |
43 | #define IWL_POWER_MASK 0x0F | 56 | #define IWL_POWER_MASK 0x0F |
44 | #define IWL_POWER_ENABLED 0x10 | 57 | #define IWL_POWER_ENABLED 0x10 |
@@ -46,15 +59,15 @@ struct iwl_priv; | |||
46 | /* Power management (not Tx power) structures */ | 59 | /* Power management (not Tx power) structures */ |
47 | 60 | ||
48 | struct iwl_power_vec_entry { | 61 | struct iwl_power_vec_entry { |
49 | struct iwl4965_powertable_cmd cmd; | 62 | struct iwl_powertable_cmd cmd; |
50 | u8 no_dtim; | 63 | u8 no_dtim; |
51 | }; | 64 | }; |
52 | 65 | ||
53 | struct iwl_power_mgr { | 66 | struct iwl_power_mgr { |
54 | spinlock_t lock; | 67 | spinlock_t lock; |
55 | struct iwl_power_vec_entry pwr_range_0[IWL_POWER_AC]; | 68 | struct iwl_power_vec_entry pwr_range_0[IWL_POWER_MAX]; |
56 | struct iwl_power_vec_entry pwr_range_1[IWL_POWER_AC]; | 69 | struct iwl_power_vec_entry pwr_range_1[IWL_POWER_MAX]; |
57 | struct iwl_power_vec_entry pwr_range_2[IWL_POWER_AC]; | 70 | struct iwl_power_vec_entry pwr_range_2[IWL_POWER_MAX]; |
58 | u32 dtim_period; | 71 | u32 dtim_period; |
59 | /* final power level that used to calculate final power command */ | 72 | /* final power level that used to calculate final power command */ |
60 | u8 power_mode; | 73 | u8 power_mode; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h index 70d9c7568b98..ee5afd48d3af 100644 --- a/drivers/net/wireless/iwlwifi/iwl-prph.h +++ b/drivers/net/wireless/iwlwifi/iwl-prph.h | |||
@@ -84,14 +84,16 @@ | |||
84 | #define APMG_CLK_VAL_DMA_CLK_RQT (0x00000200) | 84 | #define APMG_CLK_VAL_DMA_CLK_RQT (0x00000200) |
85 | #define APMG_CLK_VAL_BSM_CLK_RQT (0x00000800) | 85 | #define APMG_CLK_VAL_BSM_CLK_RQT (0x00000800) |
86 | 86 | ||
87 | #define APMG_PS_CTRL_VAL_RESET_REQ (0x04000000) | ||
88 | 87 | ||
89 | #define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800) | 88 | #define APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS (0x00400000) |
89 | #define APMG_PS_CTRL_VAL_RESET_REQ (0x04000000) | ||
90 | #define APMG_PS_CTRL_MSK_PWR_SRC (0x03000000) | ||
91 | #define APMG_PS_CTRL_VAL_PWR_SRC_VMAIN (0x00000000) | ||
92 | #define APMG_PS_CTRL_VAL_PWR_SRC_MAX (0x01000000) /* 3945 only */ | ||
93 | #define APMG_PS_CTRL_VAL_PWR_SRC_VAUX (0x02000000) | ||
90 | 94 | ||
91 | #define APMG_PS_CTRL_MSK_PWR_SRC (0x03000000) | ||
92 | #define APMG_PS_CTRL_VAL_PWR_SRC_VMAIN (0x00000000) | ||
93 | #define APMG_PS_CTRL_VAL_PWR_SRC_VAUX (0x01000000) | ||
94 | 95 | ||
96 | #define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800) | ||
95 | 97 | ||
96 | /** | 98 | /** |
97 | * BSM (Bootstrap State Machine) | 99 | * BSM (Bootstrap State Machine) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index e2d9afba38a5..f3f6ea49fdd2 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | |||
@@ -791,7 +791,7 @@ static inline void iwl_dbg_report_frame(struct iwl_priv *priv, | |||
791 | 791 | ||
792 | static void iwl_add_radiotap(struct iwl_priv *priv, | 792 | static void iwl_add_radiotap(struct iwl_priv *priv, |
793 | struct sk_buff *skb, | 793 | struct sk_buff *skb, |
794 | struct iwl4965_rx_phy_res *rx_start, | 794 | struct iwl_rx_phy_res *rx_start, |
795 | struct ieee80211_rx_status *stats, | 795 | struct ieee80211_rx_status *stats, |
796 | u32 ampdu_status) | 796 | u32 ampdu_status) |
797 | { | 797 | { |
@@ -1010,8 +1010,8 @@ static void iwl_pass_packet_to_mac80211(struct iwl_priv *priv, | |||
1010 | struct ieee80211_rx_status *stats) | 1010 | struct ieee80211_rx_status *stats) |
1011 | { | 1011 | { |
1012 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; | 1012 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; |
1013 | struct iwl4965_rx_phy_res *rx_start = (include_phy) ? | 1013 | struct iwl_rx_phy_res *rx_start = (include_phy) ? |
1014 | (struct iwl4965_rx_phy_res *)&(pkt->u.raw[0]) : NULL; | 1014 | (struct iwl_rx_phy_res *)&(pkt->u.raw[0]) : NULL; |
1015 | struct ieee80211_hdr *hdr; | 1015 | struct ieee80211_hdr *hdr; |
1016 | u16 len; | 1016 | u16 len; |
1017 | __le32 *rx_end; | 1017 | __le32 *rx_end; |
@@ -1020,7 +1020,7 @@ static void iwl_pass_packet_to_mac80211(struct iwl_priv *priv, | |||
1020 | u32 ampdu_status_legacy; | 1020 | u32 ampdu_status_legacy; |
1021 | 1021 | ||
1022 | if (!include_phy && priv->last_phy_res[0]) | 1022 | if (!include_phy && priv->last_phy_res[0]) |
1023 | rx_start = (struct iwl4965_rx_phy_res *)&priv->last_phy_res[1]; | 1023 | rx_start = (struct iwl_rx_phy_res *)&priv->last_phy_res[1]; |
1024 | 1024 | ||
1025 | if (!rx_start) { | 1025 | if (!rx_start) { |
1026 | IWL_ERROR("MPDU frame without a PHY data\n"); | 1026 | IWL_ERROR("MPDU frame without a PHY data\n"); |
@@ -1032,8 +1032,8 @@ static void iwl_pass_packet_to_mac80211(struct iwl_priv *priv, | |||
1032 | 1032 | ||
1033 | len = le16_to_cpu(rx_start->byte_count); | 1033 | len = le16_to_cpu(rx_start->byte_count); |
1034 | 1034 | ||
1035 | rx_end = (__le32 *) ((u8 *) &pkt->u.raw[0] + | 1035 | rx_end = (__le32 *)((u8 *) &pkt->u.raw[0] + |
1036 | sizeof(struct iwl4965_rx_phy_res) + | 1036 | sizeof(struct iwl_rx_phy_res) + |
1037 | rx_start->cfg_phy_cnt + len); | 1037 | rx_start->cfg_phy_cnt + len); |
1038 | 1038 | ||
1039 | } else { | 1039 | } else { |
@@ -1084,40 +1084,13 @@ static void iwl_pass_packet_to_mac80211(struct iwl_priv *priv, | |||
1084 | } | 1084 | } |
1085 | 1085 | ||
1086 | /* Calc max signal level (dBm) among 3 possible receivers */ | 1086 | /* Calc max signal level (dBm) among 3 possible receivers */ |
1087 | static int iwl_calc_rssi(struct iwl_priv *priv, | 1087 | static inline int iwl_calc_rssi(struct iwl_priv *priv, |
1088 | struct iwl4965_rx_phy_res *rx_resp) | 1088 | struct iwl_rx_phy_res *rx_resp) |
1089 | { | 1089 | { |
1090 | /* data from PHY/DSP regarding signal strength, etc., | 1090 | return priv->cfg->ops->utils->calc_rssi(priv, rx_resp); |
1091 | * contents are always there, not configurable by host. */ | ||
1092 | struct iwl4965_rx_non_cfg_phy *ncphy = | ||
1093 | (struct iwl4965_rx_non_cfg_phy *)rx_resp->non_cfg_phy; | ||
1094 | u32 agc = (le16_to_cpu(ncphy->agc_info) & IWL_AGC_DB_MASK) | ||
1095 | >> IWL_AGC_DB_POS; | ||
1096 | |||
1097 | u32 valid_antennae = | ||
1098 | (le16_to_cpu(rx_resp->phy_flags) & RX_PHY_FLAGS_ANTENNAE_MASK) | ||
1099 | >> RX_PHY_FLAGS_ANTENNAE_OFFSET; | ||
1100 | u8 max_rssi = 0; | ||
1101 | u32 i; | ||
1102 | |||
1103 | /* Find max rssi among 3 possible receivers. | ||
1104 | * These values are measured by the digital signal processor (DSP). | ||
1105 | * They should stay fairly constant even as the signal strength varies, | ||
1106 | * if the radio's automatic gain control (AGC) is working right. | ||
1107 | * AGC value (see below) will provide the "interesting" info. */ | ||
1108 | for (i = 0; i < 3; i++) | ||
1109 | if (valid_antennae & (1 << i)) | ||
1110 | max_rssi = max(ncphy->rssi_info[i << 1], max_rssi); | ||
1111 | |||
1112 | IWL_DEBUG_STATS("Rssi In A %d B %d C %d Max %d AGC dB %d\n", | ||
1113 | ncphy->rssi_info[0], ncphy->rssi_info[2], ncphy->rssi_info[4], | ||
1114 | max_rssi, agc); | ||
1115 | |||
1116 | /* dBm = max_rssi dB - agc dB - constant. | ||
1117 | * Higher AGC (higher radio gain) means lower signal. */ | ||
1118 | return max_rssi - agc - IWL_RSSI_OFFSET; | ||
1119 | } | 1091 | } |
1120 | 1092 | ||
1093 | |||
1121 | static void iwl_sta_modify_ps_wake(struct iwl_priv *priv, int sta_id) | 1094 | static void iwl_sta_modify_ps_wake(struct iwl_priv *priv, int sta_id) |
1122 | { | 1095 | { |
1123 | unsigned long flags; | 1096 | unsigned long flags; |
@@ -1180,9 +1153,9 @@ void iwl_rx_reply_rx(struct iwl_priv *priv, | |||
1180 | * this rx packet for legacy frames, | 1153 | * this rx packet for legacy frames, |
1181 | * or phy data cached from REPLY_RX_PHY_CMD for HT frames. */ | 1154 | * or phy data cached from REPLY_RX_PHY_CMD for HT frames. */ |
1182 | int include_phy = (pkt->hdr.cmd == REPLY_RX); | 1155 | int include_phy = (pkt->hdr.cmd == REPLY_RX); |
1183 | struct iwl4965_rx_phy_res *rx_start = (include_phy) ? | 1156 | struct iwl_rx_phy_res *rx_start = (include_phy) ? |
1184 | (struct iwl4965_rx_phy_res *)&(pkt->u.raw[0]) : | 1157 | (struct iwl_rx_phy_res *)&(pkt->u.raw[0]) : |
1185 | (struct iwl4965_rx_phy_res *)&priv->last_phy_res[1]; | 1158 | (struct iwl_rx_phy_res *)&priv->last_phy_res[1]; |
1186 | __le32 *rx_end; | 1159 | __le32 *rx_end; |
1187 | unsigned int len = 0; | 1160 | unsigned int len = 0; |
1188 | u16 fc; | 1161 | u16 fc; |
@@ -1210,7 +1183,7 @@ void iwl_rx_reply_rx(struct iwl_priv *priv, | |||
1210 | 1183 | ||
1211 | if (!include_phy) { | 1184 | if (!include_phy) { |
1212 | if (priv->last_phy_res[0]) | 1185 | if (priv->last_phy_res[0]) |
1213 | rx_start = (struct iwl4965_rx_phy_res *) | 1186 | rx_start = (struct iwl_rx_phy_res *) |
1214 | &priv->last_phy_res[1]; | 1187 | &priv->last_phy_res[1]; |
1215 | else | 1188 | else |
1216 | rx_start = NULL; | 1189 | rx_start = NULL; |
@@ -1227,7 +1200,7 @@ void iwl_rx_reply_rx(struct iwl_priv *priv, | |||
1227 | 1200 | ||
1228 | len = le16_to_cpu(rx_start->byte_count); | 1201 | len = le16_to_cpu(rx_start->byte_count); |
1229 | rx_end = (__le32 *)(pkt->u.raw + rx_start->cfg_phy_cnt + | 1202 | rx_end = (__le32 *)(pkt->u.raw + rx_start->cfg_phy_cnt + |
1230 | sizeof(struct iwl4965_rx_phy_res) + len); | 1203 | sizeof(struct iwl_rx_phy_res) + len); |
1231 | } else { | 1204 | } else { |
1232 | struct iwl4965_rx_mpdu_res_start *amsdu = | 1205 | struct iwl4965_rx_mpdu_res_start *amsdu = |
1233 | (struct iwl4965_rx_mpdu_res_start *)pkt->u.raw; | 1206 | (struct iwl4965_rx_mpdu_res_start *)pkt->u.raw; |
@@ -1316,6 +1289,6 @@ void iwl_rx_reply_rx_phy(struct iwl_priv *priv, | |||
1316 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; | 1289 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; |
1317 | priv->last_phy_res[0] = 1; | 1290 | priv->last_phy_res[0] = 1; |
1318 | memcpy(&priv->last_phy_res[1], &(pkt->u.raw[0]), | 1291 | memcpy(&priv->last_phy_res[1], &(pkt->u.raw[0]), |
1319 | sizeof(struct iwl4965_rx_phy_res)); | 1292 | sizeof(struct iwl_rx_phy_res)); |
1320 | } | 1293 | } |
1321 | EXPORT_SYMBOL(iwl_rx_reply_rx_phy); | 1294 | EXPORT_SYMBOL(iwl_rx_reply_rx_phy); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index 5a00ac23e2d0..9bb6adb28b73 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
@@ -202,6 +202,7 @@ static int iwl_send_scan_abort(struct iwl_priv *priv) | |||
202 | clear_bit(STATUS_SCAN_HW, &priv->status); | 202 | clear_bit(STATUS_SCAN_HW, &priv->status); |
203 | } | 203 | } |
204 | 204 | ||
205 | priv->alloc_rxb_skb--; | ||
205 | dev_kfree_skb_any(cmd.meta.u.skb); | 206 | dev_kfree_skb_any(cmd.meta.u.skb); |
206 | 207 | ||
207 | return ret; | 208 | return ret; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c index 6d1467d0bd9d..60a6e0106036 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-sta.c | |||
@@ -823,7 +823,7 @@ int iwl_send_lq_cmd(struct iwl_priv *priv, | |||
823 | if (lq->sta_id == 0xFF) | 823 | if (lq->sta_id == 0xFF) |
824 | lq->sta_id = IWL_AP_ID; | 824 | lq->sta_id = IWL_AP_ID; |
825 | 825 | ||
826 | iwl_dump_lq_cmd(priv,lq); | 826 | iwl_dump_lq_cmd(priv, lq); |
827 | 827 | ||
828 | if (iwl_is_associated(priv) && priv->assoc_station_added) | 828 | if (iwl_is_associated(priv) && priv->assoc_station_added) |
829 | return iwl_send_cmd(priv, &cmd); | 829 | return iwl_send_cmd(priv, &cmd); |
@@ -839,7 +839,7 @@ EXPORT_SYMBOL(iwl_send_lq_cmd); | |||
839 | * for automatic fallback during transmission. | 839 | * for automatic fallback during transmission. |
840 | * | 840 | * |
841 | * NOTE: This sets up a default set of values. These will be replaced later | 841 | * NOTE: This sets up a default set of values. These will be replaced later |
842 | * if the driver's iwl-4965-rs rate scaling algorithm is used, instead of | 842 | * if the driver's iwl-agn-rs rate scaling algorithm is used, instead of |
843 | * rc80211_simple. | 843 | * rc80211_simple. |
844 | * | 844 | * |
845 | * NOTE: Run REPLY_ADD_STA command to set up station table entry, before | 845 | * NOTE: Run REPLY_ADD_STA command to set up station table entry, before |
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index f72cd0bf6aa3..aa98c76d8195 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
@@ -208,11 +208,12 @@ EXPORT_SYMBOL(iwl_txq_update_write_ptr); | |||
208 | * Free all buffers. | 208 | * Free all buffers. |
209 | * 0-fill, but do not free "txq" descriptor structure. | 209 | * 0-fill, but do not free "txq" descriptor structure. |
210 | */ | 210 | */ |
211 | static void iwl_tx_queue_free(struct iwl_priv *priv, struct iwl_tx_queue *txq) | 211 | static void iwl_tx_queue_free(struct iwl_priv *priv, int txq_id) |
212 | { | 212 | { |
213 | struct iwl_tx_queue *txq = &priv->txq[txq_id]; | ||
213 | struct iwl_queue *q = &txq->q; | 214 | struct iwl_queue *q = &txq->q; |
214 | struct pci_dev *dev = priv->pci_dev; | 215 | struct pci_dev *dev = priv->pci_dev; |
215 | int len; | 216 | int i, slots_num, len; |
216 | 217 | ||
217 | if (q->n_bd == 0) | 218 | if (q->n_bd == 0) |
218 | return; | 219 | return; |
@@ -227,7 +228,12 @@ static void iwl_tx_queue_free(struct iwl_priv *priv, struct iwl_tx_queue *txq) | |||
227 | len += IWL_MAX_SCAN_SIZE; | 228 | len += IWL_MAX_SCAN_SIZE; |
228 | 229 | ||
229 | /* De-alloc array of command/tx buffers */ | 230 | /* De-alloc array of command/tx buffers */ |
230 | pci_free_consistent(dev, len, txq->cmd, txq->dma_addr_cmd); | 231 | slots_num = (txq_id == IWL_CMD_QUEUE_NUM) ? |
232 | TFD_CMD_SLOTS : TFD_TX_CMD_SLOTS; | ||
233 | for (i = 0; i < slots_num; i++) | ||
234 | kfree(txq->cmd[i]); | ||
235 | if (txq_id == IWL_CMD_QUEUE_NUM) | ||
236 | kfree(txq->cmd[slots_num]); | ||
231 | 237 | ||
232 | /* De-alloc circular buffer of TFDs */ | 238 | /* De-alloc circular buffer of TFDs */ |
233 | if (txq->q.n_bd) | 239 | if (txq->q.n_bd) |
@@ -400,8 +406,7 @@ static int iwl_tx_queue_init(struct iwl_priv *priv, | |||
400 | struct iwl_tx_queue *txq, | 406 | struct iwl_tx_queue *txq, |
401 | int slots_num, u32 txq_id) | 407 | int slots_num, u32 txq_id) |
402 | { | 408 | { |
403 | struct pci_dev *dev = priv->pci_dev; | 409 | int i, len; |
404 | int len; | ||
405 | int rc = 0; | 410 | int rc = 0; |
406 | 411 | ||
407 | /* | 412 | /* |
@@ -412,17 +417,25 @@ static int iwl_tx_queue_init(struct iwl_priv *priv, | |||
412 | * For normal Tx queues (all other queues), no super-size command | 417 | * For normal Tx queues (all other queues), no super-size command |
413 | * space is needed. | 418 | * space is needed. |
414 | */ | 419 | */ |
415 | len = sizeof(struct iwl_cmd) * slots_num; | 420 | len = sizeof(struct iwl_cmd); |
416 | if (txq_id == IWL_CMD_QUEUE_NUM) | 421 | for (i = 0; i <= slots_num; i++) { |
417 | len += IWL_MAX_SCAN_SIZE; | 422 | if (i == slots_num) { |
418 | txq->cmd = pci_alloc_consistent(dev, len, &txq->dma_addr_cmd); | 423 | if (txq_id == IWL_CMD_QUEUE_NUM) |
419 | if (!txq->cmd) | 424 | len += IWL_MAX_SCAN_SIZE; |
420 | return -ENOMEM; | 425 | else |
426 | continue; | ||
427 | } | ||
428 | |||
429 | txq->cmd[i] = kmalloc(len, GFP_KERNEL | GFP_DMA); | ||
430 | if (!txq->cmd[i]) | ||
431 | return -ENOMEM; | ||
432 | } | ||
421 | 433 | ||
422 | /* Alloc driver data array and TFD circular buffer */ | 434 | /* Alloc driver data array and TFD circular buffer */ |
423 | rc = iwl_tx_queue_alloc(priv, txq, txq_id); | 435 | rc = iwl_tx_queue_alloc(priv, txq, txq_id); |
424 | if (rc) { | 436 | if (rc) { |
425 | pci_free_consistent(dev, len, txq->cmd, txq->dma_addr_cmd); | 437 | for (i = 0; i < slots_num; i++) |
438 | kfree(txq->cmd[i]); | ||
426 | 439 | ||
427 | return -ENOMEM; | 440 | return -ENOMEM; |
428 | } | 441 | } |
@@ -451,7 +464,7 @@ void iwl_hw_txq_ctx_free(struct iwl_priv *priv) | |||
451 | 464 | ||
452 | /* Tx queues */ | 465 | /* Tx queues */ |
453 | for (txq_id = 0; txq_id < priv->hw_params.max_txq_num; txq_id++) | 466 | for (txq_id = 0; txq_id < priv->hw_params.max_txq_num; txq_id++) |
454 | iwl_tx_queue_free(priv, &priv->txq[txq_id]); | 467 | iwl_tx_queue_free(priv, txq_id); |
455 | 468 | ||
456 | /* Keep-warm buffer */ | 469 | /* Keep-warm buffer */ |
457 | iwl_kw_free(priv); | 470 | iwl_kw_free(priv); |
@@ -859,7 +872,7 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
859 | txq->txb[q->write_ptr].skb[0] = skb; | 872 | txq->txb[q->write_ptr].skb[0] = skb; |
860 | 873 | ||
861 | /* Set up first empty entry in queue's array of Tx/cmd buffers */ | 874 | /* Set up first empty entry in queue's array of Tx/cmd buffers */ |
862 | out_cmd = &txq->cmd[idx]; | 875 | out_cmd = txq->cmd[idx]; |
863 | tx_cmd = &out_cmd->cmd.tx; | 876 | tx_cmd = &out_cmd->cmd.tx; |
864 | memset(&out_cmd->hdr, 0, sizeof(out_cmd->hdr)); | 877 | memset(&out_cmd->hdr, 0, sizeof(out_cmd->hdr)); |
865 | memset(tx_cmd, 0, sizeof(struct iwl_tx_cmd)); | 878 | memset(tx_cmd, 0, sizeof(struct iwl_tx_cmd)); |
@@ -899,8 +912,9 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
899 | 912 | ||
900 | /* Physical address of this Tx command's header (not MAC header!), | 913 | /* Physical address of this Tx command's header (not MAC header!), |
901 | * within command buffer array. */ | 914 | * within command buffer array. */ |
902 | txcmd_phys = txq->dma_addr_cmd + sizeof(struct iwl_cmd) * idx + | 915 | txcmd_phys = pci_map_single(priv->pci_dev, out_cmd, |
903 | offsetof(struct iwl_cmd, hdr); | 916 | sizeof(struct iwl_cmd), PCI_DMA_TODEVICE); |
917 | txcmd_phys += offsetof(struct iwl_cmd, hdr); | ||
904 | 918 | ||
905 | /* Add buffer containing Tx command and MAC(!) header to TFD's | 919 | /* Add buffer containing Tx command and MAC(!) header to TFD's |
906 | * first entry */ | 920 | * first entry */ |
@@ -962,16 +976,16 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
962 | if (ret) | 976 | if (ret) |
963 | return ret; | 977 | return ret; |
964 | 978 | ||
965 | if ((iwl_queue_space(q) < q->high_mark) | 979 | if ((iwl_queue_space(q) < q->high_mark) && priv->mac80211_registered) { |
966 | && priv->mac80211_registered) { | ||
967 | if (wait_write_ptr) { | 980 | if (wait_write_ptr) { |
968 | spin_lock_irqsave(&priv->lock, flags); | 981 | spin_lock_irqsave(&priv->lock, flags); |
969 | txq->need_update = 1; | 982 | txq->need_update = 1; |
970 | iwl_txq_update_write_ptr(priv, txq); | 983 | iwl_txq_update_write_ptr(priv, txq); |
971 | spin_unlock_irqrestore(&priv->lock, flags); | 984 | spin_unlock_irqrestore(&priv->lock, flags); |
985 | } else { | ||
986 | ieee80211_stop_queue(priv->hw, | ||
987 | skb_get_queue_mapping(skb)); | ||
972 | } | 988 | } |
973 | |||
974 | ieee80211_stop_queue(priv->hw, skb_get_queue_mapping(skb)); | ||
975 | } | 989 | } |
976 | 990 | ||
977 | return 0; | 991 | return 0; |
@@ -1004,7 +1018,7 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) | |||
1004 | u32 idx; | 1018 | u32 idx; |
1005 | u16 fix_size; | 1019 | u16 fix_size; |
1006 | dma_addr_t phys_addr; | 1020 | dma_addr_t phys_addr; |
1007 | int ret; | 1021 | int len, ret; |
1008 | unsigned long flags; | 1022 | unsigned long flags; |
1009 | 1023 | ||
1010 | cmd->len = priv->cfg->ops->utils->get_hcmd_size(cmd->id, cmd->len); | 1024 | cmd->len = priv->cfg->ops->utils->get_hcmd_size(cmd->id, cmd->len); |
@@ -1034,7 +1048,7 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) | |||
1034 | control_flags = (u32 *) tfd; | 1048 | control_flags = (u32 *) tfd; |
1035 | 1049 | ||
1036 | idx = get_cmd_index(q, q->write_ptr, cmd->meta.flags & CMD_SIZE_HUGE); | 1050 | idx = get_cmd_index(q, q->write_ptr, cmd->meta.flags & CMD_SIZE_HUGE); |
1037 | out_cmd = &txq->cmd[idx]; | 1051 | out_cmd = txq->cmd[idx]; |
1038 | 1052 | ||
1039 | out_cmd->hdr.cmd = cmd->id; | 1053 | out_cmd->hdr.cmd = cmd->id; |
1040 | memcpy(&out_cmd->meta, &cmd->meta, sizeof(cmd->meta)); | 1054 | memcpy(&out_cmd->meta, &cmd->meta, sizeof(cmd->meta)); |
@@ -1048,9 +1062,11 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) | |||
1048 | INDEX_TO_SEQ(q->write_ptr)); | 1062 | INDEX_TO_SEQ(q->write_ptr)); |
1049 | if (out_cmd->meta.flags & CMD_SIZE_HUGE) | 1063 | if (out_cmd->meta.flags & CMD_SIZE_HUGE) |
1050 | out_cmd->hdr.sequence |= cpu_to_le16(SEQ_HUGE_FRAME); | 1064 | out_cmd->hdr.sequence |= cpu_to_le16(SEQ_HUGE_FRAME); |
1051 | 1065 | len = (idx == TFD_CMD_SLOTS) ? | |
1052 | phys_addr = txq->dma_addr_cmd + sizeof(txq->cmd[0]) * idx + | 1066 | IWL_MAX_SCAN_SIZE : sizeof(struct iwl_cmd); |
1053 | offsetof(struct iwl_cmd, hdr); | 1067 | phys_addr = pci_map_single(priv->pci_dev, out_cmd, len, |
1068 | PCI_DMA_TODEVICE); | ||
1069 | phys_addr += offsetof(struct iwl_cmd, hdr); | ||
1054 | iwl_hw_txq_attach_buf_to_tfd(priv, tfd, phys_addr, fix_size); | 1070 | iwl_hw_txq_attach_buf_to_tfd(priv, tfd, phys_addr, fix_size); |
1055 | 1071 | ||
1056 | IWL_DEBUG_HC("Sending command %s (#%x), seq: 0x%04X, " | 1072 | IWL_DEBUG_HC("Sending command %s (#%x), seq: 0x%04X, " |
@@ -1115,6 +1131,9 @@ static void iwl_hcmd_queue_reclaim(struct iwl_priv *priv, int txq_id, int index) | |||
1115 | { | 1131 | { |
1116 | struct iwl_tx_queue *txq = &priv->txq[txq_id]; | 1132 | struct iwl_tx_queue *txq = &priv->txq[txq_id]; |
1117 | struct iwl_queue *q = &txq->q; | 1133 | struct iwl_queue *q = &txq->q; |
1134 | struct iwl_tfd_frame *bd = &txq->bd[index]; | ||
1135 | dma_addr_t dma_addr; | ||
1136 | int is_odd, buf_len; | ||
1118 | int nfreed = 0; | 1137 | int nfreed = 0; |
1119 | 1138 | ||
1120 | if ((index >= q->n_bd) || (iwl_queue_used(q, index) == 0)) { | 1139 | if ((index >= q->n_bd) || (iwl_queue_used(q, index) == 0)) { |
@@ -1132,6 +1151,19 @@ static void iwl_hcmd_queue_reclaim(struct iwl_priv *priv, int txq_id, int index) | |||
1132 | q->write_ptr, q->read_ptr); | 1151 | q->write_ptr, q->read_ptr); |
1133 | queue_work(priv->workqueue, &priv->restart); | 1152 | queue_work(priv->workqueue, &priv->restart); |
1134 | } | 1153 | } |
1154 | is_odd = (index/2) & 0x1; | ||
1155 | if (is_odd) { | ||
1156 | dma_addr = IWL_GET_BITS(bd->pa[index], tb2_addr_lo16) | | ||
1157 | (IWL_GET_BITS(bd->pa[index], | ||
1158 | tb2_addr_hi20) << 16); | ||
1159 | buf_len = IWL_GET_BITS(bd->pa[index], tb2_len); | ||
1160 | } else { | ||
1161 | dma_addr = le32_to_cpu(bd->pa[index].tb1_addr); | ||
1162 | buf_len = IWL_GET_BITS(bd->pa[index], tb1_len); | ||
1163 | } | ||
1164 | |||
1165 | pci_unmap_single(priv->pci_dev, dma_addr, buf_len, | ||
1166 | PCI_DMA_TODEVICE); | ||
1135 | nfreed++; | 1167 | nfreed++; |
1136 | } | 1168 | } |
1137 | } | 1169 | } |
@@ -1163,7 +1195,7 @@ void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb) | |||
1163 | BUG_ON(txq_id != IWL_CMD_QUEUE_NUM); | 1195 | BUG_ON(txq_id != IWL_CMD_QUEUE_NUM); |
1164 | 1196 | ||
1165 | cmd_index = get_cmd_index(&priv->txq[IWL_CMD_QUEUE_NUM].q, index, huge); | 1197 | cmd_index = get_cmd_index(&priv->txq[IWL_CMD_QUEUE_NUM].q, index, huge); |
1166 | cmd = &priv->txq[IWL_CMD_QUEUE_NUM].cmd[cmd_index]; | 1198 | cmd = priv->txq[IWL_CMD_QUEUE_NUM].cmd[cmd_index]; |
1167 | 1199 | ||
1168 | /* Input error checking is done when commands are added to queue. */ | 1200 | /* Input error checking is done when commands are added to queue. */ |
1169 | if (cmd->meta.flags & CMD_WANT_SKB) { | 1201 | if (cmd->meta.flags & CMD_WANT_SKB) { |
@@ -1391,7 +1423,7 @@ static int iwl_tx_status_reply_compressed_ba(struct iwl_priv *priv, | |||
1391 | /* For each frame attempted in aggregation, | 1423 | /* For each frame attempted in aggregation, |
1392 | * update driver's record of tx frame's status. */ | 1424 | * update driver's record of tx frame's status. */ |
1393 | for (i = 0; i < agg->frame_count ; i++) { | 1425 | for (i = 0; i < agg->frame_count ; i++) { |
1394 | ack = bitmap & (1 << i); | 1426 | ack = bitmap & (1ULL << i); |
1395 | successes += !!ack; | 1427 | successes += !!ack; |
1396 | IWL_DEBUG_TX_REPLY("%s ON i=%d idx=%d raw=%d\n", | 1428 | IWL_DEBUG_TX_REPLY("%s ON i=%d idx=%d raw=%d\n", |
1397 | ack? "ACK":"NACK", i, (agg->start_idx + i) & 0xff, | 1429 | ack? "ACK":"NACK", i, (agg->start_idx + i) & 0xff, |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 7c82ecfa30a4..444847ab1b5a 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -275,10 +275,8 @@ static int iwl3945_tx_queue_alloc(struct iwl3945_priv *priv, | |||
275 | return 0; | 275 | return 0; |
276 | 276 | ||
277 | error: | 277 | error: |
278 | if (txq->txb) { | 278 | kfree(txq->txb); |
279 | kfree(txq->txb); | 279 | txq->txb = NULL; |
280 | txq->txb = NULL; | ||
281 | } | ||
282 | 280 | ||
283 | return -ENOMEM; | 281 | return -ENOMEM; |
284 | } | 282 | } |
@@ -365,10 +363,8 @@ void iwl3945_tx_queue_free(struct iwl3945_priv *priv, struct iwl3945_tx_queue *t | |||
365 | txq->q.n_bd, txq->bd, txq->q.dma_addr); | 363 | txq->q.n_bd, txq->bd, txq->q.dma_addr); |
366 | 364 | ||
367 | /* De-alloc array of per-TFD driver data */ | 365 | /* De-alloc array of per-TFD driver data */ |
368 | if (txq->txb) { | 366 | kfree(txq->txb); |
369 | kfree(txq->txb); | 367 | txq->txb = NULL; |
370 | txq->txb = NULL; | ||
371 | } | ||
372 | 368 | ||
373 | /* 0-fill queue descriptor structure */ | 369 | /* 0-fill queue descriptor structure */ |
374 | memset(txq, 0, sizeof(*txq)); | 370 | memset(txq, 0, sizeof(*txq)); |
@@ -2703,9 +2699,8 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb) | |||
2703 | 2699 | ||
2704 | if (!ieee80211_has_morefrags(hdr->frame_control)) { | 2700 | if (!ieee80211_has_morefrags(hdr->frame_control)) { |
2705 | txq->need_update = 1; | 2701 | txq->need_update = 1; |
2706 | if (qc) { | 2702 | if (qc) |
2707 | priv->stations[sta_id].tid[tid].seq_number = seq_number; | 2703 | priv->stations[sta_id].tid[tid].seq_number = seq_number; |
2708 | } | ||
2709 | } else { | 2704 | } else { |
2710 | wait_write_ptr = 1; | 2705 | wait_write_ptr = 1; |
2711 | txq->need_update = 0; | 2706 | txq->need_update = 0; |
@@ -3813,7 +3808,7 @@ int iwl3945_calc_db_from_ratio(int sig_ratio) | |||
3813 | /* 100:1 or higher, divide by 10 and use table, | 3808 | /* 100:1 or higher, divide by 10 and use table, |
3814 | * add 20 dB to make up for divide by 10 */ | 3809 | * add 20 dB to make up for divide by 10 */ |
3815 | if (sig_ratio >= 100) | 3810 | if (sig_ratio >= 100) |
3816 | return (20 + (int)ratio2dB[sig_ratio/10]); | 3811 | return 20 + (int)ratio2dB[sig_ratio/10]; |
3817 | 3812 | ||
3818 | /* We shouldn't see this */ | 3813 | /* We shouldn't see this */ |
3819 | if (sig_ratio < 1) | 3814 | if (sig_ratio < 1) |
@@ -5088,7 +5083,7 @@ static void iwl3945_dealloc_ucode_pci(struct iwl3945_priv *priv) | |||
5088 | * iwl3945_verify_inst_full - verify runtime uCode image in card vs. host, | 5083 | * iwl3945_verify_inst_full - verify runtime uCode image in card vs. host, |
5089 | * looking at all data. | 5084 | * looking at all data. |
5090 | */ | 5085 | */ |
5091 | static int iwl3945_verify_inst_full(struct iwl3945_priv *priv, __le32 * image, u32 len) | 5086 | static int iwl3945_verify_inst_full(struct iwl3945_priv *priv, __le32 *image, u32 len) |
5092 | { | 5087 | { |
5093 | u32 val; | 5088 | u32 val; |
5094 | u32 save_len = len; | 5089 | u32 save_len = len; |
@@ -5237,7 +5232,7 @@ static int iwl3945_verify_bsm(struct iwl3945_priv *priv) | |||
5237 | val = iwl3945_read_prph(priv, BSM_WR_DWCOUNT_REG); | 5232 | val = iwl3945_read_prph(priv, BSM_WR_DWCOUNT_REG); |
5238 | for (reg = BSM_SRAM_LOWER_BOUND; | 5233 | for (reg = BSM_SRAM_LOWER_BOUND; |
5239 | reg < BSM_SRAM_LOWER_BOUND + len; | 5234 | reg < BSM_SRAM_LOWER_BOUND + len; |
5240 | reg += sizeof(u32), image ++) { | 5235 | reg += sizeof(u32), image++) { |
5241 | val = iwl3945_read_prph(priv, reg); | 5236 | val = iwl3945_read_prph(priv, reg); |
5242 | if (val != le32_to_cpu(*image)) { | 5237 | if (val != le32_to_cpu(*image)) { |
5243 | IWL_ERROR("BSM uCode verification failed at " | 5238 | IWL_ERROR("BSM uCode verification failed at " |
@@ -6336,7 +6331,7 @@ static void iwl3945_bg_post_associate(struct work_struct *data) | |||
6336 | DECLARE_MAC_BUF(mac); | 6331 | DECLARE_MAC_BUF(mac); |
6337 | 6332 | ||
6338 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) { | 6333 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) { |
6339 | IWL_ERROR("%s Should not be called in AP mode\n", __FUNCTION__); | 6334 | IWL_ERROR("%s Should not be called in AP mode\n", __func__); |
6340 | return; | 6335 | return; |
6341 | } | 6336 | } |
6342 | 6337 | ||
@@ -6417,7 +6412,7 @@ static void iwl3945_bg_post_associate(struct work_struct *data) | |||
6417 | 6412 | ||
6418 | default: | 6413 | default: |
6419 | IWL_ERROR("%s Should not be called in %d mode\n", | 6414 | IWL_ERROR("%s Should not be called in %d mode\n", |
6420 | __FUNCTION__, priv->iw_mode); | 6415 | __func__, priv->iw_mode); |
6421 | break; | 6416 | break; |
6422 | } | 6417 | } |
6423 | 6418 | ||
@@ -6594,12 +6589,6 @@ static int iwl3945_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
6594 | 6589 | ||
6595 | IWL_DEBUG_MAC80211("enter\n"); | 6590 | IWL_DEBUG_MAC80211("enter\n"); |
6596 | 6591 | ||
6597 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) { | ||
6598 | IWL_DEBUG_MAC80211("leave - monitor\n"); | ||
6599 | dev_kfree_skb_any(skb); | ||
6600 | return 0; | ||
6601 | } | ||
6602 | |||
6603 | IWL_DEBUG_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len, | 6592 | IWL_DEBUG_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len, |
6604 | ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate); | 6593 | ieee80211_get_tx_rate(hw, IEEE80211_SKB_CB(skb))->bitrate); |
6605 | 6594 | ||
@@ -7456,7 +7445,7 @@ static ssize_t show_measurement(struct device *d, | |||
7456 | struct iwl3945_priv *priv = dev_get_drvdata(d); | 7445 | struct iwl3945_priv *priv = dev_get_drvdata(d); |
7457 | struct iwl3945_spectrum_notification measure_report; | 7446 | struct iwl3945_spectrum_notification measure_report; |
7458 | u32 size = sizeof(measure_report), len = 0, ofs = 0; | 7447 | u32 size = sizeof(measure_report), len = 0, ofs = 0; |
7459 | u8 *data = (u8 *) & measure_report; | 7448 | u8 *data = (u8 *)&measure_report; |
7460 | unsigned long flags; | 7449 | unsigned long flags; |
7461 | 7450 | ||
7462 | spin_lock_irqsave(&priv->lock, flags); | 7451 | spin_lock_irqsave(&priv->lock, flags); |
@@ -7627,7 +7616,7 @@ static ssize_t show_power_level(struct device *d, | |||
7627 | else | 7616 | else |
7628 | p += sprintf(p, " \n"); | 7617 | p += sprintf(p, " \n"); |
7629 | 7618 | ||
7630 | return (p - buf + 1); | 7619 | return p - buf + 1; |
7631 | 7620 | ||
7632 | } | 7621 | } |
7633 | 7622 | ||
@@ -7649,7 +7638,7 @@ static ssize_t show_statistics(struct device *d, | |||
7649 | struct iwl3945_priv *priv = dev_get_drvdata(d); | 7638 | struct iwl3945_priv *priv = dev_get_drvdata(d); |
7650 | u32 size = sizeof(struct iwl3945_notif_statistics); | 7639 | u32 size = sizeof(struct iwl3945_notif_statistics); |
7651 | u32 len = 0, ofs = 0; | 7640 | u32 len = 0, ofs = 0; |
7652 | u8 *data = (u8 *) & priv->statistics; | 7641 | u8 *data = (u8 *)&priv->statistics; |
7653 | int rc = 0; | 7642 | int rc = 0; |
7654 | 7643 | ||
7655 | if (!iwl3945_is_alive(priv)) | 7644 | if (!iwl3945_is_alive(priv)) |
@@ -8003,16 +7992,16 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
8003 | 7992 | ||
8004 | /* nic init */ | 7993 | /* nic init */ |
8005 | iwl3945_set_bit(priv, CSR_GIO_CHICKEN_BITS, | 7994 | iwl3945_set_bit(priv, CSR_GIO_CHICKEN_BITS, |
8006 | CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER); | 7995 | CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER); |
8007 | 7996 | ||
8008 | iwl3945_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | 7997 | iwl3945_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); |
8009 | err = iwl3945_poll_bit(priv, CSR_GP_CNTRL, | 7998 | err = iwl3945_poll_bit(priv, CSR_GP_CNTRL, |
8010 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | 7999 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, |
8011 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); | 8000 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); |
8012 | if (err < 0) { | 8001 | if (err < 0) { |
8013 | IWL_DEBUG_INFO("Failed to init the card\n"); | 8002 | IWL_DEBUG_INFO("Failed to init the card\n"); |
8014 | goto out_remove_sysfs; | 8003 | goto out_remove_sysfs; |
8015 | } | 8004 | } |
8016 | /* Read the EEPROM */ | 8005 | /* Read the EEPROM */ |
8017 | err = iwl3945_eeprom_init(priv); | 8006 | err = iwl3945_eeprom_init(priv); |
8018 | if (err) { | 8007 | if (err) { |
@@ -8114,9 +8103,8 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev) | |||
8114 | iwl3945_unset_hw_setting(priv); | 8103 | iwl3945_unset_hw_setting(priv); |
8115 | iwl3945_clear_stations_table(priv); | 8104 | iwl3945_clear_stations_table(priv); |
8116 | 8105 | ||
8117 | if (priv->mac80211_registered) { | 8106 | if (priv->mac80211_registered) |
8118 | ieee80211_unregister_hw(priv->hw); | 8107 | ieee80211_unregister_hw(priv->hw); |
8119 | } | ||
8120 | 8108 | ||
8121 | /*netif_stop_queue(dev); */ | 8109 | /*netif_stop_queue(dev); */ |
8122 | flush_workqueue(priv->workqueue); | 8110 | flush_workqueue(priv->workqueue); |
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c index 14d5d61cec4c..bd32ac0b4e07 100644 --- a/drivers/net/wireless/libertas/main.c +++ b/drivers/net/wireless/libertas/main.c | |||
@@ -297,9 +297,7 @@ static ssize_t lbs_rtap_set(struct device *dev, | |||
297 | lbs_add_rtap(priv); | 297 | lbs_add_rtap(priv); |
298 | } | 298 | } |
299 | priv->monitormode = monitor_mode; | 299 | priv->monitormode = monitor_mode; |
300 | } | 300 | } else { |
301 | |||
302 | else { | ||
303 | if (!priv->monitormode) | 301 | if (!priv->monitormode) |
304 | return strlen(buf); | 302 | return strlen(buf); |
305 | priv->monitormode = 0; | 303 | priv->monitormode = 0; |
@@ -1242,8 +1240,6 @@ int lbs_start_card(struct lbs_private *priv) | |||
1242 | lbs_pr_err("cannot register ethX device\n"); | 1240 | lbs_pr_err("cannot register ethX device\n"); |
1243 | goto done; | 1241 | goto done; |
1244 | } | 1242 | } |
1245 | if (device_create_file(&dev->dev, &dev_attr_lbs_rtap)) | ||
1246 | lbs_pr_err("cannot register lbs_rtap attribute\n"); | ||
1247 | 1243 | ||
1248 | lbs_update_channel(priv); | 1244 | lbs_update_channel(priv); |
1249 | 1245 | ||
@@ -1275,6 +1271,13 @@ int lbs_start_card(struct lbs_private *priv) | |||
1275 | 1271 | ||
1276 | if (device_create_file(&dev->dev, &dev_attr_lbs_mesh)) | 1272 | if (device_create_file(&dev->dev, &dev_attr_lbs_mesh)) |
1277 | lbs_pr_err("cannot register lbs_mesh attribute\n"); | 1273 | lbs_pr_err("cannot register lbs_mesh attribute\n"); |
1274 | |||
1275 | /* While rtap isn't related to mesh, only mesh-enabled | ||
1276 | * firmware implements the rtap functionality via | ||
1277 | * CMD_802_11_MONITOR_MODE. | ||
1278 | */ | ||
1279 | if (device_create_file(&dev->dev, &dev_attr_lbs_rtap)) | ||
1280 | lbs_pr_err("cannot register lbs_rtap attribute\n"); | ||
1278 | } | 1281 | } |
1279 | } | 1282 | } |
1280 | 1283 | ||
@@ -1306,9 +1309,9 @@ void lbs_stop_card(struct lbs_private *priv) | |||
1306 | netif_carrier_off(priv->dev); | 1309 | netif_carrier_off(priv->dev); |
1307 | 1310 | ||
1308 | lbs_debugfs_remove_one(priv); | 1311 | lbs_debugfs_remove_one(priv); |
1309 | device_remove_file(&dev->dev, &dev_attr_lbs_rtap); | ||
1310 | if (priv->mesh_tlv) { | 1312 | if (priv->mesh_tlv) { |
1311 | device_remove_file(&dev->dev, &dev_attr_lbs_mesh); | 1313 | device_remove_file(&dev->dev, &dev_attr_lbs_mesh); |
1314 | device_remove_file(&dev->dev, &dev_attr_lbs_rtap); | ||
1312 | } | 1315 | } |
1313 | 1316 | ||
1314 | /* Flush pending command nodes */ | 1317 | /* Flush pending command nodes */ |
diff --git a/drivers/net/wireless/p54/p54.h b/drivers/net/wireless/p54/p54.h index c6f27b9022f9..cac9a515b82d 100644 --- a/drivers/net/wireless/p54/p54.h +++ b/drivers/net/wireless/p54/p54.h | |||
@@ -52,6 +52,7 @@ struct p54_common { | |||
52 | int (*open)(struct ieee80211_hw *dev); | 52 | int (*open)(struct ieee80211_hw *dev); |
53 | void (*stop)(struct ieee80211_hw *dev); | 53 | void (*stop)(struct ieee80211_hw *dev); |
54 | int mode; | 54 | int mode; |
55 | struct mutex conf_mutex; | ||
55 | u8 mac_addr[ETH_ALEN]; | 56 | u8 mac_addr[ETH_ALEN]; |
56 | u8 bssid[ETH_ALEN]; | 57 | u8 bssid[ETH_ALEN]; |
57 | struct pda_iq_autocal_entry *iq_autocal; | 58 | struct pda_iq_autocal_entry *iq_autocal; |
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index ffaf7a6b6810..4da89ea9b561 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c | |||
@@ -886,9 +886,12 @@ static void p54_remove_interface(struct ieee80211_hw *dev, | |||
886 | static int p54_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) | 886 | static int p54_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) |
887 | { | 887 | { |
888 | int ret; | 888 | int ret; |
889 | struct p54_common *priv = dev->priv; | ||
889 | 890 | ||
891 | mutex_lock(&priv->conf_mutex); | ||
890 | ret = p54_set_freq(dev, cpu_to_le16(conf->channel->center_freq)); | 892 | ret = p54_set_freq(dev, cpu_to_le16(conf->channel->center_freq)); |
891 | p54_set_vdcf(dev); | 893 | p54_set_vdcf(dev); |
894 | mutex_unlock(&priv->conf_mutex); | ||
892 | return ret; | 895 | return ret; |
893 | } | 896 | } |
894 | 897 | ||
@@ -898,10 +901,12 @@ static int p54_config_interface(struct ieee80211_hw *dev, | |||
898 | { | 901 | { |
899 | struct p54_common *priv = dev->priv; | 902 | struct p54_common *priv = dev->priv; |
900 | 903 | ||
904 | mutex_lock(&priv->conf_mutex); | ||
901 | p54_set_filter(dev, 0, priv->mac_addr, conf->bssid, 0, 1, 0, 0xF642); | 905 | p54_set_filter(dev, 0, priv->mac_addr, conf->bssid, 0, 1, 0, 0xF642); |
902 | p54_set_filter(dev, 0, priv->mac_addr, conf->bssid, 2, 0, 0, 0); | 906 | p54_set_filter(dev, 0, priv->mac_addr, conf->bssid, 2, 0, 0, 0); |
903 | p54_set_leds(dev, 1, !is_multicast_ether_addr(conf->bssid), 0); | 907 | p54_set_leds(dev, 1, !is_multicast_ether_addr(conf->bssid), 0); |
904 | memcpy(priv->bssid, conf->bssid, ETH_ALEN); | 908 | memcpy(priv->bssid, conf->bssid, ETH_ALEN); |
909 | mutex_unlock(&priv->conf_mutex); | ||
905 | return 0; | 910 | return 0; |
906 | } | 911 | } |
907 | 912 | ||
@@ -1009,6 +1014,7 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len) | |||
1009 | } | 1014 | } |
1010 | 1015 | ||
1011 | p54_init_vdcf(dev); | 1016 | p54_init_vdcf(dev); |
1017 | mutex_init(&priv->conf_mutex); | ||
1012 | 1018 | ||
1013 | return dev; | 1019 | return dev; |
1014 | } | 1020 | } |
diff --git a/drivers/net/wireless/prism54/isl_ioctl.c b/drivers/net/wireless/prism54/isl_ioctl.c index 97fa14e0a479..3d75a7137d3c 100644 --- a/drivers/net/wireless/prism54/isl_ioctl.c +++ b/drivers/net/wireless/prism54/isl_ioctl.c | |||
@@ -2518,7 +2518,7 @@ enum { | |||
2518 | 2518 | ||
2519 | #define PRISM2_HOSTAPD_MAX_BUF_SIZE 1024 | 2519 | #define PRISM2_HOSTAPD_MAX_BUF_SIZE 1024 |
2520 | #define PRISM2_HOSTAPD_GENERIC_ELEMENT_HDR_LEN \ | 2520 | #define PRISM2_HOSTAPD_GENERIC_ELEMENT_HDR_LEN \ |
2521 | ((int) (&((struct prism2_hostapd_param *) 0)->u.generic_elem.data)) | 2521 | offsetof(struct prism2_hostapd_param, u.generic_elem.data) |
2522 | 2522 | ||
2523 | /* Maximum length for algorithm names (-1 for nul termination) | 2523 | /* Maximum length for algorithm names (-1 for nul termination) |
2524 | * used in ioctl() */ | 2524 | * used in ioctl() */ |
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index aa6dfb811c71..181a146b4768 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c | |||
@@ -1220,6 +1220,7 @@ static void rt2500pci_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1220 | rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs); | 1220 | rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs); |
1221 | rt2x00_set_field32(&word, TXD_W0_RETRY_MODE, | 1221 | rt2x00_set_field32(&word, TXD_W0_RETRY_MODE, |
1222 | test_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags)); | 1222 | test_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags)); |
1223 | rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, skb->len); | ||
1223 | rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, CIPHER_NONE); | 1224 | rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, CIPHER_NONE); |
1224 | rt2x00_desc_write(txd, 0, word); | 1225 | rt2x00_desc_write(txd, 0, word); |
1225 | } | 1226 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index 3078417b326b..cd5af656932d 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
@@ -633,6 +633,16 @@ static void rt2500usb_reset_tuner(struct rt2x00_dev *rt2x00dev) | |||
633 | rt2x00dev->link.vgc_level = value; | 633 | rt2x00dev->link.vgc_level = value; |
634 | } | 634 | } |
635 | 635 | ||
636 | /* | ||
637 | * NOTE: This function is directly ported from legacy driver, but | ||
638 | * despite it being declared it was never called. Although link tuning | ||
639 | * sounds like a good idea, and usually works well for the other drivers, | ||
640 | * it does _not_ work with rt2500usb. Enabling this function will result | ||
641 | * in TX capabilities only until association kicks in. Immediately | ||
642 | * after the successful association all TX frames will be kept in the | ||
643 | * hardware queue and never transmitted. | ||
644 | */ | ||
645 | #if 0 | ||
636 | static void rt2500usb_link_tuner(struct rt2x00_dev *rt2x00dev) | 646 | static void rt2500usb_link_tuner(struct rt2x00_dev *rt2x00dev) |
637 | { | 647 | { |
638 | int rssi = rt2x00_get_link_rssi(&rt2x00dev->link); | 648 | int rssi = rt2x00_get_link_rssi(&rt2x00dev->link); |
@@ -752,6 +762,9 @@ dynamic_cca_tune: | |||
752 | rt2x00dev->link.vgc_level = r17; | 762 | rt2x00dev->link.vgc_level = r17; |
753 | } | 763 | } |
754 | } | 764 | } |
765 | #else | ||
766 | #define rt2500usb_link_tuner NULL | ||
767 | #endif | ||
755 | 768 | ||
756 | /* | 769 | /* |
757 | * Initialization functions. | 770 | * Initialization functions. |
@@ -1376,6 +1389,9 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev) | |||
1376 | rt2x00_set_field16(&word, EEPROM_BBPTUNE_VGCLOWER, bbp); | 1389 | rt2x00_set_field16(&word, EEPROM_BBPTUNE_VGCLOWER, bbp); |
1377 | rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_VGC, word); | 1390 | rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_VGC, word); |
1378 | EEPROM(rt2x00dev, "BBPtune vgc: 0x%04x\n", word); | 1391 | EEPROM(rt2x00dev, "BBPtune vgc: 0x%04x\n", word); |
1392 | } else { | ||
1393 | rt2x00_set_field16(&word, EEPROM_BBPTUNE_VGCLOWER, bbp); | ||
1394 | rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_VGC, word); | ||
1379 | } | 1395 | } |
1380 | 1396 | ||
1381 | rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R17, &word); | 1397 | rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R17, &word); |
@@ -1384,9 +1400,6 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev) | |||
1384 | rt2x00_set_field16(&word, EEPROM_BBPTUNE_R17_HIGH, 0x41); | 1400 | rt2x00_set_field16(&word, EEPROM_BBPTUNE_R17_HIGH, 0x41); |
1385 | rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_R17, word); | 1401 | rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_R17, word); |
1386 | EEPROM(rt2x00dev, "BBPtune r17: 0x%04x\n", word); | 1402 | EEPROM(rt2x00dev, "BBPtune r17: 0x%04x\n", word); |
1387 | } else { | ||
1388 | rt2x00_set_field16(&word, EEPROM_BBPTUNE_VGCLOWER, bbp); | ||
1389 | rt2x00_eeprom_write(rt2x00dev, EEPROM_BBPTUNE_VGC, word); | ||
1390 | } | 1403 | } |
1391 | 1404 | ||
1392 | rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R24, &word); | 1405 | rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R24, &word); |
@@ -1737,6 +1750,7 @@ static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
1737 | __set_bit(DRIVER_REQUIRE_ATIM_QUEUE, &rt2x00dev->flags); | 1750 | __set_bit(DRIVER_REQUIRE_ATIM_QUEUE, &rt2x00dev->flags); |
1738 | __set_bit(DRIVER_REQUIRE_BEACON_GUARD, &rt2x00dev->flags); | 1751 | __set_bit(DRIVER_REQUIRE_BEACON_GUARD, &rt2x00dev->flags); |
1739 | __set_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags); | 1752 | __set_bit(DRIVER_REQUIRE_SCHEDULED, &rt2x00dev->flags); |
1753 | __set_bit(CONFIG_DISABLE_LINK_TUNING, &rt2x00dev->flags); | ||
1740 | 1754 | ||
1741 | /* | 1755 | /* |
1742 | * Set the rssi offset. | 1756 | * Set the rssi offset. |
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index db2dc976d831..8b10ea41b204 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
@@ -368,6 +368,12 @@ struct rt2x00_intf { | |||
368 | #define DELAYED_CONFIG_ERP 0x00000002 | 368 | #define DELAYED_CONFIG_ERP 0x00000002 |
369 | #define DELAYED_LED_ASSOC 0x00000004 | 369 | #define DELAYED_LED_ASSOC 0x00000004 |
370 | 370 | ||
371 | /* | ||
372 | * Software sequence counter, this is only required | ||
373 | * for hardware which doesn't support hardware | ||
374 | * sequence counting. | ||
375 | */ | ||
376 | spinlock_t seqlock; | ||
371 | u16 seqno; | 377 | u16 seqno; |
372 | }; | 378 | }; |
373 | 379 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c index 3f89516e8332..d134c3be539a 100644 --- a/drivers/net/wireless/rt2x00/rt2x00config.c +++ b/drivers/net/wireless/rt2x00/rt2x00config.c | |||
@@ -254,6 +254,8 @@ config: | |||
254 | libconf.ant.rx = default_ant->rx; | 254 | libconf.ant.rx = default_ant->rx; |
255 | else if (active_ant->rx == ANTENNA_SW_DIVERSITY) | 255 | else if (active_ant->rx == ANTENNA_SW_DIVERSITY) |
256 | libconf.ant.rx = ANTENNA_B; | 256 | libconf.ant.rx = ANTENNA_B; |
257 | else | ||
258 | libconf.ant.rx = active_ant->rx; | ||
257 | 259 | ||
258 | if (conf->antenna_sel_tx) | 260 | if (conf->antenna_sel_tx) |
259 | libconf.ant.tx = conf->antenna_sel_tx; | 261 | libconf.ant.tx = conf->antenna_sel_tx; |
@@ -261,6 +263,8 @@ config: | |||
261 | libconf.ant.tx = default_ant->tx; | 263 | libconf.ant.tx = default_ant->tx; |
262 | else if (active_ant->tx == ANTENNA_SW_DIVERSITY) | 264 | else if (active_ant->tx == ANTENNA_SW_DIVERSITY) |
263 | libconf.ant.tx = ANTENNA_B; | 265 | libconf.ant.tx = ANTENNA_B; |
266 | else | ||
267 | libconf.ant.tx = active_ant->tx; | ||
264 | } | 268 | } |
265 | 269 | ||
266 | if (flags & CONFIG_UPDATE_SLOT_TIME) { | 270 | if (flags & CONFIG_UPDATE_SLOT_TIME) { |
diff --git a/drivers/net/wireless/rt2x00/rt2x00debug.c b/drivers/net/wireless/rt2x00/rt2x00debug.c index 300cf061035f..6bee1d611bbf 100644 --- a/drivers/net/wireless/rt2x00/rt2x00debug.c +++ b/drivers/net/wireless/rt2x00/rt2x00debug.c | |||
@@ -372,9 +372,6 @@ static ssize_t rt2x00debug_write_##__name(struct file *file, \ | |||
372 | if (*offset) \ | 372 | if (*offset) \ |
373 | return 0; \ | 373 | return 0; \ |
374 | \ | 374 | \ |
375 | if (!capable(CAP_NET_ADMIN)) \ | ||
376 | return -EPERM; \ | ||
377 | \ | ||
378 | if (intf->offset_##__name >= debug->__name.word_count) \ | 375 | if (intf->offset_##__name >= debug->__name.word_count) \ |
379 | return -EINVAL; \ | 376 | return -EINVAL; \ |
380 | \ | 377 | \ |
@@ -454,7 +451,7 @@ static struct dentry *rt2x00debug_create_file_driver(const char *name, | |||
454 | data += sprintf(data, "compiled: %s %s\n", __DATE__, __TIME__); | 451 | data += sprintf(data, "compiled: %s %s\n", __DATE__, __TIME__); |
455 | blob->size = strlen(blob->data); | 452 | blob->size = strlen(blob->data); |
456 | 453 | ||
457 | return debugfs_create_blob(name, S_IRUGO, intf->driver_folder, blob); | 454 | return debugfs_create_blob(name, S_IRUSR, intf->driver_folder, blob); |
458 | } | 455 | } |
459 | 456 | ||
460 | static struct dentry *rt2x00debug_create_file_chipset(const char *name, | 457 | static struct dentry *rt2x00debug_create_file_chipset(const char *name, |
@@ -482,7 +479,7 @@ static struct dentry *rt2x00debug_create_file_chipset(const char *name, | |||
482 | data += sprintf(data, "rf length: %d\n", debug->rf.word_count); | 479 | data += sprintf(data, "rf length: %d\n", debug->rf.word_count); |
483 | blob->size = strlen(blob->data); | 480 | blob->size = strlen(blob->data); |
484 | 481 | ||
485 | return debugfs_create_blob(name, S_IRUGO, intf->driver_folder, blob); | 482 | return debugfs_create_blob(name, S_IRUSR, intf->driver_folder, blob); |
486 | } | 483 | } |
487 | 484 | ||
488 | void rt2x00debug_register(struct rt2x00_dev *rt2x00dev) | 485 | void rt2x00debug_register(struct rt2x00_dev *rt2x00dev) |
@@ -517,7 +514,7 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev) | |||
517 | if (IS_ERR(intf->chipset_entry)) | 514 | if (IS_ERR(intf->chipset_entry)) |
518 | goto exit; | 515 | goto exit; |
519 | 516 | ||
520 | intf->dev_flags = debugfs_create_file("dev_flags", S_IRUGO, | 517 | intf->dev_flags = debugfs_create_file("dev_flags", S_IRUSR, |
521 | intf->driver_folder, intf, | 518 | intf->driver_folder, intf, |
522 | &rt2x00debug_fop_dev_flags); | 519 | &rt2x00debug_fop_dev_flags); |
523 | if (IS_ERR(intf->dev_flags)) | 520 | if (IS_ERR(intf->dev_flags)) |
@@ -532,7 +529,7 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev) | |||
532 | ({ \ | 529 | ({ \ |
533 | (__intf)->__name##_off_entry = \ | 530 | (__intf)->__name##_off_entry = \ |
534 | debugfs_create_u32(__stringify(__name) "_offset", \ | 531 | debugfs_create_u32(__stringify(__name) "_offset", \ |
535 | S_IRUGO | S_IWUSR, \ | 532 | S_IRUSR | S_IWUSR, \ |
536 | (__intf)->register_folder, \ | 533 | (__intf)->register_folder, \ |
537 | &(__intf)->offset_##__name); \ | 534 | &(__intf)->offset_##__name); \ |
538 | if (IS_ERR((__intf)->__name##_off_entry)) \ | 535 | if (IS_ERR((__intf)->__name##_off_entry)) \ |
@@ -540,7 +537,7 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev) | |||
540 | \ | 537 | \ |
541 | (__intf)->__name##_val_entry = \ | 538 | (__intf)->__name##_val_entry = \ |
542 | debugfs_create_file(__stringify(__name) "_value", \ | 539 | debugfs_create_file(__stringify(__name) "_value", \ |
543 | S_IRUGO | S_IWUSR, \ | 540 | S_IRUSR | S_IWUSR, \ |
544 | (__intf)->register_folder, \ | 541 | (__intf)->register_folder, \ |
545 | (__intf), &rt2x00debug_fop_##__name);\ | 542 | (__intf), &rt2x00debug_fop_##__name);\ |
546 | if (IS_ERR((__intf)->__name##_val_entry)) \ | 543 | if (IS_ERR((__intf)->__name##_val_entry)) \ |
@@ -560,7 +557,7 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev) | |||
560 | goto exit; | 557 | goto exit; |
561 | 558 | ||
562 | intf->queue_frame_dump_entry = | 559 | intf->queue_frame_dump_entry = |
563 | debugfs_create_file("dump", S_IRUGO, intf->queue_folder, | 560 | debugfs_create_file("dump", S_IRUSR, intf->queue_folder, |
564 | intf, &rt2x00debug_fop_queue_dump); | 561 | intf, &rt2x00debug_fop_queue_dump); |
565 | if (IS_ERR(intf->queue_frame_dump_entry)) | 562 | if (IS_ERR(intf->queue_frame_dump_entry)) |
566 | goto exit; | 563 | goto exit; |
@@ -569,7 +566,7 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev) | |||
569 | init_waitqueue_head(&intf->frame_dump_waitqueue); | 566 | init_waitqueue_head(&intf->frame_dump_waitqueue); |
570 | 567 | ||
571 | intf->queue_stats_entry = | 568 | intf->queue_stats_entry = |
572 | debugfs_create_file("queue", S_IRUGO, intf->queue_folder, | 569 | debugfs_create_file("queue", S_IRUSR, intf->queue_folder, |
573 | intf, &rt2x00debug_fop_queue_stats); | 570 | intf, &rt2x00debug_fop_queue_stats); |
574 | 571 | ||
575 | return; | 572 | return; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index c3ee4ecba792..bd422fd6a894 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
@@ -247,6 +247,7 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw, | |||
247 | rt2x00dev->intf_sta_count++; | 247 | rt2x00dev->intf_sta_count++; |
248 | 248 | ||
249 | spin_lock_init(&intf->lock); | 249 | spin_lock_init(&intf->lock); |
250 | spin_lock_init(&intf->seqlock); | ||
250 | intf->beacon = entry; | 251 | intf->beacon = entry; |
251 | 252 | ||
252 | if (conf->type == IEEE80211_IF_TYPE_AP) | 253 | if (conf->type == IEEE80211_IF_TYPE_AP) |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 3b27f6aa860c..898cdd7f57d9 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -128,6 +128,7 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry, | |||
128 | unsigned int data_length; | 128 | unsigned int data_length; |
129 | unsigned int duration; | 129 | unsigned int duration; |
130 | unsigned int residual; | 130 | unsigned int residual; |
131 | unsigned long irqflags; | ||
131 | 132 | ||
132 | memset(txdesc, 0, sizeof(*txdesc)); | 133 | memset(txdesc, 0, sizeof(*txdesc)); |
133 | 134 | ||
@@ -213,14 +214,14 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry, | |||
213 | * sequence counter given by mac80211. | 214 | * sequence counter given by mac80211. |
214 | */ | 215 | */ |
215 | if (tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { | 216 | if (tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { |
216 | spin_lock(&intf->lock); | 217 | spin_lock_irqsave(&intf->seqlock, irqflags); |
217 | 218 | ||
218 | if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags)) | 219 | if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags)) |
219 | intf->seqno += 0x10; | 220 | intf->seqno += 0x10; |
220 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); | 221 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); |
221 | hdr->seq_ctrl |= cpu_to_le16(intf->seqno); | 222 | hdr->seq_ctrl |= cpu_to_le16(intf->seqno); |
222 | 223 | ||
223 | spin_unlock(&intf->lock); | 224 | spin_unlock_irqrestore(&intf->seqlock, irqflags); |
224 | 225 | ||
225 | __set_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags); | 226 | __set_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags); |
226 | } | 227 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index 933e6cc9359d..8d76bb2e0312 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
@@ -124,7 +124,7 @@ EXPORT_SYMBOL_GPL(rt2x00usb_vendor_request_buff); | |||
124 | 124 | ||
125 | int rt2x00usb_vendor_request_large_buff(struct rt2x00_dev *rt2x00dev, | 125 | int rt2x00usb_vendor_request_large_buff(struct rt2x00_dev *rt2x00dev, |
126 | const u8 request, const u8 requesttype, | 126 | const u8 request, const u8 requesttype, |
127 | const u16 offset, void *buffer, | 127 | const u16 offset, const void *buffer, |
128 | const u16 buffer_length, | 128 | const u16 buffer_length, |
129 | const int timeout) | 129 | const int timeout) |
130 | { | 130 | { |
@@ -134,7 +134,7 @@ int rt2x00usb_vendor_request_large_buff(struct rt2x00_dev *rt2x00dev, | |||
134 | 134 | ||
135 | mutex_lock(&rt2x00dev->usb_cache_mutex); | 135 | mutex_lock(&rt2x00dev->usb_cache_mutex); |
136 | 136 | ||
137 | tb = buffer; | 137 | tb = (char *)buffer; |
138 | off = offset; | 138 | off = offset; |
139 | len = buffer_length; | 139 | len = buffer_length; |
140 | while (len && !status) { | 140 | while (len && !status) { |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.h b/drivers/net/wireless/rt2x00/rt2x00usb.h index ee3875f894aa..3b4a67417f95 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.h +++ b/drivers/net/wireless/rt2x00/rt2x00usb.h | |||
@@ -185,7 +185,7 @@ int rt2x00usb_vendor_req_buff_lock(struct rt2x00_dev *rt2x00dev, | |||
185 | */ | 185 | */ |
186 | int rt2x00usb_vendor_request_large_buff(struct rt2x00_dev *rt2x00dev, | 186 | int rt2x00usb_vendor_request_large_buff(struct rt2x00_dev *rt2x00dev, |
187 | const u8 request, const u8 requesttype, | 187 | const u8 request, const u8 requesttype, |
188 | const u16 offset, void *buffer, | 188 | const u16 offset, const void *buffer, |
189 | const u16 buffer_length, | 189 | const u16 buffer_length, |
190 | const int timeout); | 190 | const int timeout); |
191 | 191 | ||
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index fbe2a652e014..087e90b328cd 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
@@ -1004,6 +1004,11 @@ static int rt61pci_load_firmware(struct rt2x00_dev *rt2x00dev, const void *data, | |||
1004 | } | 1004 | } |
1005 | 1005 | ||
1006 | /* | 1006 | /* |
1007 | * Hardware needs another millisecond before it is ready. | ||
1008 | */ | ||
1009 | msleep(1); | ||
1010 | |||
1011 | /* | ||
1007 | * Reset MAC and BBP registers. | 1012 | * Reset MAC and BBP registers. |
1008 | */ | 1013 | */ |
1009 | reg = 0; | 1014 | reg = 0; |
diff --git a/drivers/net/wireless/rtl8187.h b/drivers/net/wireless/rtl8187.h index 1b0d750f6623..5a9515c99960 100644 --- a/drivers/net/wireless/rtl8187.h +++ b/drivers/net/wireless/rtl8187.h | |||
@@ -94,6 +94,10 @@ struct rtl8187_priv { | |||
94 | const struct rtl818x_rf_ops *rf; | 94 | const struct rtl818x_rf_ops *rf; |
95 | struct ieee80211_vif *vif; | 95 | struct ieee80211_vif *vif; |
96 | int mode; | 96 | int mode; |
97 | /* The mutex protects the TX loopback state. | ||
98 | * Any attempt to set channels concurrently locks the device. | ||
99 | */ | ||
100 | struct mutex conf_mutex; | ||
97 | 101 | ||
98 | /* rtl8187 specific */ | 102 | /* rtl8187 specific */ |
99 | struct ieee80211_channel channels[14]; | 103 | struct ieee80211_channel channels[14]; |
diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c index 177988efd660..57376fb993ed 100644 --- a/drivers/net/wireless/rtl8187_dev.c +++ b/drivers/net/wireless/rtl8187_dev.c | |||
@@ -31,6 +31,8 @@ MODULE_DESCRIPTION("RTL8187/RTL8187B USB wireless driver"); | |||
31 | MODULE_LICENSE("GPL"); | 31 | MODULE_LICENSE("GPL"); |
32 | 32 | ||
33 | static struct usb_device_id rtl8187_table[] __devinitdata = { | 33 | static struct usb_device_id rtl8187_table[] __devinitdata = { |
34 | /* Asus */ | ||
35 | {USB_DEVICE(0x0b05, 0x171d), .driver_info = DEVICE_RTL8187}, | ||
34 | /* Realtek */ | 36 | /* Realtek */ |
35 | {USB_DEVICE(0x0bda, 0x8187), .driver_info = DEVICE_RTL8187}, | 37 | {USB_DEVICE(0x0bda, 0x8187), .driver_info = DEVICE_RTL8187}, |
36 | {USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B}, | 38 | {USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B}, |
@@ -726,6 +728,7 @@ static int rtl8187_start(struct ieee80211_hw *dev) | |||
726 | if (ret) | 728 | if (ret) |
727 | return ret; | 729 | return ret; |
728 | 730 | ||
731 | mutex_lock(&priv->conf_mutex); | ||
729 | if (priv->is_rtl8187b) { | 732 | if (priv->is_rtl8187b) { |
730 | reg = RTL818X_RX_CONF_MGMT | | 733 | reg = RTL818X_RX_CONF_MGMT | |
731 | RTL818X_RX_CONF_DATA | | 734 | RTL818X_RX_CONF_DATA | |
@@ -747,6 +750,7 @@ static int rtl8187_start(struct ieee80211_hw *dev) | |||
747 | (7 << 0 /* long retry limit */) | | 750 | (7 << 0 /* long retry limit */) | |
748 | (7 << 21 /* MAX TX DMA */)); | 751 | (7 << 21 /* MAX TX DMA */)); |
749 | rtl8187_init_urbs(dev); | 752 | rtl8187_init_urbs(dev); |
753 | mutex_unlock(&priv->conf_mutex); | ||
750 | return 0; | 754 | return 0; |
751 | } | 755 | } |
752 | 756 | ||
@@ -790,6 +794,7 @@ static int rtl8187_start(struct ieee80211_hw *dev) | |||
790 | reg |= RTL818X_CMD_TX_ENABLE; | 794 | reg |= RTL818X_CMD_TX_ENABLE; |
791 | reg |= RTL818X_CMD_RX_ENABLE; | 795 | reg |= RTL818X_CMD_RX_ENABLE; |
792 | rtl818x_iowrite8(priv, &priv->map->CMD, reg); | 796 | rtl818x_iowrite8(priv, &priv->map->CMD, reg); |
797 | mutex_unlock(&priv->conf_mutex); | ||
793 | 798 | ||
794 | return 0; | 799 | return 0; |
795 | } | 800 | } |
@@ -801,6 +806,7 @@ static void rtl8187_stop(struct ieee80211_hw *dev) | |||
801 | struct sk_buff *skb; | 806 | struct sk_buff *skb; |
802 | u32 reg; | 807 | u32 reg; |
803 | 808 | ||
809 | mutex_lock(&priv->conf_mutex); | ||
804 | rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0); | 810 | rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0); |
805 | 811 | ||
806 | reg = rtl818x_ioread8(priv, &priv->map->CMD); | 812 | reg = rtl818x_ioread8(priv, &priv->map->CMD); |
@@ -820,7 +826,7 @@ static void rtl8187_stop(struct ieee80211_hw *dev) | |||
820 | usb_kill_urb(info->urb); | 826 | usb_kill_urb(info->urb); |
821 | kfree_skb(skb); | 827 | kfree_skb(skb); |
822 | } | 828 | } |
823 | return; | 829 | mutex_unlock(&priv->conf_mutex); |
824 | } | 830 | } |
825 | 831 | ||
826 | static int rtl8187_add_interface(struct ieee80211_hw *dev, | 832 | static int rtl8187_add_interface(struct ieee80211_hw *dev, |
@@ -840,6 +846,7 @@ static int rtl8187_add_interface(struct ieee80211_hw *dev, | |||
840 | return -EOPNOTSUPP; | 846 | return -EOPNOTSUPP; |
841 | } | 847 | } |
842 | 848 | ||
849 | mutex_lock(&priv->conf_mutex); | ||
843 | priv->vif = conf->vif; | 850 | priv->vif = conf->vif; |
844 | 851 | ||
845 | rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG); | 852 | rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG); |
@@ -848,6 +855,7 @@ static int rtl8187_add_interface(struct ieee80211_hw *dev, | |||
848 | ((u8 *)conf->mac_addr)[i]); | 855 | ((u8 *)conf->mac_addr)[i]); |
849 | rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL); | 856 | rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL); |
850 | 857 | ||
858 | mutex_unlock(&priv->conf_mutex); | ||
851 | return 0; | 859 | return 0; |
852 | } | 860 | } |
853 | 861 | ||
@@ -855,8 +863,10 @@ static void rtl8187_remove_interface(struct ieee80211_hw *dev, | |||
855 | struct ieee80211_if_init_conf *conf) | 863 | struct ieee80211_if_init_conf *conf) |
856 | { | 864 | { |
857 | struct rtl8187_priv *priv = dev->priv; | 865 | struct rtl8187_priv *priv = dev->priv; |
866 | mutex_lock(&priv->conf_mutex); | ||
858 | priv->mode = IEEE80211_IF_TYPE_MNTR; | 867 | priv->mode = IEEE80211_IF_TYPE_MNTR; |
859 | priv->vif = NULL; | 868 | priv->vif = NULL; |
869 | mutex_unlock(&priv->conf_mutex); | ||
860 | } | 870 | } |
861 | 871 | ||
862 | static int rtl8187_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) | 872 | static int rtl8187_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) |
@@ -864,6 +874,7 @@ static int rtl8187_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) | |||
864 | struct rtl8187_priv *priv = dev->priv; | 874 | struct rtl8187_priv *priv = dev->priv; |
865 | u32 reg; | 875 | u32 reg; |
866 | 876 | ||
877 | mutex_lock(&priv->conf_mutex); | ||
867 | reg = rtl818x_ioread32(priv, &priv->map->TX_CONF); | 878 | reg = rtl818x_ioread32(priv, &priv->map->TX_CONF); |
868 | /* Enable TX loopback on MAC level to avoid TX during channel | 879 | /* Enable TX loopback on MAC level to avoid TX during channel |
869 | * changes, as this has be seen to causes problems and the | 880 | * changes, as this has be seen to causes problems and the |
@@ -896,6 +907,7 @@ static int rtl8187_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) | |||
896 | rtl818x_iowrite16(priv, &priv->map->ATIMTR_INTERVAL, 100); | 907 | rtl818x_iowrite16(priv, &priv->map->ATIMTR_INTERVAL, 100); |
897 | rtl818x_iowrite16(priv, &priv->map->BEACON_INTERVAL, 100); | 908 | rtl818x_iowrite16(priv, &priv->map->BEACON_INTERVAL, 100); |
898 | rtl818x_iowrite16(priv, &priv->map->BEACON_INTERVAL_TIME, 100); | 909 | rtl818x_iowrite16(priv, &priv->map->BEACON_INTERVAL_TIME, 100); |
910 | mutex_unlock(&priv->conf_mutex); | ||
899 | return 0; | 911 | return 0; |
900 | } | 912 | } |
901 | 913 | ||
@@ -907,6 +919,7 @@ static int rtl8187_config_interface(struct ieee80211_hw *dev, | |||
907 | int i; | 919 | int i; |
908 | u8 reg; | 920 | u8 reg; |
909 | 921 | ||
922 | mutex_lock(&priv->conf_mutex); | ||
910 | for (i = 0; i < ETH_ALEN; i++) | 923 | for (i = 0; i < ETH_ALEN; i++) |
911 | rtl818x_iowrite8(priv, &priv->map->BSSID[i], conf->bssid[i]); | 924 | rtl818x_iowrite8(priv, &priv->map->BSSID[i], conf->bssid[i]); |
912 | 925 | ||
@@ -920,6 +933,7 @@ static int rtl8187_config_interface(struct ieee80211_hw *dev, | |||
920 | rtl818x_iowrite8(priv, &priv->map->MSR, reg); | 933 | rtl818x_iowrite8(priv, &priv->map->MSR, reg); |
921 | } | 934 | } |
922 | 935 | ||
936 | mutex_unlock(&priv->conf_mutex); | ||
923 | return 0; | 937 | return 0; |
924 | } | 938 | } |
925 | 939 | ||
@@ -1187,6 +1201,7 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
1187 | printk(KERN_ERR "rtl8187: Cannot register device\n"); | 1201 | printk(KERN_ERR "rtl8187: Cannot register device\n"); |
1188 | goto err_free_dev; | 1202 | goto err_free_dev; |
1189 | } | 1203 | } |
1204 | mutex_init(&priv->conf_mutex); | ||
1190 | 1205 | ||
1191 | printk(KERN_INFO "%s: hwaddr %s, %s V%d + %s\n", | 1206 | printk(KERN_INFO "%s: hwaddr %s, %s V%d + %s\n", |
1192 | wiphy_name(dev->wiphy), print_mac(mac, dev->wiphy->perm_addr), | 1207 | wiphy_name(dev->wiphy), print_mac(mac, dev->wiphy->perm_addr), |
diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c index d0c1d63d1891..203e579ebbd2 100644 --- a/drivers/pcmcia/rsrc_nonstatic.c +++ b/drivers/pcmcia/rsrc_nonstatic.c | |||
@@ -275,7 +275,7 @@ static int readable(struct pcmcia_socket *s, struct resource *res, | |||
275 | destroy_cis_cache(s); | 275 | destroy_cis_cache(s); |
276 | } | 276 | } |
277 | s->cis_mem.res = NULL; | 277 | s->cis_mem.res = NULL; |
278 | if ((ret != 0) || (count == 0)) | 278 | if ((ret != 0) || (*count == 0)) |
279 | return 0; | 279 | return 0; |
280 | return 1; | 280 | return 1; |
281 | } | 281 | } |
diff --git a/drivers/rtc/rtc-bfin.c b/drivers/rtc/rtc-bfin.c index 8624f55d0560..a1af4c27939b 100644 --- a/drivers/rtc/rtc-bfin.c +++ b/drivers/rtc/rtc-bfin.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Blackfin On-Chip Real Time Clock Driver | 2 | * Blackfin On-Chip Real Time Clock Driver |
3 | * Supports BF52[257]/BF53[123]/BF53[467]/BF54[24789] | 3 | * Supports BF52[257]/BF53[123]/BF53[467]/BF54[24789] |
4 | * | 4 | * |
5 | * Copyright 2004-2007 Analog Devices Inc. | 5 | * Copyright 2004-2008 Analog Devices Inc. |
6 | * | 6 | * |
7 | * Enter bugs at http://blackfin.uclinux.org/ | 7 | * Enter bugs at http://blackfin.uclinux.org/ |
8 | * | 8 | * |
@@ -32,6 +32,15 @@ | |||
32 | * writes to clear status registers complete immediately. | 32 | * writes to clear status registers complete immediately. |
33 | */ | 33 | */ |
34 | 34 | ||
35 | /* It may seem odd that there is no SWCNT code in here (which would be exposed | ||
36 | * via the periodic interrupt event, or PIE). Since the Blackfin RTC peripheral | ||
37 | * runs in units of seconds (N/HZ) but the Linux framework runs in units of HZ | ||
38 | * (2^N HZ), there is no point in keeping code that only provides 1 HZ PIEs. | ||
39 | * The same exact behavior can be accomplished by using the update interrupt | ||
40 | * event (UIE). Maybe down the line the RTC peripheral will suck less in which | ||
41 | * case we can re-introduce PIE support. | ||
42 | */ | ||
43 | |||
35 | #include <linux/bcd.h> | 44 | #include <linux/bcd.h> |
36 | #include <linux/completion.h> | 45 | #include <linux/completion.h> |
37 | #include <linux/delay.h> | 46 | #include <linux/delay.h> |
@@ -144,14 +153,13 @@ static void bfin_rtc_sync_pending(struct device *dev) | |||
144 | * Initialize the RTC. Enable pre-scaler to scale RTC clock | 153 | * Initialize the RTC. Enable pre-scaler to scale RTC clock |
145 | * to 1Hz and clear interrupt/status registers. | 154 | * to 1Hz and clear interrupt/status registers. |
146 | */ | 155 | */ |
147 | static void bfin_rtc_reset(struct device *dev) | 156 | static void bfin_rtc_reset(struct device *dev, u16 rtc_ictl) |
148 | { | 157 | { |
149 | struct bfin_rtc *rtc = dev_get_drvdata(dev); | 158 | struct bfin_rtc *rtc = dev_get_drvdata(dev); |
150 | dev_dbg_stamp(dev); | 159 | dev_dbg_stamp(dev); |
151 | bfin_rtc_sync_pending(dev); | 160 | bfin_rtc_sync_pending(dev); |
152 | bfin_write_RTC_PREN(0x1); | 161 | bfin_write_RTC_PREN(0x1); |
153 | bfin_write_RTC_ICTL(RTC_ISTAT_WRITE_COMPLETE); | 162 | bfin_write_RTC_ICTL(rtc_ictl); |
154 | bfin_write_RTC_SWCNT(0); | ||
155 | bfin_write_RTC_ALARM(0); | 163 | bfin_write_RTC_ALARM(0); |
156 | bfin_write_RTC_ISTAT(0xFFFF); | 164 | bfin_write_RTC_ISTAT(0xFFFF); |
157 | rtc->rtc_wrote_regs = 0; | 165 | rtc->rtc_wrote_regs = 0; |
@@ -194,14 +202,6 @@ static irqreturn_t bfin_rtc_interrupt(int irq, void *dev_id) | |||
194 | } | 202 | } |
195 | } | 203 | } |
196 | 204 | ||
197 | if (rtc_ictl & RTC_ISTAT_STOPWATCH) { | ||
198 | if (rtc_istat & RTC_ISTAT_STOPWATCH) { | ||
199 | bfin_write_RTC_ISTAT(RTC_ISTAT_STOPWATCH); | ||
200 | events |= RTC_PF | RTC_IRQF; | ||
201 | bfin_write_RTC_SWCNT(rtc->rtc_dev->irq_freq); | ||
202 | } | ||
203 | } | ||
204 | |||
205 | if (rtc_ictl & RTC_ISTAT_SEC) { | 205 | if (rtc_ictl & RTC_ISTAT_SEC) { |
206 | if (rtc_istat & RTC_ISTAT_SEC) { | 206 | if (rtc_istat & RTC_ISTAT_SEC) { |
207 | bfin_write_RTC_ISTAT(RTC_ISTAT_SEC); | 207 | bfin_write_RTC_ISTAT(RTC_ISTAT_SEC); |
@@ -226,7 +226,7 @@ static int bfin_rtc_open(struct device *dev) | |||
226 | 226 | ||
227 | ret = request_irq(IRQ_RTC, bfin_rtc_interrupt, IRQF_SHARED, to_platform_device(dev)->name, dev); | 227 | ret = request_irq(IRQ_RTC, bfin_rtc_interrupt, IRQF_SHARED, to_platform_device(dev)->name, dev); |
228 | if (!ret) | 228 | if (!ret) |
229 | bfin_rtc_reset(dev); | 229 | bfin_rtc_reset(dev, RTC_ISTAT_WRITE_COMPLETE); |
230 | 230 | ||
231 | return ret; | 231 | return ret; |
232 | } | 232 | } |
@@ -234,16 +234,16 @@ static int bfin_rtc_open(struct device *dev) | |||
234 | static void bfin_rtc_release(struct device *dev) | 234 | static void bfin_rtc_release(struct device *dev) |
235 | { | 235 | { |
236 | dev_dbg_stamp(dev); | 236 | dev_dbg_stamp(dev); |
237 | bfin_rtc_reset(dev); | 237 | bfin_rtc_reset(dev, 0); |
238 | free_irq(IRQ_RTC, dev); | 238 | free_irq(IRQ_RTC, dev); |
239 | } | 239 | } |
240 | 240 | ||
241 | static void bfin_rtc_int_set(struct bfin_rtc *rtc, u16 rtc_int) | 241 | static void bfin_rtc_int_set(u16 rtc_int) |
242 | { | 242 | { |
243 | bfin_write_RTC_ISTAT(rtc_int); | 243 | bfin_write_RTC_ISTAT(rtc_int); |
244 | bfin_write_RTC_ICTL(bfin_read_RTC_ICTL() | rtc_int); | 244 | bfin_write_RTC_ICTL(bfin_read_RTC_ICTL() | rtc_int); |
245 | } | 245 | } |
246 | static void bfin_rtc_int_clear(struct bfin_rtc *rtc, u16 rtc_int) | 246 | static void bfin_rtc_int_clear(u16 rtc_int) |
247 | { | 247 | { |
248 | bfin_write_RTC_ICTL(bfin_read_RTC_ICTL() & rtc_int); | 248 | bfin_write_RTC_ICTL(bfin_read_RTC_ICTL() & rtc_int); |
249 | } | 249 | } |
@@ -252,7 +252,7 @@ static void bfin_rtc_int_set_alarm(struct bfin_rtc *rtc) | |||
252 | /* Blackfin has different bits for whether the alarm is | 252 | /* Blackfin has different bits for whether the alarm is |
253 | * more than 24 hours away. | 253 | * more than 24 hours away. |
254 | */ | 254 | */ |
255 | bfin_rtc_int_set(rtc, (rtc->rtc_alarm.tm_yday == -1 ? RTC_ISTAT_ALARM : RTC_ISTAT_ALARM_DAY)); | 255 | bfin_rtc_int_set(rtc->rtc_alarm.tm_yday == -1 ? RTC_ISTAT_ALARM : RTC_ISTAT_ALARM_DAY); |
256 | } | 256 | } |
257 | static int bfin_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) | 257 | static int bfin_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) |
258 | { | 258 | { |
@@ -264,23 +264,13 @@ static int bfin_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long ar | |||
264 | bfin_rtc_sync_pending(dev); | 264 | bfin_rtc_sync_pending(dev); |
265 | 265 | ||
266 | switch (cmd) { | 266 | switch (cmd) { |
267 | case RTC_PIE_ON: | ||
268 | dev_dbg_stamp(dev); | ||
269 | bfin_rtc_int_set(rtc, RTC_ISTAT_STOPWATCH); | ||
270 | bfin_write_RTC_SWCNT(rtc->rtc_dev->irq_freq); | ||
271 | break; | ||
272 | case RTC_PIE_OFF: | ||
273 | dev_dbg_stamp(dev); | ||
274 | bfin_rtc_int_clear(rtc, ~RTC_ISTAT_STOPWATCH); | ||
275 | break; | ||
276 | |||
277 | case RTC_UIE_ON: | 267 | case RTC_UIE_ON: |
278 | dev_dbg_stamp(dev); | 268 | dev_dbg_stamp(dev); |
279 | bfin_rtc_int_set(rtc, RTC_ISTAT_SEC); | 269 | bfin_rtc_int_set(RTC_ISTAT_SEC); |
280 | break; | 270 | break; |
281 | case RTC_UIE_OFF: | 271 | case RTC_UIE_OFF: |
282 | dev_dbg_stamp(dev); | 272 | dev_dbg_stamp(dev); |
283 | bfin_rtc_int_clear(rtc, ~RTC_ISTAT_SEC); | 273 | bfin_rtc_int_clear(~RTC_ISTAT_SEC); |
284 | break; | 274 | break; |
285 | 275 | ||
286 | case RTC_AIE_ON: | 276 | case RTC_AIE_ON: |
@@ -289,7 +279,7 @@ static int bfin_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long ar | |||
289 | break; | 279 | break; |
290 | case RTC_AIE_OFF: | 280 | case RTC_AIE_OFF: |
291 | dev_dbg_stamp(dev); | 281 | dev_dbg_stamp(dev); |
292 | bfin_rtc_int_clear(rtc, ~(RTC_ISTAT_ALARM | RTC_ISTAT_ALARM_DAY)); | 282 | bfin_rtc_int_clear(~(RTC_ISTAT_ALARM | RTC_ISTAT_ALARM_DAY)); |
293 | break; | 283 | break; |
294 | 284 | ||
295 | default: | 285 | default: |
@@ -371,30 +361,14 @@ static int bfin_rtc_proc(struct device *dev, struct seq_file *seq) | |||
371 | seq_printf(seq, | 361 | seq_printf(seq, |
372 | "alarm_IRQ\t: %s\n" | 362 | "alarm_IRQ\t: %s\n" |
373 | "wkalarm_IRQ\t: %s\n" | 363 | "wkalarm_IRQ\t: %s\n" |
374 | "seconds_IRQ\t: %s\n" | 364 | "seconds_IRQ\t: %s\n", |
375 | "periodic_IRQ\t: %s\n", | ||
376 | yesno(ictl & RTC_ISTAT_ALARM), | 365 | yesno(ictl & RTC_ISTAT_ALARM), |
377 | yesno(ictl & RTC_ISTAT_ALARM_DAY), | 366 | yesno(ictl & RTC_ISTAT_ALARM_DAY), |
378 | yesno(ictl & RTC_ISTAT_SEC), | 367 | yesno(ictl & RTC_ISTAT_SEC)); |
379 | yesno(ictl & RTC_ISTAT_STOPWATCH)); | ||
380 | return 0; | 368 | return 0; |
381 | #undef yesno | 369 | #undef yesno |
382 | } | 370 | } |
383 | 371 | ||
384 | /** | ||
385 | * bfin_irq_set_freq - make sure hardware supports requested freq | ||
386 | * @dev: pointer to RTC device structure | ||
387 | * @freq: requested frequency rate | ||
388 | * | ||
389 | * The Blackfin RTC can only generate periodic events at 1 per | ||
390 | * second (1 Hz), so reject any attempt at changing it. | ||
391 | */ | ||
392 | static int bfin_irq_set_freq(struct device *dev, int freq) | ||
393 | { | ||
394 | dev_dbg_stamp(dev); | ||
395 | return -ENOTTY; | ||
396 | } | ||
397 | |||
398 | static struct rtc_class_ops bfin_rtc_ops = { | 372 | static struct rtc_class_ops bfin_rtc_ops = { |
399 | .open = bfin_rtc_open, | 373 | .open = bfin_rtc_open, |
400 | .release = bfin_rtc_release, | 374 | .release = bfin_rtc_release, |
@@ -404,7 +378,6 @@ static struct rtc_class_ops bfin_rtc_ops = { | |||
404 | .read_alarm = bfin_rtc_read_alarm, | 378 | .read_alarm = bfin_rtc_read_alarm, |
405 | .set_alarm = bfin_rtc_set_alarm, | 379 | .set_alarm = bfin_rtc_set_alarm, |
406 | .proc = bfin_rtc_proc, | 380 | .proc = bfin_rtc_proc, |
407 | .irq_set_freq = bfin_irq_set_freq, | ||
408 | }; | 381 | }; |
409 | 382 | ||
410 | static int __devinit bfin_rtc_probe(struct platform_device *pdev) | 383 | static int __devinit bfin_rtc_probe(struct platform_device *pdev) |
@@ -423,10 +396,14 @@ static int __devinit bfin_rtc_probe(struct platform_device *pdev) | |||
423 | ret = PTR_ERR(rtc->rtc_dev); | 396 | ret = PTR_ERR(rtc->rtc_dev); |
424 | goto err; | 397 | goto err; |
425 | } | 398 | } |
426 | rtc->rtc_dev->irq_freq = 1; | 399 | |
400 | /* see comment at top of file about stopwatch/PIE */ | ||
401 | bfin_write_RTC_SWCNT(0); | ||
427 | 402 | ||
428 | platform_set_drvdata(pdev, rtc); | 403 | platform_set_drvdata(pdev, rtc); |
429 | 404 | ||
405 | device_init_wakeup(&pdev->dev, 1); | ||
406 | |||
430 | return 0; | 407 | return 0; |
431 | 408 | ||
432 | err: | 409 | err: |
@@ -445,6 +422,32 @@ static int __devexit bfin_rtc_remove(struct platform_device *pdev) | |||
445 | return 0; | 422 | return 0; |
446 | } | 423 | } |
447 | 424 | ||
425 | #ifdef CONFIG_PM | ||
426 | static int bfin_rtc_suspend(struct platform_device *pdev, pm_message_t state) | ||
427 | { | ||
428 | if (device_may_wakeup(&pdev->dev)) { | ||
429 | enable_irq_wake(IRQ_RTC); | ||
430 | bfin_rtc_sync_pending(&pdev->dev); | ||
431 | } else | ||
432 | bfin_rtc_int_clear(-1); | ||
433 | |||
434 | return 0; | ||
435 | } | ||
436 | |||
437 | static int bfin_rtc_resume(struct platform_device *pdev) | ||
438 | { | ||
439 | if (device_may_wakeup(&pdev->dev)) | ||
440 | disable_irq_wake(IRQ_RTC); | ||
441 | else | ||
442 | bfin_write_RTC_ISTAT(-1); | ||
443 | |||
444 | return 0; | ||
445 | } | ||
446 | #else | ||
447 | # define bfin_rtc_suspend NULL | ||
448 | # define bfin_rtc_resume NULL | ||
449 | #endif | ||
450 | |||
448 | static struct platform_driver bfin_rtc_driver = { | 451 | static struct platform_driver bfin_rtc_driver = { |
449 | .driver = { | 452 | .driver = { |
450 | .name = "rtc-bfin", | 453 | .name = "rtc-bfin", |
@@ -452,6 +455,8 @@ static struct platform_driver bfin_rtc_driver = { | |||
452 | }, | 455 | }, |
453 | .probe = bfin_rtc_probe, | 456 | .probe = bfin_rtc_probe, |
454 | .remove = __devexit_p(bfin_rtc_remove), | 457 | .remove = __devexit_p(bfin_rtc_remove), |
458 | .suspend = bfin_rtc_suspend, | ||
459 | .resume = bfin_rtc_resume, | ||
455 | }; | 460 | }; |
456 | 461 | ||
457 | static int __init bfin_rtc_init(void) | 462 | static int __init bfin_rtc_init(void) |
diff --git a/drivers/scsi/hptiop.c b/drivers/scsi/hptiop.c index da876d3924be..a48e4990fe12 100644 --- a/drivers/scsi/hptiop.c +++ b/drivers/scsi/hptiop.c | |||
@@ -25,7 +25,6 @@ | |||
25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
26 | #include <linux/timer.h> | 26 | #include <linux/timer.h> |
27 | #include <linux/spinlock.h> | 27 | #include <linux/spinlock.h> |
28 | #include <linux/hdreg.h> | ||
29 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
30 | #include <asm/io.h> | 29 | #include <asm/io.h> |
31 | #include <asm/div64.h> | 30 | #include <asm/div64.h> |
@@ -1249,6 +1248,13 @@ static struct pci_device_id hptiop_id_table[] = { | |||
1249 | { PCI_VDEVICE(TTI, 0x3522), (kernel_ulong_t)&hptiop_itl_ops }, | 1248 | { PCI_VDEVICE(TTI, 0x3522), (kernel_ulong_t)&hptiop_itl_ops }, |
1250 | { PCI_VDEVICE(TTI, 0x3410), (kernel_ulong_t)&hptiop_itl_ops }, | 1249 | { PCI_VDEVICE(TTI, 0x3410), (kernel_ulong_t)&hptiop_itl_ops }, |
1251 | { PCI_VDEVICE(TTI, 0x3540), (kernel_ulong_t)&hptiop_itl_ops }, | 1250 | { PCI_VDEVICE(TTI, 0x3540), (kernel_ulong_t)&hptiop_itl_ops }, |
1251 | { PCI_VDEVICE(TTI, 0x3530), (kernel_ulong_t)&hptiop_itl_ops }, | ||
1252 | { PCI_VDEVICE(TTI, 0x3560), (kernel_ulong_t)&hptiop_itl_ops }, | ||
1253 | { PCI_VDEVICE(TTI, 0x4322), (kernel_ulong_t)&hptiop_itl_ops }, | ||
1254 | { PCI_VDEVICE(TTI, 0x4210), (kernel_ulong_t)&hptiop_itl_ops }, | ||
1255 | { PCI_VDEVICE(TTI, 0x4211), (kernel_ulong_t)&hptiop_itl_ops }, | ||
1256 | { PCI_VDEVICE(TTI, 0x4310), (kernel_ulong_t)&hptiop_itl_ops }, | ||
1257 | { PCI_VDEVICE(TTI, 0x4311), (kernel_ulong_t)&hptiop_itl_ops }, | ||
1252 | { PCI_VDEVICE(TTI, 0x3120), (kernel_ulong_t)&hptiop_mv_ops }, | 1258 | { PCI_VDEVICE(TTI, 0x3120), (kernel_ulong_t)&hptiop_mv_ops }, |
1253 | { PCI_VDEVICE(TTI, 0x3122), (kernel_ulong_t)&hptiop_mv_ops }, | 1259 | { PCI_VDEVICE(TTI, 0x3122), (kernel_ulong_t)&hptiop_mv_ops }, |
1254 | { PCI_VDEVICE(TTI, 0x3020), (kernel_ulong_t)&hptiop_mv_ops }, | 1260 | { PCI_VDEVICE(TTI, 0x3020), (kernel_ulong_t)&hptiop_mv_ops }, |
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index b40a673985aa..461331d3dc45 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c | |||
@@ -102,11 +102,10 @@ static struct ide_scsi_obj *ide_scsi_get(struct gendisk *disk) | |||
102 | mutex_lock(&idescsi_ref_mutex); | 102 | mutex_lock(&idescsi_ref_mutex); |
103 | scsi = ide_scsi_g(disk); | 103 | scsi = ide_scsi_g(disk); |
104 | if (scsi) { | 104 | if (scsi) { |
105 | scsi_host_get(scsi->host); | 105 | if (ide_device_get(scsi->drive)) |
106 | if (ide_device_get(scsi->drive)) { | ||
107 | scsi_host_put(scsi->host); | ||
108 | scsi = NULL; | 106 | scsi = NULL; |
109 | } | 107 | else |
108 | scsi_host_get(scsi->host); | ||
110 | } | 109 | } |
111 | mutex_unlock(&idescsi_ref_mutex); | 110 | mutex_unlock(&idescsi_ref_mutex); |
112 | return scsi; | 111 | return scsi; |
@@ -114,9 +113,11 @@ static struct ide_scsi_obj *ide_scsi_get(struct gendisk *disk) | |||
114 | 113 | ||
115 | static void ide_scsi_put(struct ide_scsi_obj *scsi) | 114 | static void ide_scsi_put(struct ide_scsi_obj *scsi) |
116 | { | 115 | { |
116 | ide_drive_t *drive = scsi->drive; | ||
117 | |||
117 | mutex_lock(&idescsi_ref_mutex); | 118 | mutex_lock(&idescsi_ref_mutex); |
118 | ide_device_put(scsi->drive); | ||
119 | scsi_host_put(scsi->host); | 119 | scsi_host_put(scsi->host); |
120 | ide_device_put(drive); | ||
120 | mutex_unlock(&idescsi_ref_mutex); | 121 | mutex_unlock(&idescsi_ref_mutex); |
121 | } | 122 | } |
122 | 123 | ||
diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 75a64a6cae8c..b29360ed0bdc 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c | |||
@@ -366,12 +366,14 @@ spi_transport_rd_attr(rti, "%d\n"); | |||
366 | spi_transport_rd_attr(pcomp_en, "%d\n"); | 366 | spi_transport_rd_attr(pcomp_en, "%d\n"); |
367 | spi_transport_rd_attr(hold_mcs, "%d\n"); | 367 | spi_transport_rd_attr(hold_mcs, "%d\n"); |
368 | 368 | ||
369 | /* we only care about the first child device so we return 1 */ | 369 | /* we only care about the first child device that's a real SCSI device |
370 | * so we return 1 to terminate the iteration when we find it */ | ||
370 | static int child_iter(struct device *dev, void *data) | 371 | static int child_iter(struct device *dev, void *data) |
371 | { | 372 | { |
372 | struct scsi_device *sdev = to_scsi_device(dev); | 373 | if (!scsi_is_sdev_device(dev)) |
374 | return 0; | ||
373 | 375 | ||
374 | spi_dv_device(sdev); | 376 | spi_dv_device(to_scsi_device(dev)); |
375 | return 1; | 377 | return 1; |
376 | } | 378 | } |
377 | 379 | ||
diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c index 0fe031f003e7..1bcf3c33d7ff 100644 --- a/drivers/scsi/ses.c +++ b/drivers/scsi/ses.c | |||
@@ -345,14 +345,14 @@ static int ses_enclosure_find_by_addr(struct enclosure_device *edev, | |||
345 | return 0; | 345 | return 0; |
346 | } | 346 | } |
347 | 347 | ||
348 | #define VPD_INQUIRY_SIZE 512 | 348 | #define VPD_INQUIRY_SIZE 36 |
349 | 349 | ||
350 | static void ses_match_to_enclosure(struct enclosure_device *edev, | 350 | static void ses_match_to_enclosure(struct enclosure_device *edev, |
351 | struct scsi_device *sdev) | 351 | struct scsi_device *sdev) |
352 | { | 352 | { |
353 | unsigned char *buf = kmalloc(VPD_INQUIRY_SIZE, GFP_KERNEL); | 353 | unsigned char *buf = kmalloc(VPD_INQUIRY_SIZE, GFP_KERNEL); |
354 | unsigned char *desc; | 354 | unsigned char *desc; |
355 | int len; | 355 | u16 vpd_len; |
356 | struct efd efd = { | 356 | struct efd efd = { |
357 | .addr = 0, | 357 | .addr = 0, |
358 | }; | 358 | }; |
@@ -372,9 +372,19 @@ static void ses_match_to_enclosure(struct enclosure_device *edev, | |||
372 | VPD_INQUIRY_SIZE, NULL, SES_TIMEOUT, SES_RETRIES)) | 372 | VPD_INQUIRY_SIZE, NULL, SES_TIMEOUT, SES_RETRIES)) |
373 | goto free; | 373 | goto free; |
374 | 374 | ||
375 | len = (buf[2] << 8) + buf[3]; | 375 | vpd_len = (buf[2] << 8) + buf[3]; |
376 | kfree(buf); | ||
377 | buf = kmalloc(vpd_len, GFP_KERNEL); | ||
378 | if (!buf) | ||
379 | return; | ||
380 | cmd[3] = vpd_len >> 8; | ||
381 | cmd[4] = vpd_len & 0xff; | ||
382 | if (scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, | ||
383 | vpd_len, NULL, SES_TIMEOUT, SES_RETRIES)) | ||
384 | goto free; | ||
385 | |||
376 | desc = buf + 4; | 386 | desc = buf + 4; |
377 | while (desc < buf + len) { | 387 | while (desc < buf + vpd_len) { |
378 | enum scsi_protocol proto = desc[0] >> 4; | 388 | enum scsi_protocol proto = desc[0] >> 4; |
379 | u8 code_set = desc[0] & 0x0f; | 389 | u8 code_set = desc[0] & 0x0f; |
380 | u8 piv = desc[1] & 0x80; | 390 | u8 piv = desc[1] & 0x80; |
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index d3b8ebb83776..3d36270a8b4d 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c | |||
@@ -1747,7 +1747,7 @@ st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages, | |||
1747 | */ | 1747 | */ |
1748 | flush_dcache_page(pages[i]); | 1748 | flush_dcache_page(pages[i]); |
1749 | /* ?? Is locking needed? I don't think so */ | 1749 | /* ?? Is locking needed? I don't think so */ |
1750 | /* if (TestSetPageLocked(pages[i])) | 1750 | /* if (!trylock_page(pages[i])) |
1751 | goto out_unlock; */ | 1751 | goto out_unlock; */ |
1752 | } | 1752 | } |
1753 | 1753 | ||
diff --git a/drivers/serial/bfin_5xx.c b/drivers/serial/bfin_5xx.c index 9d8543762a30..efcd44344fb1 100644 --- a/drivers/serial/bfin_5xx.c +++ b/drivers/serial/bfin_5xx.c | |||
@@ -817,7 +817,7 @@ static void bfin_serial_set_ldisc(struct uart_port *port) | |||
817 | if (line >= port->info->port.tty->driver->num) | 817 | if (line >= port->info->port.tty->driver->num) |
818 | return; | 818 | return; |
819 | 819 | ||
820 | switch (port->info->port.tty->ldisc.num) { | 820 | switch (port->info->port.tty->termios->c_line) { |
821 | case N_IRDA: | 821 | case N_IRDA: |
822 | val = UART_GET_GCTL(&bfin_serial_ports[line]); | 822 | val = UART_GET_GCTL(&bfin_serial_ports[line]); |
823 | val |= (IREN | RPOLC); | 823 | val |= (IREN | RPOLC); |
diff --git a/drivers/serial/crisv10.c b/drivers/serial/crisv10.c index 8249ac490559..bf94a770bb44 100644 --- a/drivers/serial/crisv10.c +++ b/drivers/serial/crisv10.c | |||
@@ -234,7 +234,7 @@ unsigned long r_alt_ser_baudrate_shadow = 0; | |||
234 | 234 | ||
235 | static struct e100_serial rs_table[] = { | 235 | static struct e100_serial rs_table[] = { |
236 | { .baud = DEF_BAUD, | 236 | { .baud = DEF_BAUD, |
237 | .port = (unsigned char *)R_SERIAL0_CTRL, | 237 | .ioport = (unsigned char *)R_SERIAL0_CTRL, |
238 | .irq = 1U << 12, /* uses DMA 6 and 7 */ | 238 | .irq = 1U << 12, /* uses DMA 6 and 7 */ |
239 | .oclrintradr = R_DMA_CH6_CLR_INTR, | 239 | .oclrintradr = R_DMA_CH6_CLR_INTR, |
240 | .ofirstadr = R_DMA_CH6_FIRST, | 240 | .ofirstadr = R_DMA_CH6_FIRST, |
@@ -288,7 +288,7 @@ static struct e100_serial rs_table[] = { | |||
288 | }, /* ttyS0 */ | 288 | }, /* ttyS0 */ |
289 | #ifndef CONFIG_SVINTO_SIM | 289 | #ifndef CONFIG_SVINTO_SIM |
290 | { .baud = DEF_BAUD, | 290 | { .baud = DEF_BAUD, |
291 | .port = (unsigned char *)R_SERIAL1_CTRL, | 291 | .ioport = (unsigned char *)R_SERIAL1_CTRL, |
292 | .irq = 1U << 16, /* uses DMA 8 and 9 */ | 292 | .irq = 1U << 16, /* uses DMA 8 and 9 */ |
293 | .oclrintradr = R_DMA_CH8_CLR_INTR, | 293 | .oclrintradr = R_DMA_CH8_CLR_INTR, |
294 | .ofirstadr = R_DMA_CH8_FIRST, | 294 | .ofirstadr = R_DMA_CH8_FIRST, |
@@ -344,7 +344,7 @@ static struct e100_serial rs_table[] = { | |||
344 | }, /* ttyS1 */ | 344 | }, /* ttyS1 */ |
345 | 345 | ||
346 | { .baud = DEF_BAUD, | 346 | { .baud = DEF_BAUD, |
347 | .port = (unsigned char *)R_SERIAL2_CTRL, | 347 | .ioport = (unsigned char *)R_SERIAL2_CTRL, |
348 | .irq = 1U << 4, /* uses DMA 2 and 3 */ | 348 | .irq = 1U << 4, /* uses DMA 2 and 3 */ |
349 | .oclrintradr = R_DMA_CH2_CLR_INTR, | 349 | .oclrintradr = R_DMA_CH2_CLR_INTR, |
350 | .ofirstadr = R_DMA_CH2_FIRST, | 350 | .ofirstadr = R_DMA_CH2_FIRST, |
@@ -398,7 +398,7 @@ static struct e100_serial rs_table[] = { | |||
398 | }, /* ttyS2 */ | 398 | }, /* ttyS2 */ |
399 | 399 | ||
400 | { .baud = DEF_BAUD, | 400 | { .baud = DEF_BAUD, |
401 | .port = (unsigned char *)R_SERIAL3_CTRL, | 401 | .ioport = (unsigned char *)R_SERIAL3_CTRL, |
402 | .irq = 1U << 8, /* uses DMA 4 and 5 */ | 402 | .irq = 1U << 8, /* uses DMA 4 and 5 */ |
403 | .oclrintradr = R_DMA_CH4_CLR_INTR, | 403 | .oclrintradr = R_DMA_CH4_CLR_INTR, |
404 | .ofirstadr = R_DMA_CH4_FIRST, | 404 | .ofirstadr = R_DMA_CH4_FIRST, |
@@ -939,7 +939,7 @@ static const struct control_pins e100_modem_pins[NR_PORTS] = | |||
939 | /* Output */ | 939 | /* Output */ |
940 | #define E100_RTS_GET(info) ((info)->rx_ctrl & E100_RTS_MASK) | 940 | #define E100_RTS_GET(info) ((info)->rx_ctrl & E100_RTS_MASK) |
941 | /* Input */ | 941 | /* Input */ |
942 | #define E100_CTS_GET(info) ((info)->port[REG_STATUS] & E100_CTS_MASK) | 942 | #define E100_CTS_GET(info) ((info)->ioport[REG_STATUS] & E100_CTS_MASK) |
943 | 943 | ||
944 | /* These are typically PA or PB and 0 means 0V, 1 means 3.3V */ | 944 | /* These are typically PA or PB and 0 means 0V, 1 means 3.3V */ |
945 | /* Is an output */ | 945 | /* Is an output */ |
@@ -1092,7 +1092,7 @@ e100_rts(struct e100_serial *info, int set) | |||
1092 | local_irq_save(flags); | 1092 | local_irq_save(flags); |
1093 | info->rx_ctrl &= ~E100_RTS_MASK; | 1093 | info->rx_ctrl &= ~E100_RTS_MASK; |
1094 | info->rx_ctrl |= (set ? 0 : E100_RTS_MASK); /* RTS is active low */ | 1094 | info->rx_ctrl |= (set ? 0 : E100_RTS_MASK); /* RTS is active low */ |
1095 | info->port[REG_REC_CTRL] = info->rx_ctrl; | 1095 | info->ioport[REG_REC_CTRL] = info->rx_ctrl; |
1096 | local_irq_restore(flags); | 1096 | local_irq_restore(flags); |
1097 | #ifdef SERIAL_DEBUG_IO | 1097 | #ifdef SERIAL_DEBUG_IO |
1098 | printk("ser%i rts %i\n", info->line, set); | 1098 | printk("ser%i rts %i\n", info->line, set); |
@@ -1142,7 +1142,7 @@ e100_disable_rx(struct e100_serial *info) | |||
1142 | { | 1142 | { |
1143 | #ifndef CONFIG_SVINTO_SIM | 1143 | #ifndef CONFIG_SVINTO_SIM |
1144 | /* disable the receiver */ | 1144 | /* disable the receiver */ |
1145 | info->port[REG_REC_CTRL] = | 1145 | info->ioport[REG_REC_CTRL] = |
1146 | (info->rx_ctrl &= ~IO_MASK(R_SERIAL0_REC_CTRL, rec_enable)); | 1146 | (info->rx_ctrl &= ~IO_MASK(R_SERIAL0_REC_CTRL, rec_enable)); |
1147 | #endif | 1147 | #endif |
1148 | } | 1148 | } |
@@ -1152,7 +1152,7 @@ e100_enable_rx(struct e100_serial *info) | |||
1152 | { | 1152 | { |
1153 | #ifndef CONFIG_SVINTO_SIM | 1153 | #ifndef CONFIG_SVINTO_SIM |
1154 | /* enable the receiver */ | 1154 | /* enable the receiver */ |
1155 | info->port[REG_REC_CTRL] = | 1155 | info->ioport[REG_REC_CTRL] = |
1156 | (info->rx_ctrl |= IO_MASK(R_SERIAL0_REC_CTRL, rec_enable)); | 1156 | (info->rx_ctrl |= IO_MASK(R_SERIAL0_REC_CTRL, rec_enable)); |
1157 | #endif | 1157 | #endif |
1158 | } | 1158 | } |
@@ -1490,7 +1490,7 @@ rs_stop(struct tty_struct *tty) | |||
1490 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); | 1490 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); |
1491 | } | 1491 | } |
1492 | 1492 | ||
1493 | *((unsigned long *)&info->port[REG_XOFF]) = xoff; | 1493 | *((unsigned long *)&info->ioport[REG_XOFF]) = xoff; |
1494 | local_irq_restore(flags); | 1494 | local_irq_restore(flags); |
1495 | } | 1495 | } |
1496 | } | 1496 | } |
@@ -1513,7 +1513,7 @@ rs_start(struct tty_struct *tty) | |||
1513 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); | 1513 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); |
1514 | } | 1514 | } |
1515 | 1515 | ||
1516 | *((unsigned long *)&info->port[REG_XOFF]) = xoff; | 1516 | *((unsigned long *)&info->ioport[REG_XOFF]) = xoff; |
1517 | if (!info->uses_dma_out && | 1517 | if (!info->uses_dma_out && |
1518 | info->xmit.head != info->xmit.tail && info->xmit.buf) | 1518 | info->xmit.head != info->xmit.tail && info->xmit.buf) |
1519 | e100_enable_serial_tx_ready_irq(info); | 1519 | e100_enable_serial_tx_ready_irq(info); |
@@ -1888,7 +1888,7 @@ static void receive_chars_dma(struct e100_serial *info) | |||
1888 | handle_all_descr_data(info); | 1888 | handle_all_descr_data(info); |
1889 | 1889 | ||
1890 | /* Read the status register to detect errors */ | 1890 | /* Read the status register to detect errors */ |
1891 | rstat = info->port[REG_STATUS]; | 1891 | rstat = info->ioport[REG_STATUS]; |
1892 | if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) ) { | 1892 | if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) ) { |
1893 | DFLOW(DEBUG_LOG(info->line, "XOFF detect stat %x\n", rstat)); | 1893 | DFLOW(DEBUG_LOG(info->line, "XOFF detect stat %x\n", rstat)); |
1894 | } | 1894 | } |
@@ -1897,7 +1897,7 @@ static void receive_chars_dma(struct e100_serial *info) | |||
1897 | /* If we got an error, we must reset it by reading the | 1897 | /* If we got an error, we must reset it by reading the |
1898 | * data_in field | 1898 | * data_in field |
1899 | */ | 1899 | */ |
1900 | unsigned char data = info->port[REG_DATA]; | 1900 | unsigned char data = info->ioport[REG_DATA]; |
1901 | 1901 | ||
1902 | PROCSTAT(ser_stat[info->line].errors_cnt++); | 1902 | PROCSTAT(ser_stat[info->line].errors_cnt++); |
1903 | DEBUG_LOG(info->line, "#dERR: s d 0x%04X\n", | 1903 | DEBUG_LOG(info->line, "#dERR: s d 0x%04X\n", |
@@ -2077,7 +2077,7 @@ static int force_eop_if_needed(struct e100_serial *info) | |||
2077 | /* We check data_avail bit to determine if data has | 2077 | /* We check data_avail bit to determine if data has |
2078 | * arrived since last time | 2078 | * arrived since last time |
2079 | */ | 2079 | */ |
2080 | unsigned char rstat = info->port[REG_STATUS]; | 2080 | unsigned char rstat = info->ioport[REG_STATUS]; |
2081 | 2081 | ||
2082 | /* error or datavail? */ | 2082 | /* error or datavail? */ |
2083 | if (rstat & SER_ERROR_MASK) { | 2083 | if (rstat & SER_ERROR_MASK) { |
@@ -2096,7 +2096,7 @@ static int force_eop_if_needed(struct e100_serial *info) | |||
2096 | TIMERD(DEBUG_LOG(info->line, "timeout: rstat 0x%03X\n", | 2096 | TIMERD(DEBUG_LOG(info->line, "timeout: rstat 0x%03X\n", |
2097 | rstat | (info->line << 8))); | 2097 | rstat | (info->line << 8))); |
2098 | /* Read data to clear status flags */ | 2098 | /* Read data to clear status flags */ |
2099 | (void)info->port[REG_DATA]; | 2099 | (void)info->ioport[REG_DATA]; |
2100 | 2100 | ||
2101 | info->forced_eop = 0; | 2101 | info->forced_eop = 0; |
2102 | START_FLUSH_FAST_TIMER(info, "magic"); | 2102 | START_FLUSH_FAST_TIMER(info, "magic"); |
@@ -2296,7 +2296,7 @@ struct e100_serial * handle_ser_rx_interrupt_no_dma(struct e100_serial *info) | |||
2296 | } | 2296 | } |
2297 | 2297 | ||
2298 | /* Read data and status at the same time */ | 2298 | /* Read data and status at the same time */ |
2299 | data_read = *((unsigned long *)&info->port[REG_DATA_STATUS32]); | 2299 | data_read = *((unsigned long *)&info->ioport[REG_DATA_STATUS32]); |
2300 | more_data: | 2300 | more_data: |
2301 | if (data_read & IO_MASK(R_SERIAL0_READ, xoff_detect) ) { | 2301 | if (data_read & IO_MASK(R_SERIAL0_READ, xoff_detect) ) { |
2302 | DFLOW(DEBUG_LOG(info->line, "XOFF detect\n", 0)); | 2302 | DFLOW(DEBUG_LOG(info->line, "XOFF detect\n", 0)); |
@@ -2391,7 +2391,7 @@ more_data: | |||
2391 | 2391 | ||
2392 | 2392 | ||
2393 | info->icount.rx++; | 2393 | info->icount.rx++; |
2394 | data_read = *((unsigned long *)&info->port[REG_DATA_STATUS32]); | 2394 | data_read = *((unsigned long *)&info->ioport[REG_DATA_STATUS32]); |
2395 | if (data_read & IO_MASK(R_SERIAL0_READ, data_avail)) { | 2395 | if (data_read & IO_MASK(R_SERIAL0_READ, data_avail)) { |
2396 | DEBUG_LOG(info->line, "ser_rx %c in loop\n", IO_EXTRACT(R_SERIAL0_READ, data_in, data_read)); | 2396 | DEBUG_LOG(info->line, "ser_rx %c in loop\n", IO_EXTRACT(R_SERIAL0_READ, data_in, data_read)); |
2397 | goto more_data; | 2397 | goto more_data; |
@@ -2413,7 +2413,7 @@ static struct e100_serial* handle_ser_rx_interrupt(struct e100_serial *info) | |||
2413 | return handle_ser_rx_interrupt_no_dma(info); | 2413 | return handle_ser_rx_interrupt_no_dma(info); |
2414 | } | 2414 | } |
2415 | /* DMA is used */ | 2415 | /* DMA is used */ |
2416 | rstat = info->port[REG_STATUS]; | 2416 | rstat = info->ioport[REG_STATUS]; |
2417 | if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) ) { | 2417 | if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) ) { |
2418 | DFLOW(DEBUG_LOG(info->line, "XOFF detect\n", 0)); | 2418 | DFLOW(DEBUG_LOG(info->line, "XOFF detect\n", 0)); |
2419 | } | 2419 | } |
@@ -2426,7 +2426,7 @@ static struct e100_serial* handle_ser_rx_interrupt(struct e100_serial *info) | |||
2426 | /* If we got an error, we must reset it by reading the | 2426 | /* If we got an error, we must reset it by reading the |
2427 | * data_in field | 2427 | * data_in field |
2428 | */ | 2428 | */ |
2429 | data = info->port[REG_DATA]; | 2429 | data = info->ioport[REG_DATA]; |
2430 | DINTR1(DEBUG_LOG(info->line, "ser_rx! %c\n", data)); | 2430 | DINTR1(DEBUG_LOG(info->line, "ser_rx! %c\n", data)); |
2431 | DINTR1(DEBUG_LOG(info->line, "ser_rx err stat %02X\n", rstat)); | 2431 | DINTR1(DEBUG_LOG(info->line, "ser_rx err stat %02X\n", rstat)); |
2432 | if (!data && (rstat & SER_FRAMING_ERR_MASK)) { | 2432 | if (!data && (rstat & SER_FRAMING_ERR_MASK)) { |
@@ -2528,10 +2528,10 @@ static void handle_ser_tx_interrupt(struct e100_serial *info) | |||
2528 | unsigned char rstat; | 2528 | unsigned char rstat; |
2529 | DFLOW(DEBUG_LOG(info->line, "tx_int: xchar 0x%02X\n", info->x_char)); | 2529 | DFLOW(DEBUG_LOG(info->line, "tx_int: xchar 0x%02X\n", info->x_char)); |
2530 | local_irq_save(flags); | 2530 | local_irq_save(flags); |
2531 | rstat = info->port[REG_STATUS]; | 2531 | rstat = info->ioport[REG_STATUS]; |
2532 | DFLOW(DEBUG_LOG(info->line, "stat %x\n", rstat)); | 2532 | DFLOW(DEBUG_LOG(info->line, "stat %x\n", rstat)); |
2533 | 2533 | ||
2534 | info->port[REG_TR_DATA] = info->x_char; | 2534 | info->ioport[REG_TR_DATA] = info->x_char; |
2535 | info->icount.tx++; | 2535 | info->icount.tx++; |
2536 | info->x_char = 0; | 2536 | info->x_char = 0; |
2537 | /* We must enable since it is disabled in ser_interrupt */ | 2537 | /* We must enable since it is disabled in ser_interrupt */ |
@@ -2545,7 +2545,7 @@ static void handle_ser_tx_interrupt(struct e100_serial *info) | |||
2545 | /* We only use normal tx interrupt when sending x_char */ | 2545 | /* We only use normal tx interrupt when sending x_char */ |
2546 | DFLOW(DEBUG_LOG(info->line, "tx_int: xchar sent\n", 0)); | 2546 | DFLOW(DEBUG_LOG(info->line, "tx_int: xchar sent\n", 0)); |
2547 | local_irq_save(flags); | 2547 | local_irq_save(flags); |
2548 | rstat = info->port[REG_STATUS]; | 2548 | rstat = info->ioport[REG_STATUS]; |
2549 | DFLOW(DEBUG_LOG(info->line, "stat %x\n", rstat)); | 2549 | DFLOW(DEBUG_LOG(info->line, "stat %x\n", rstat)); |
2550 | e100_disable_serial_tx_ready_irq(info); | 2550 | e100_disable_serial_tx_ready_irq(info); |
2551 | if (info->port.tty->stopped) | 2551 | if (info->port.tty->stopped) |
@@ -2573,7 +2573,7 @@ static void handle_ser_tx_interrupt(struct e100_serial *info) | |||
2573 | DINTR2(DEBUG_LOG(info->line, "tx_int %c\n", info->xmit.buf[info->xmit.tail])); | 2573 | DINTR2(DEBUG_LOG(info->line, "tx_int %c\n", info->xmit.buf[info->xmit.tail])); |
2574 | /* Send a byte, rs485 timing is critical so turn of ints */ | 2574 | /* Send a byte, rs485 timing is critical so turn of ints */ |
2575 | local_irq_save(flags); | 2575 | local_irq_save(flags); |
2576 | info->port[REG_TR_DATA] = info->xmit.buf[info->xmit.tail]; | 2576 | info->ioport[REG_TR_DATA] = info->xmit.buf[info->xmit.tail]; |
2577 | info->xmit.tail = (info->xmit.tail + 1) & (SERIAL_XMIT_SIZE-1); | 2577 | info->xmit.tail = (info->xmit.tail + 1) & (SERIAL_XMIT_SIZE-1); |
2578 | info->icount.tx++; | 2578 | info->icount.tx++; |
2579 | if (info->xmit.head == info->xmit.tail) { | 2579 | if (info->xmit.head == info->xmit.tail) { |
@@ -2848,7 +2848,7 @@ startup(struct e100_serial * info) | |||
2848 | 2848 | ||
2849 | /* dummy read to reset any serial errors */ | 2849 | /* dummy read to reset any serial errors */ |
2850 | 2850 | ||
2851 | (void)info->port[REG_DATA]; | 2851 | (void)info->ioport[REG_DATA]; |
2852 | 2852 | ||
2853 | /* enable the interrupts */ | 2853 | /* enable the interrupts */ |
2854 | if (info->uses_dma_out) | 2854 | if (info->uses_dma_out) |
@@ -2897,7 +2897,7 @@ shutdown(struct e100_serial * info) | |||
2897 | /* shut down the transmitter and receiver */ | 2897 | /* shut down the transmitter and receiver */ |
2898 | DFLOW(DEBUG_LOG(info->line, "shutdown %i\n", info->line)); | 2898 | DFLOW(DEBUG_LOG(info->line, "shutdown %i\n", info->line)); |
2899 | e100_disable_rx(info); | 2899 | e100_disable_rx(info); |
2900 | info->port[REG_TR_CTRL] = (info->tx_ctrl &= ~0x40); | 2900 | info->ioport[REG_TR_CTRL] = (info->tx_ctrl &= ~0x40); |
2901 | 2901 | ||
2902 | /* disable interrupts, reset dma channels */ | 2902 | /* disable interrupts, reset dma channels */ |
2903 | if (info->uses_dma_in) { | 2903 | if (info->uses_dma_in) { |
@@ -2968,7 +2968,7 @@ change_speed(struct e100_serial *info) | |||
2968 | 2968 | ||
2969 | if (!info->port.tty || !info->port.tty->termios) | 2969 | if (!info->port.tty || !info->port.tty->termios) |
2970 | return; | 2970 | return; |
2971 | if (!info->port) | 2971 | if (!info->ioport) |
2972 | return; | 2972 | return; |
2973 | 2973 | ||
2974 | cflag = info->port.tty->termios->c_cflag; | 2974 | cflag = info->port.tty->termios->c_cflag; |
@@ -3037,7 +3037,7 @@ change_speed(struct e100_serial *info) | |||
3037 | 3037 | ||
3038 | info->baud = cflag_to_baud(cflag); | 3038 | info->baud = cflag_to_baud(cflag); |
3039 | #ifndef CONFIG_SVINTO_SIM | 3039 | #ifndef CONFIG_SVINTO_SIM |
3040 | info->port[REG_BAUD] = cflag_to_etrax_baud(cflag); | 3040 | info->ioport[REG_BAUD] = cflag_to_etrax_baud(cflag); |
3041 | #endif /* CONFIG_SVINTO_SIM */ | 3041 | #endif /* CONFIG_SVINTO_SIM */ |
3042 | } | 3042 | } |
3043 | 3043 | ||
@@ -3097,8 +3097,8 @@ change_speed(struct e100_serial *info) | |||
3097 | 3097 | ||
3098 | /* actually write the control regs to the hardware */ | 3098 | /* actually write the control regs to the hardware */ |
3099 | 3099 | ||
3100 | info->port[REG_TR_CTRL] = info->tx_ctrl; | 3100 | info->ioport[REG_TR_CTRL] = info->tx_ctrl; |
3101 | info->port[REG_REC_CTRL] = info->rx_ctrl; | 3101 | info->ioport[REG_REC_CTRL] = info->rx_ctrl; |
3102 | xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->port.tty)); | 3102 | xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->port.tty)); |
3103 | xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable); | 3103 | xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable); |
3104 | if (info->port.tty->termios->c_iflag & IXON ) { | 3104 | if (info->port.tty->termios->c_iflag & IXON ) { |
@@ -3107,7 +3107,7 @@ change_speed(struct e100_serial *info) | |||
3107 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); | 3107 | xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable); |
3108 | } | 3108 | } |
3109 | 3109 | ||
3110 | *((unsigned long *)&info->port[REG_XOFF]) = xoff; | 3110 | *((unsigned long *)&info->ioport[REG_XOFF]) = xoff; |
3111 | local_irq_restore(flags); | 3111 | local_irq_restore(flags); |
3112 | #endif /* !CONFIG_SVINTO_SIM */ | 3112 | #endif /* !CONFIG_SVINTO_SIM */ |
3113 | 3113 | ||
@@ -3156,7 +3156,7 @@ static int rs_raw_write(struct tty_struct *tty, | |||
3156 | #ifdef SERIAL_DEBUG_DATA | 3156 | #ifdef SERIAL_DEBUG_DATA |
3157 | if (info->line == SERIAL_DEBUG_LINE) | 3157 | if (info->line == SERIAL_DEBUG_LINE) |
3158 | printk("rs_raw_write (%d), status %d\n", | 3158 | printk("rs_raw_write (%d), status %d\n", |
3159 | count, info->port[REG_STATUS]); | 3159 | count, info->ioport[REG_STATUS]); |
3160 | #endif | 3160 | #endif |
3161 | 3161 | ||
3162 | #ifdef CONFIG_SVINTO_SIM | 3162 | #ifdef CONFIG_SVINTO_SIM |
@@ -3427,7 +3427,7 @@ get_serial_info(struct e100_serial * info, | |||
3427 | memset(&tmp, 0, sizeof(tmp)); | 3427 | memset(&tmp, 0, sizeof(tmp)); |
3428 | tmp.type = info->type; | 3428 | tmp.type = info->type; |
3429 | tmp.line = info->line; | 3429 | tmp.line = info->line; |
3430 | tmp.port = (int)info->port; | 3430 | tmp.port = (int)info->ioport; |
3431 | tmp.irq = info->irq; | 3431 | tmp.irq = info->irq; |
3432 | tmp.flags = info->flags; | 3432 | tmp.flags = info->flags; |
3433 | tmp.baud_base = info->baud_base; | 3433 | tmp.baud_base = info->baud_base; |
@@ -3557,14 +3557,14 @@ char *get_control_state_str(int MLines, char *s) | |||
3557 | } | 3557 | } |
3558 | #endif | 3558 | #endif |
3559 | 3559 | ||
3560 | static void | 3560 | static int |
3561 | rs_break(struct tty_struct *tty, int break_state) | 3561 | rs_break(struct tty_struct *tty, int break_state) |
3562 | { | 3562 | { |
3563 | struct e100_serial *info = (struct e100_serial *)tty->driver_data; | 3563 | struct e100_serial *info = (struct e100_serial *)tty->driver_data; |
3564 | unsigned long flags; | 3564 | unsigned long flags; |
3565 | 3565 | ||
3566 | if (!info->port) | 3566 | if (!info->ioport) |
3567 | return; | 3567 | return -EIO; |
3568 | 3568 | ||
3569 | local_irq_save(flags); | 3569 | local_irq_save(flags); |
3570 | if (break_state == -1) { | 3570 | if (break_state == -1) { |
@@ -3575,8 +3575,9 @@ rs_break(struct tty_struct *tty, int break_state) | |||
3575 | /* Set bit 7 (txd) and 6 (tr_enable) */ | 3575 | /* Set bit 7 (txd) and 6 (tr_enable) */ |
3576 | info->tx_ctrl |= (0x80 | 0x40); | 3576 | info->tx_ctrl |= (0x80 | 0x40); |
3577 | } | 3577 | } |
3578 | info->port[REG_TR_CTRL] = info->tx_ctrl; | 3578 | info->ioport[REG_TR_CTRL] = info->tx_ctrl; |
3579 | local_irq_restore(flags); | 3579 | local_irq_restore(flags); |
3580 | return 0; | ||
3580 | } | 3581 | } |
3581 | 3582 | ||
3582 | static int | 3583 | static int |
@@ -4231,9 +4232,9 @@ static int line_info(char *buf, struct e100_serial *info) | |||
4231 | unsigned long tmp; | 4232 | unsigned long tmp; |
4232 | 4233 | ||
4233 | ret = sprintf(buf, "%d: uart:E100 port:%lX irq:%d", | 4234 | ret = sprintf(buf, "%d: uart:E100 port:%lX irq:%d", |
4234 | info->line, (unsigned long)info->port, info->irq); | 4235 | info->line, (unsigned long)info->ioport, info->irq); |
4235 | 4236 | ||
4236 | if (!info->port || (info->type == PORT_UNKNOWN)) { | 4237 | if (!info->ioport || (info->type == PORT_UNKNOWN)) { |
4237 | ret += sprintf(buf+ret, "\n"); | 4238 | ret += sprintf(buf+ret, "\n"); |
4238 | return ret; | 4239 | return ret; |
4239 | } | 4240 | } |
@@ -4281,7 +4282,7 @@ static int line_info(char *buf, struct e100_serial *info) | |||
4281 | } | 4282 | } |
4282 | 4283 | ||
4283 | { | 4284 | { |
4284 | unsigned char rstat = info->port[REG_STATUS]; | 4285 | unsigned char rstat = info->ioport[REG_STATUS]; |
4285 | if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) ) | 4286 | if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) ) |
4286 | ret += sprintf(buf+ret, " xoff_detect:1"); | 4287 | ret += sprintf(buf+ret, " xoff_detect:1"); |
4287 | } | 4288 | } |
@@ -4502,7 +4503,7 @@ rs_init(void) | |||
4502 | 4503 | ||
4503 | if (info->enabled) { | 4504 | if (info->enabled) { |
4504 | printk(KERN_INFO "%s%d at 0x%x is a builtin UART with DMA\n", | 4505 | printk(KERN_INFO "%s%d at 0x%x is a builtin UART with DMA\n", |
4505 | serial_driver->name, info->line, (unsigned int)info->port); | 4506 | serial_driver->name, info->line, (unsigned int)info->ioport); |
4506 | } | 4507 | } |
4507 | } | 4508 | } |
4508 | #ifdef CONFIG_ETRAX_FAST_TIMER | 4509 | #ifdef CONFIG_ETRAX_FAST_TIMER |
diff --git a/drivers/serial/crisv10.h b/drivers/serial/crisv10.h index ccd0f32b7372..e3c5c8c3c09b 100644 --- a/drivers/serial/crisv10.h +++ b/drivers/serial/crisv10.h | |||
@@ -36,8 +36,9 @@ struct etrax_recv_buffer { | |||
36 | }; | 36 | }; |
37 | 37 | ||
38 | struct e100_serial { | 38 | struct e100_serial { |
39 | struct tty_port port; | ||
39 | int baud; | 40 | int baud; |
40 | volatile u8 *port; /* R_SERIALx_CTRL */ | 41 | volatile u8 *ioport; /* R_SERIALx_CTRL */ |
41 | u32 irq; /* bitnr in R_IRQ_MASK2 for dmaX_descr */ | 42 | u32 irq; /* bitnr in R_IRQ_MASK2 for dmaX_descr */ |
42 | 43 | ||
43 | /* Output registers */ | 44 | /* Output registers */ |
diff --git a/drivers/sh/maple/maple.c b/drivers/sh/maple/maple.c index be97789fa5fd..d1812d32f47d 100644 --- a/drivers/sh/maple/maple.c +++ b/drivers/sh/maple/maple.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * Core maple bus functionality | 2 | * Core maple bus functionality |
3 | * | 3 | * |
4 | * Copyright (C) 2007, 2008 Adrian McMenamin | 4 | * Copyright (C) 2007, 2008 Adrian McMenamin |
5 | * Copyright (C) 2001 - 2008 Paul Mundt | ||
5 | * | 6 | * |
6 | * Based on 2.4 code by: | 7 | * Based on 2.4 code by: |
7 | * | 8 | * |
@@ -31,7 +32,7 @@ | |||
31 | #include <mach/dma.h> | 32 | #include <mach/dma.h> |
32 | #include <mach/sysasic.h> | 33 | #include <mach/sysasic.h> |
33 | 34 | ||
34 | MODULE_AUTHOR("Yaegshi Takeshi, Paul Mundt, M.R. Brown, Adrian McMenamin"); | 35 | MODULE_AUTHOR("Yaegashi Takeshi, Paul Mundt, M. R. Brown, Adrian McMenamin"); |
35 | MODULE_DESCRIPTION("Maple bus driver for Dreamcast"); | 36 | MODULE_DESCRIPTION("Maple bus driver for Dreamcast"); |
36 | MODULE_LICENSE("GPL v2"); | 37 | MODULE_LICENSE("GPL v2"); |
37 | MODULE_SUPPORTED_DEVICE("{{SEGA, Dreamcast/Maple}}"); | 38 | MODULE_SUPPORTED_DEVICE("{{SEGA, Dreamcast/Maple}}"); |
@@ -65,19 +66,36 @@ static bool checked[4]; | |||
65 | static struct maple_device *baseunits[4]; | 66 | static struct maple_device *baseunits[4]; |
66 | 67 | ||
67 | /** | 68 | /** |
68 | * maple_driver_register - register a device driver | 69 | * maple_driver_register - register a maple driver |
69 | * automatically makes the driver bus a maple bus | 70 | * @drv: maple driver to be registered. |
70 | * @drv: the driver to be registered | 71 | * |
72 | * Registers the passed in @drv, while updating the bus type. | ||
73 | * Devices with matching function IDs will be automatically probed. | ||
71 | */ | 74 | */ |
72 | int maple_driver_register(struct device_driver *drv) | 75 | int maple_driver_register(struct maple_driver *drv) |
73 | { | 76 | { |
74 | if (!drv) | 77 | if (!drv) |
75 | return -EINVAL; | 78 | return -EINVAL; |
76 | drv->bus = &maple_bus_type; | 79 | |
77 | return driver_register(drv); | 80 | drv->drv.bus = &maple_bus_type; |
81 | |||
82 | return driver_register(&drv->drv); | ||
78 | } | 83 | } |
79 | EXPORT_SYMBOL_GPL(maple_driver_register); | 84 | EXPORT_SYMBOL_GPL(maple_driver_register); |
80 | 85 | ||
86 | /** | ||
87 | * maple_driver_unregister - unregister a maple driver. | ||
88 | * @drv: maple driver to unregister. | ||
89 | * | ||
90 | * Cleans up after maple_driver_register(). To be invoked in the exit | ||
91 | * path of any module drivers. | ||
92 | */ | ||
93 | void maple_driver_unregister(struct maple_driver *drv) | ||
94 | { | ||
95 | driver_unregister(&drv->drv); | ||
96 | } | ||
97 | EXPORT_SYMBOL_GPL(maple_driver_unregister); | ||
98 | |||
81 | /* set hardware registers to enable next round of dma */ | 99 | /* set hardware registers to enable next round of dma */ |
82 | static void maplebus_dma_reset(void) | 100 | static void maplebus_dma_reset(void) |
83 | { | 101 | { |
@@ -129,13 +147,13 @@ static void maple_release_device(struct device *dev) | |||
129 | kfree(mdev); | 147 | kfree(mdev); |
130 | } | 148 | } |
131 | 149 | ||
132 | /* | 150 | /** |
133 | * maple_add_packet - add a single instruction to the queue | 151 | * maple_add_packet - add a single instruction to the queue |
134 | * @mdev - maple device | 152 | * @mdev: maple device |
135 | * @function - function on device being queried | 153 | * @function: function on device being queried |
136 | * @command - maple command to add | 154 | * @command: maple command to add |
137 | * @length - length of command string (in 32 bit words) | 155 | * @length: length of command string (in 32 bit words) |
138 | * @data - remainder of command string | 156 | * @data: remainder of command string |
139 | */ | 157 | */ |
140 | int maple_add_packet(struct maple_device *mdev, u32 function, u32 command, | 158 | int maple_add_packet(struct maple_device *mdev, u32 function, u32 command, |
141 | size_t length, void *data) | 159 | size_t length, void *data) |
@@ -176,14 +194,15 @@ out: | |||
176 | } | 194 | } |
177 | EXPORT_SYMBOL_GPL(maple_add_packet); | 195 | EXPORT_SYMBOL_GPL(maple_add_packet); |
178 | 196 | ||
179 | /* | 197 | /** |
180 | * maple_add_packet_sleeps - add a single instruction to the queue | 198 | * maple_add_packet_sleeps - add a single instruction to the queue |
181 | * - waits for lock to be free | 199 | * @mdev: maple device |
182 | * @mdev - maple device | 200 | * @function: function on device being queried |
183 | * @function - function on device being queried | 201 | * @command: maple command to add |
184 | * @command - maple command to add | 202 | * @length: length of command string (in 32 bit words) |
185 | * @length - length of command string (in 32 bit words) | 203 | * @data: remainder of command string |
186 | * @data - remainder of command string | 204 | * |
205 | * Same as maple_add_packet(), but waits for the lock to become free. | ||
187 | */ | 206 | */ |
188 | int maple_add_packet_sleeps(struct maple_device *mdev, u32 function, | 207 | int maple_add_packet_sleeps(struct maple_device *mdev, u32 function, |
189 | u32 command, size_t length, void *data) | 208 | u32 command, size_t length, void *data) |
@@ -724,11 +743,9 @@ static int maple_get_dma_buffer(void) | |||
724 | static int match_maple_bus_driver(struct device *devptr, | 743 | static int match_maple_bus_driver(struct device *devptr, |
725 | struct device_driver *drvptr) | 744 | struct device_driver *drvptr) |
726 | { | 745 | { |
727 | struct maple_driver *maple_drv; | 746 | struct maple_driver *maple_drv = to_maple_driver(drvptr); |
728 | struct maple_device *maple_dev; | 747 | struct maple_device *maple_dev = to_maple_dev(devptr); |
729 | 748 | ||
730 | maple_drv = container_of(drvptr, struct maple_driver, drv); | ||
731 | maple_dev = container_of(devptr, struct maple_device, dev); | ||
732 | /* Trap empty port case */ | 749 | /* Trap empty port case */ |
733 | if (maple_dev->devinfo.function == 0xFFFFFFFF) | 750 | if (maple_dev->devinfo.function == 0xFFFFFFFF) |
734 | return 0; | 751 | return 0; |
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index 2303521b4f09..b9d0efb6803f 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig | |||
@@ -149,6 +149,12 @@ config SPI_OMAP24XX | |||
149 | SPI master controller for OMAP24xx/OMAP34xx Multichannel SPI | 149 | SPI master controller for OMAP24xx/OMAP34xx Multichannel SPI |
150 | (McSPI) modules. | 150 | (McSPI) modules. |
151 | 151 | ||
152 | config SPI_ORION | ||
153 | tristate "Orion SPI master (EXPERIMENTAL)" | ||
154 | depends on PLAT_ORION && EXPERIMENTAL | ||
155 | help | ||
156 | This enables using the SPI master controller on the Orion chips. | ||
157 | |||
152 | config SPI_PXA2XX | 158 | config SPI_PXA2XX |
153 | tristate "PXA2xx SSP SPI master" | 159 | tristate "PXA2xx SSP SPI master" |
154 | depends on ARCH_PXA && EXPERIMENTAL | 160 | depends on ARCH_PXA && EXPERIMENTAL |
diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile index 7fca043ce723..ccf18de34e1e 100644 --- a/drivers/spi/Makefile +++ b/drivers/spi/Makefile | |||
@@ -21,6 +21,7 @@ obj-$(CONFIG_SPI_LM70_LLP) += spi_lm70llp.o | |||
21 | obj-$(CONFIG_SPI_PXA2XX) += pxa2xx_spi.o | 21 | obj-$(CONFIG_SPI_PXA2XX) += pxa2xx_spi.o |
22 | obj-$(CONFIG_SPI_OMAP_UWIRE) += omap_uwire.o | 22 | obj-$(CONFIG_SPI_OMAP_UWIRE) += omap_uwire.o |
23 | obj-$(CONFIG_SPI_OMAP24XX) += omap2_mcspi.o | 23 | obj-$(CONFIG_SPI_OMAP24XX) += omap2_mcspi.o |
24 | obj-$(CONFIG_SPI_ORION) += orion_spi.o | ||
24 | obj-$(CONFIG_SPI_MPC52xx_PSC) += mpc52xx_psc_spi.o | 25 | obj-$(CONFIG_SPI_MPC52xx_PSC) += mpc52xx_psc_spi.o |
25 | obj-$(CONFIG_SPI_MPC83xx) += spi_mpc83xx.o | 26 | obj-$(CONFIG_SPI_MPC83xx) += spi_mpc83xx.o |
26 | obj-$(CONFIG_SPI_S3C24XX_GPIO) += spi_s3c24xx_gpio.o | 27 | obj-$(CONFIG_SPI_S3C24XX_GPIO) += spi_s3c24xx_gpio.o |
diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c index 0c7165660853..95190c619c10 100644 --- a/drivers/spi/atmel_spi.c +++ b/drivers/spi/atmel_spi.c | |||
@@ -184,7 +184,8 @@ static void atmel_spi_next_xfer(struct spi_master *master, | |||
184 | { | 184 | { |
185 | struct atmel_spi *as = spi_master_get_devdata(master); | 185 | struct atmel_spi *as = spi_master_get_devdata(master); |
186 | struct spi_transfer *xfer; | 186 | struct spi_transfer *xfer; |
187 | u32 len, remaining, total; | 187 | u32 len, remaining; |
188 | u32 ieval; | ||
188 | dma_addr_t tx_dma, rx_dma; | 189 | dma_addr_t tx_dma, rx_dma; |
189 | 190 | ||
190 | if (!as->current_transfer) | 191 | if (!as->current_transfer) |
@@ -197,6 +198,8 @@ static void atmel_spi_next_xfer(struct spi_master *master, | |||
197 | xfer = NULL; | 198 | xfer = NULL; |
198 | 199 | ||
199 | if (xfer) { | 200 | if (xfer) { |
201 | spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS)); | ||
202 | |||
200 | len = xfer->len; | 203 | len = xfer->len; |
201 | atmel_spi_next_xfer_data(master, xfer, &tx_dma, &rx_dma, &len); | 204 | atmel_spi_next_xfer_data(master, xfer, &tx_dma, &rx_dma, &len); |
202 | remaining = xfer->len - len; | 205 | remaining = xfer->len - len; |
@@ -234,6 +237,8 @@ static void atmel_spi_next_xfer(struct spi_master *master, | |||
234 | as->next_transfer = xfer; | 237 | as->next_transfer = xfer; |
235 | 238 | ||
236 | if (xfer) { | 239 | if (xfer) { |
240 | u32 total; | ||
241 | |||
237 | total = len; | 242 | total = len; |
238 | atmel_spi_next_xfer_data(master, xfer, &tx_dma, &rx_dma, &len); | 243 | atmel_spi_next_xfer_data(master, xfer, &tx_dma, &rx_dma, &len); |
239 | as->next_remaining_bytes = total - len; | 244 | as->next_remaining_bytes = total - len; |
@@ -250,9 +255,11 @@ static void atmel_spi_next_xfer(struct spi_master *master, | |||
250 | " next xfer %p: len %u tx %p/%08x rx %p/%08x\n", | 255 | " next xfer %p: len %u tx %p/%08x rx %p/%08x\n", |
251 | xfer, xfer->len, xfer->tx_buf, xfer->tx_dma, | 256 | xfer, xfer->len, xfer->tx_buf, xfer->tx_dma, |
252 | xfer->rx_buf, xfer->rx_dma); | 257 | xfer->rx_buf, xfer->rx_dma); |
258 | ieval = SPI_BIT(ENDRX) | SPI_BIT(OVRES); | ||
253 | } else { | 259 | } else { |
254 | spi_writel(as, RNCR, 0); | 260 | spi_writel(as, RNCR, 0); |
255 | spi_writel(as, TNCR, 0); | 261 | spi_writel(as, TNCR, 0); |
262 | ieval = SPI_BIT(RXBUFF) | SPI_BIT(ENDRX) | SPI_BIT(OVRES); | ||
256 | } | 263 | } |
257 | 264 | ||
258 | /* REVISIT: We're waiting for ENDRX before we start the next | 265 | /* REVISIT: We're waiting for ENDRX before we start the next |
@@ -265,7 +272,7 @@ static void atmel_spi_next_xfer(struct spi_master *master, | |||
265 | * | 272 | * |
266 | * It should be doable, though. Just not now... | 273 | * It should be doable, though. Just not now... |
267 | */ | 274 | */ |
268 | spi_writel(as, IER, SPI_BIT(ENDRX) | SPI_BIT(OVRES)); | 275 | spi_writel(as, IER, ieval); |
269 | spi_writel(as, PTCR, SPI_BIT(TXTEN) | SPI_BIT(RXTEN)); | 276 | spi_writel(as, PTCR, SPI_BIT(TXTEN) | SPI_BIT(RXTEN)); |
270 | } | 277 | } |
271 | 278 | ||
@@ -396,7 +403,7 @@ atmel_spi_interrupt(int irq, void *dev_id) | |||
396 | 403 | ||
397 | ret = IRQ_HANDLED; | 404 | ret = IRQ_HANDLED; |
398 | 405 | ||
399 | spi_writel(as, IDR, (SPI_BIT(ENDTX) | SPI_BIT(ENDRX) | 406 | spi_writel(as, IDR, (SPI_BIT(RXBUFF) | SPI_BIT(ENDRX) |
400 | | SPI_BIT(OVRES))); | 407 | | SPI_BIT(OVRES))); |
401 | 408 | ||
402 | /* | 409 | /* |
@@ -418,7 +425,7 @@ atmel_spi_interrupt(int irq, void *dev_id) | |||
418 | if (xfer->delay_usecs) | 425 | if (xfer->delay_usecs) |
419 | udelay(xfer->delay_usecs); | 426 | udelay(xfer->delay_usecs); |
420 | 427 | ||
421 | dev_warn(master->dev.parent, "fifo overrun (%u/%u remaining)\n", | 428 | dev_warn(master->dev.parent, "overrun (%u/%u remaining)\n", |
422 | spi_readl(as, TCR), spi_readl(as, RCR)); | 429 | spi_readl(as, TCR), spi_readl(as, RCR)); |
423 | 430 | ||
424 | /* | 431 | /* |
@@ -442,7 +449,7 @@ atmel_spi_interrupt(int irq, void *dev_id) | |||
442 | spi_readl(as, SR); | 449 | spi_readl(as, SR); |
443 | 450 | ||
444 | atmel_spi_msg_done(master, as, msg, -EIO, 0); | 451 | atmel_spi_msg_done(master, as, msg, -EIO, 0); |
445 | } else if (pending & SPI_BIT(ENDRX)) { | 452 | } else if (pending & (SPI_BIT(RXBUFF) | SPI_BIT(ENDRX))) { |
446 | ret = IRQ_HANDLED; | 453 | ret = IRQ_HANDLED; |
447 | 454 | ||
448 | spi_writel(as, IDR, pending); | 455 | spi_writel(as, IDR, pending); |
diff --git a/drivers/spi/orion_spi.c b/drivers/spi/orion_spi.c new file mode 100644 index 000000000000..c4eaacd6e553 --- /dev/null +++ b/drivers/spi/orion_spi.c | |||
@@ -0,0 +1,574 @@ | |||
1 | /* | ||
2 | * orion_spi.c -- Marvell Orion SPI controller driver | ||
3 | * | ||
4 | * Author: Shadi Ammouri <shadi@marvell.com> | ||
5 | * Copyright (C) 2007-2008 Marvell Ltd. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | #include <linux/interrupt.h> | ||
14 | #include <linux/delay.h> | ||
15 | #include <linux/platform_device.h> | ||
16 | #include <linux/err.h> | ||
17 | #include <linux/io.h> | ||
18 | #include <linux/spi/spi.h> | ||
19 | #include <linux/spi/orion_spi.h> | ||
20 | #include <asm/unaligned.h> | ||
21 | |||
22 | #define DRIVER_NAME "orion_spi" | ||
23 | |||
24 | #define ORION_NUM_CHIPSELECTS 1 /* only one slave is supported*/ | ||
25 | #define ORION_SPI_WAIT_RDY_MAX_LOOP 2000 /* in usec */ | ||
26 | |||
27 | #define ORION_SPI_IF_CTRL_REG 0x00 | ||
28 | #define ORION_SPI_IF_CONFIG_REG 0x04 | ||
29 | #define ORION_SPI_DATA_OUT_REG 0x08 | ||
30 | #define ORION_SPI_DATA_IN_REG 0x0c | ||
31 | #define ORION_SPI_INT_CAUSE_REG 0x10 | ||
32 | |||
33 | #define ORION_SPI_IF_8_16_BIT_MODE (1 << 5) | ||
34 | #define ORION_SPI_CLK_PRESCALE_MASK 0x1F | ||
35 | |||
36 | struct orion_spi { | ||
37 | struct work_struct work; | ||
38 | |||
39 | /* Lock access to transfer list. */ | ||
40 | spinlock_t lock; | ||
41 | |||
42 | struct list_head msg_queue; | ||
43 | struct spi_master *master; | ||
44 | void __iomem *base; | ||
45 | unsigned int max_speed; | ||
46 | unsigned int min_speed; | ||
47 | struct orion_spi_info *spi_info; | ||
48 | }; | ||
49 | |||
50 | static struct workqueue_struct *orion_spi_wq; | ||
51 | |||
52 | static inline void __iomem *spi_reg(struct orion_spi *orion_spi, u32 reg) | ||
53 | { | ||
54 | return orion_spi->base + reg; | ||
55 | } | ||
56 | |||
57 | static inline void | ||
58 | orion_spi_setbits(struct orion_spi *orion_spi, u32 reg, u32 mask) | ||
59 | { | ||
60 | void __iomem *reg_addr = spi_reg(orion_spi, reg); | ||
61 | u32 val; | ||
62 | |||
63 | val = readl(reg_addr); | ||
64 | val |= mask; | ||
65 | writel(val, reg_addr); | ||
66 | } | ||
67 | |||
68 | static inline void | ||
69 | orion_spi_clrbits(struct orion_spi *orion_spi, u32 reg, u32 mask) | ||
70 | { | ||
71 | void __iomem *reg_addr = spi_reg(orion_spi, reg); | ||
72 | u32 val; | ||
73 | |||
74 | val = readl(reg_addr); | ||
75 | val &= ~mask; | ||
76 | writel(val, reg_addr); | ||
77 | } | ||
78 | |||
79 | static int orion_spi_set_transfer_size(struct orion_spi *orion_spi, int size) | ||
80 | { | ||
81 | if (size == 16) { | ||
82 | orion_spi_setbits(orion_spi, ORION_SPI_IF_CONFIG_REG, | ||
83 | ORION_SPI_IF_8_16_BIT_MODE); | ||
84 | } else if (size == 8) { | ||
85 | orion_spi_clrbits(orion_spi, ORION_SPI_IF_CONFIG_REG, | ||
86 | ORION_SPI_IF_8_16_BIT_MODE); | ||
87 | } else { | ||
88 | pr_debug("Bad bits per word value %d (only 8 or 16 are " | ||
89 | "allowed).\n", size); | ||
90 | return -EINVAL; | ||
91 | } | ||
92 | |||
93 | return 0; | ||
94 | } | ||
95 | |||
96 | static int orion_spi_baudrate_set(struct spi_device *spi, unsigned int speed) | ||
97 | { | ||
98 | u32 tclk_hz; | ||
99 | u32 rate; | ||
100 | u32 prescale; | ||
101 | u32 reg; | ||
102 | struct orion_spi *orion_spi; | ||
103 | |||
104 | orion_spi = spi_master_get_devdata(spi->master); | ||
105 | |||
106 | tclk_hz = orion_spi->spi_info->tclk; | ||
107 | |||
108 | /* | ||
109 | * the supported rates are: 4,6,8...30 | ||
110 | * round up as we look for equal or less speed | ||
111 | */ | ||
112 | rate = DIV_ROUND_UP(tclk_hz, speed); | ||
113 | rate = roundup(rate, 2); | ||
114 | |||
115 | /* check if requested speed is too small */ | ||
116 | if (rate > 30) | ||
117 | return -EINVAL; | ||
118 | |||
119 | if (rate < 4) | ||
120 | rate = 4; | ||
121 | |||
122 | /* Convert the rate to SPI clock divisor value. */ | ||
123 | prescale = 0x10 + rate/2; | ||
124 | |||
125 | reg = readl(spi_reg(orion_spi, ORION_SPI_IF_CONFIG_REG)); | ||
126 | reg = ((reg & ~ORION_SPI_CLK_PRESCALE_MASK) | prescale); | ||
127 | writel(reg, spi_reg(orion_spi, ORION_SPI_IF_CONFIG_REG)); | ||
128 | |||
129 | return 0; | ||
130 | } | ||
131 | |||
132 | /* | ||
133 | * called only when no transfer is active on the bus | ||
134 | */ | ||
135 | static int | ||
136 | orion_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) | ||
137 | { | ||
138 | struct orion_spi *orion_spi; | ||
139 | unsigned int speed = spi->max_speed_hz; | ||
140 | unsigned int bits_per_word = spi->bits_per_word; | ||
141 | int rc; | ||
142 | |||
143 | orion_spi = spi_master_get_devdata(spi->master); | ||
144 | |||
145 | if ((t != NULL) && t->speed_hz) | ||
146 | speed = t->speed_hz; | ||
147 | |||
148 | if ((t != NULL) && t->bits_per_word) | ||
149 | bits_per_word = t->bits_per_word; | ||
150 | |||
151 | rc = orion_spi_baudrate_set(spi, speed); | ||
152 | if (rc) | ||
153 | return rc; | ||
154 | |||
155 | return orion_spi_set_transfer_size(orion_spi, bits_per_word); | ||
156 | } | ||
157 | |||
158 | static void orion_spi_set_cs(struct orion_spi *orion_spi, int enable) | ||
159 | { | ||
160 | if (enable) | ||
161 | orion_spi_setbits(orion_spi, ORION_SPI_IF_CTRL_REG, 0x1); | ||
162 | else | ||
163 | orion_spi_clrbits(orion_spi, ORION_SPI_IF_CTRL_REG, 0x1); | ||
164 | } | ||
165 | |||
166 | static inline int orion_spi_wait_till_ready(struct orion_spi *orion_spi) | ||
167 | { | ||
168 | int i; | ||
169 | |||
170 | for (i = 0; i < ORION_SPI_WAIT_RDY_MAX_LOOP; i++) { | ||
171 | if (readl(spi_reg(orion_spi, ORION_SPI_INT_CAUSE_REG))) | ||
172 | return 1; | ||
173 | else | ||
174 | udelay(1); | ||
175 | } | ||
176 | |||
177 | return -1; | ||
178 | } | ||
179 | |||
180 | static inline int | ||
181 | orion_spi_write_read_8bit(struct spi_device *spi, | ||
182 | const u8 **tx_buf, u8 **rx_buf) | ||
183 | { | ||
184 | void __iomem *tx_reg, *rx_reg, *int_reg; | ||
185 | struct orion_spi *orion_spi; | ||
186 | |||
187 | orion_spi = spi_master_get_devdata(spi->master); | ||
188 | tx_reg = spi_reg(orion_spi, ORION_SPI_DATA_OUT_REG); | ||
189 | rx_reg = spi_reg(orion_spi, ORION_SPI_DATA_IN_REG); | ||
190 | int_reg = spi_reg(orion_spi, ORION_SPI_INT_CAUSE_REG); | ||
191 | |||
192 | /* clear the interrupt cause register */ | ||
193 | writel(0x0, int_reg); | ||
194 | |||
195 | if (tx_buf && *tx_buf) | ||
196 | writel(*(*tx_buf)++, tx_reg); | ||
197 | else | ||
198 | writel(0, tx_reg); | ||
199 | |||
200 | if (orion_spi_wait_till_ready(orion_spi) < 0) { | ||
201 | dev_err(&spi->dev, "TXS timed out\n"); | ||
202 | return -1; | ||
203 | } | ||
204 | |||
205 | if (rx_buf && *rx_buf) | ||
206 | *(*rx_buf)++ = readl(rx_reg); | ||
207 | |||
208 | return 1; | ||
209 | } | ||
210 | |||
211 | static inline int | ||
212 | orion_spi_write_read_16bit(struct spi_device *spi, | ||
213 | const u16 **tx_buf, u16 **rx_buf) | ||
214 | { | ||
215 | void __iomem *tx_reg, *rx_reg, *int_reg; | ||
216 | struct orion_spi *orion_spi; | ||
217 | |||
218 | orion_spi = spi_master_get_devdata(spi->master); | ||
219 | tx_reg = spi_reg(orion_spi, ORION_SPI_DATA_OUT_REG); | ||
220 | rx_reg = spi_reg(orion_spi, ORION_SPI_DATA_IN_REG); | ||
221 | int_reg = spi_reg(orion_spi, ORION_SPI_INT_CAUSE_REG); | ||
222 | |||
223 | /* clear the interrupt cause register */ | ||
224 | writel(0x0, int_reg); | ||
225 | |||
226 | if (tx_buf && *tx_buf) | ||
227 | writel(__cpu_to_le16(get_unaligned((*tx_buf)++)), tx_reg); | ||
228 | else | ||
229 | writel(0, tx_reg); | ||
230 | |||
231 | if (orion_spi_wait_till_ready(orion_spi) < 0) { | ||
232 | dev_err(&spi->dev, "TXS timed out\n"); | ||
233 | return -1; | ||
234 | } | ||
235 | |||
236 | if (rx_buf && *rx_buf) | ||
237 | put_unaligned(__le16_to_cpu(readl(rx_reg)), (*rx_buf)++); | ||
238 | |||
239 | return 1; | ||
240 | } | ||
241 | |||
242 | static unsigned int | ||
243 | orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer) | ||
244 | { | ||
245 | struct orion_spi *orion_spi; | ||
246 | unsigned int count; | ||
247 | int word_len; | ||
248 | |||
249 | orion_spi = spi_master_get_devdata(spi->master); | ||
250 | word_len = spi->bits_per_word; | ||
251 | count = xfer->len; | ||
252 | |||
253 | if (word_len == 8) { | ||
254 | const u8 *tx = xfer->tx_buf; | ||
255 | u8 *rx = xfer->rx_buf; | ||
256 | |||
257 | do { | ||
258 | if (orion_spi_write_read_8bit(spi, &tx, &rx) < 0) | ||
259 | goto out; | ||
260 | count--; | ||
261 | } while (count); | ||
262 | } else if (word_len == 16) { | ||
263 | const u16 *tx = xfer->tx_buf; | ||
264 | u16 *rx = xfer->rx_buf; | ||
265 | |||
266 | do { | ||
267 | if (orion_spi_write_read_16bit(spi, &tx, &rx) < 0) | ||
268 | goto out; | ||
269 | count -= 2; | ||
270 | } while (count); | ||
271 | } | ||
272 | |||
273 | out: | ||
274 | return xfer->len - count; | ||
275 | } | ||
276 | |||
277 | |||
278 | static void orion_spi_work(struct work_struct *work) | ||
279 | { | ||
280 | struct orion_spi *orion_spi = | ||
281 | container_of(work, struct orion_spi, work); | ||
282 | |||
283 | spin_lock_irq(&orion_spi->lock); | ||
284 | while (!list_empty(&orion_spi->msg_queue)) { | ||
285 | struct spi_message *m; | ||
286 | struct spi_device *spi; | ||
287 | struct spi_transfer *t = NULL; | ||
288 | int par_override = 0; | ||
289 | int status = 0; | ||
290 | int cs_active = 0; | ||
291 | |||
292 | m = container_of(orion_spi->msg_queue.next, struct spi_message, | ||
293 | queue); | ||
294 | |||
295 | list_del_init(&m->queue); | ||
296 | spin_unlock_irq(&orion_spi->lock); | ||
297 | |||
298 | spi = m->spi; | ||
299 | |||
300 | /* Load defaults */ | ||
301 | status = orion_spi_setup_transfer(spi, NULL); | ||
302 | |||
303 | if (status < 0) | ||
304 | goto msg_done; | ||
305 | |||
306 | list_for_each_entry(t, &m->transfers, transfer_list) { | ||
307 | if (par_override || t->speed_hz || t->bits_per_word) { | ||
308 | par_override = 1; | ||
309 | status = orion_spi_setup_transfer(spi, t); | ||
310 | if (status < 0) | ||
311 | break; | ||
312 | if (!t->speed_hz && !t->bits_per_word) | ||
313 | par_override = 0; | ||
314 | } | ||
315 | |||
316 | if (!cs_active) { | ||
317 | orion_spi_set_cs(orion_spi, 1); | ||
318 | cs_active = 1; | ||
319 | } | ||
320 | |||
321 | if (t->len) | ||
322 | m->actual_length += | ||
323 | orion_spi_write_read(spi, t); | ||
324 | |||
325 | if (t->delay_usecs) | ||
326 | udelay(t->delay_usecs); | ||
327 | |||
328 | if (t->cs_change) { | ||
329 | orion_spi_set_cs(orion_spi, 0); | ||
330 | cs_active = 0; | ||
331 | } | ||
332 | } | ||
333 | |||
334 | msg_done: | ||
335 | if (cs_active) | ||
336 | orion_spi_set_cs(orion_spi, 0); | ||
337 | |||
338 | m->status = status; | ||
339 | m->complete(m->context); | ||
340 | |||
341 | spin_lock_irq(&orion_spi->lock); | ||
342 | } | ||
343 | |||
344 | spin_unlock_irq(&orion_spi->lock); | ||
345 | } | ||
346 | |||
347 | static int __init orion_spi_reset(struct orion_spi *orion_spi) | ||
348 | { | ||
349 | /* Verify that the CS is deasserted */ | ||
350 | orion_spi_set_cs(orion_spi, 0); | ||
351 | |||
352 | return 0; | ||
353 | } | ||
354 | |||
355 | static int orion_spi_setup(struct spi_device *spi) | ||
356 | { | ||
357 | struct orion_spi *orion_spi; | ||
358 | |||
359 | orion_spi = spi_master_get_devdata(spi->master); | ||
360 | |||
361 | if (spi->mode) { | ||
362 | dev_err(&spi->dev, "setup: unsupported mode bits %x\n", | ||
363 | spi->mode); | ||
364 | return -EINVAL; | ||
365 | } | ||
366 | |||
367 | if (spi->bits_per_word == 0) | ||
368 | spi->bits_per_word = 8; | ||
369 | |||
370 | if ((spi->max_speed_hz == 0) | ||
371 | || (spi->max_speed_hz > orion_spi->max_speed)) | ||
372 | spi->max_speed_hz = orion_spi->max_speed; | ||
373 | |||
374 | if (spi->max_speed_hz < orion_spi->min_speed) { | ||
375 | dev_err(&spi->dev, "setup: requested speed too low %d Hz\n", | ||
376 | spi->max_speed_hz); | ||
377 | return -EINVAL; | ||
378 | } | ||
379 | |||
380 | /* | ||
381 | * baudrate & width will be set orion_spi_setup_transfer | ||
382 | */ | ||
383 | return 0; | ||
384 | } | ||
385 | |||
386 | static int orion_spi_transfer(struct spi_device *spi, struct spi_message *m) | ||
387 | { | ||
388 | struct orion_spi *orion_spi; | ||
389 | struct spi_transfer *t = NULL; | ||
390 | unsigned long flags; | ||
391 | |||
392 | m->actual_length = 0; | ||
393 | m->status = 0; | ||
394 | |||
395 | /* reject invalid messages and transfers */ | ||
396 | if (list_empty(&m->transfers) || !m->complete) | ||
397 | return -EINVAL; | ||
398 | |||
399 | orion_spi = spi_master_get_devdata(spi->master); | ||
400 | |||
401 | list_for_each_entry(t, &m->transfers, transfer_list) { | ||
402 | unsigned int bits_per_word = spi->bits_per_word; | ||
403 | |||
404 | if (t->tx_buf == NULL && t->rx_buf == NULL && t->len) { | ||
405 | dev_err(&spi->dev, | ||
406 | "message rejected : " | ||
407 | "invalid transfer data buffers\n"); | ||
408 | goto msg_rejected; | ||
409 | } | ||
410 | |||
411 | if ((t != NULL) && t->bits_per_word) | ||
412 | bits_per_word = t->bits_per_word; | ||
413 | |||
414 | if ((bits_per_word != 8) && (bits_per_word != 16)) { | ||
415 | dev_err(&spi->dev, | ||
416 | "message rejected : " | ||
417 | "invalid transfer bits_per_word (%d bits)\n", | ||
418 | bits_per_word); | ||
419 | goto msg_rejected; | ||
420 | } | ||
421 | /*make sure buffer length is even when working in 16 bit mode*/ | ||
422 | if ((t != NULL) && (t->bits_per_word == 16) && (t->len & 1)) { | ||
423 | dev_err(&spi->dev, | ||
424 | "message rejected : " | ||
425 | "odd data length (%d) while in 16 bit mode\n", | ||
426 | t->len); | ||
427 | goto msg_rejected; | ||
428 | } | ||
429 | |||
430 | if (t->speed_hz < orion_spi->min_speed) { | ||
431 | dev_err(&spi->dev, | ||
432 | "message rejected : " | ||
433 | "device min speed (%d Hz) exceeds " | ||
434 | "required transfer speed (%d Hz)\n", | ||
435 | orion_spi->min_speed, t->speed_hz); | ||
436 | goto msg_rejected; | ||
437 | } | ||
438 | } | ||
439 | |||
440 | |||
441 | spin_lock_irqsave(&orion_spi->lock, flags); | ||
442 | list_add_tail(&m->queue, &orion_spi->msg_queue); | ||
443 | queue_work(orion_spi_wq, &orion_spi->work); | ||
444 | spin_unlock_irqrestore(&orion_spi->lock, flags); | ||
445 | |||
446 | return 0; | ||
447 | msg_rejected: | ||
448 | /* Message rejected and not queued */ | ||
449 | m->status = -EINVAL; | ||
450 | if (m->complete) | ||
451 | m->complete(m->context); | ||
452 | return -EINVAL; | ||
453 | } | ||
454 | |||
455 | static int __init orion_spi_probe(struct platform_device *pdev) | ||
456 | { | ||
457 | struct spi_master *master; | ||
458 | struct orion_spi *spi; | ||
459 | struct resource *r; | ||
460 | struct orion_spi_info *spi_info; | ||
461 | int status = 0; | ||
462 | |||
463 | spi_info = pdev->dev.platform_data; | ||
464 | |||
465 | master = spi_alloc_master(&pdev->dev, sizeof *spi); | ||
466 | if (master == NULL) { | ||
467 | dev_dbg(&pdev->dev, "master allocation failed\n"); | ||
468 | return -ENOMEM; | ||
469 | } | ||
470 | |||
471 | if (pdev->id != -1) | ||
472 | master->bus_num = pdev->id; | ||
473 | |||
474 | master->setup = orion_spi_setup; | ||
475 | master->transfer = orion_spi_transfer; | ||
476 | master->num_chipselect = ORION_NUM_CHIPSELECTS; | ||
477 | |||
478 | dev_set_drvdata(&pdev->dev, master); | ||
479 | |||
480 | spi = spi_master_get_devdata(master); | ||
481 | spi->master = master; | ||
482 | spi->spi_info = spi_info; | ||
483 | |||
484 | spi->max_speed = DIV_ROUND_UP(spi_info->tclk, 4); | ||
485 | spi->min_speed = DIV_ROUND_UP(spi_info->tclk, 30); | ||
486 | |||
487 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
488 | if (r == NULL) { | ||
489 | status = -ENODEV; | ||
490 | goto out; | ||
491 | } | ||
492 | |||
493 | if (!request_mem_region(r->start, (r->end - r->start) + 1, | ||
494 | pdev->dev.bus_id)) { | ||
495 | status = -EBUSY; | ||
496 | goto out; | ||
497 | } | ||
498 | spi->base = ioremap(r->start, SZ_1K); | ||
499 | |||
500 | INIT_WORK(&spi->work, orion_spi_work); | ||
501 | |||
502 | spin_lock_init(&spi->lock); | ||
503 | INIT_LIST_HEAD(&spi->msg_queue); | ||
504 | |||
505 | if (orion_spi_reset(spi) < 0) | ||
506 | goto out_rel_mem; | ||
507 | |||
508 | status = spi_register_master(master); | ||
509 | if (status < 0) | ||
510 | goto out_rel_mem; | ||
511 | |||
512 | return status; | ||
513 | |||
514 | out_rel_mem: | ||
515 | release_mem_region(r->start, (r->end - r->start) + 1); | ||
516 | |||
517 | out: | ||
518 | spi_master_put(master); | ||
519 | return status; | ||
520 | } | ||
521 | |||
522 | |||
523 | static int __exit orion_spi_remove(struct platform_device *pdev) | ||
524 | { | ||
525 | struct spi_master *master; | ||
526 | struct orion_spi *spi; | ||
527 | struct resource *r; | ||
528 | |||
529 | master = dev_get_drvdata(&pdev->dev); | ||
530 | spi = spi_master_get_devdata(master); | ||
531 | |||
532 | cancel_work_sync(&spi->work); | ||
533 | |||
534 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
535 | release_mem_region(r->start, (r->end - r->start) + 1); | ||
536 | |||
537 | spi_unregister_master(master); | ||
538 | |||
539 | return 0; | ||
540 | } | ||
541 | |||
542 | MODULE_ALIAS("platform:" DRIVER_NAME); | ||
543 | |||
544 | static struct platform_driver orion_spi_driver = { | ||
545 | .driver = { | ||
546 | .name = DRIVER_NAME, | ||
547 | .owner = THIS_MODULE, | ||
548 | }, | ||
549 | .remove = __exit_p(orion_spi_remove), | ||
550 | }; | ||
551 | |||
552 | static int __init orion_spi_init(void) | ||
553 | { | ||
554 | orion_spi_wq = create_singlethread_workqueue( | ||
555 | orion_spi_driver.driver.name); | ||
556 | if (orion_spi_wq == NULL) | ||
557 | return -ENOMEM; | ||
558 | |||
559 | return platform_driver_probe(&orion_spi_driver, orion_spi_probe); | ||
560 | } | ||
561 | module_init(orion_spi_init); | ||
562 | |||
563 | static void __exit orion_spi_exit(void) | ||
564 | { | ||
565 | flush_workqueue(orion_spi_wq); | ||
566 | platform_driver_unregister(&orion_spi_driver); | ||
567 | |||
568 | destroy_workqueue(orion_spi_wq); | ||
569 | } | ||
570 | module_exit(orion_spi_exit); | ||
571 | |||
572 | MODULE_DESCRIPTION("Orion SPI driver"); | ||
573 | MODULE_AUTHOR("Shadi Ammouri <shadi@marvell.com>"); | ||
574 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/spi/spi_s3c24xx.c b/drivers/spi/spi_s3c24xx.c index 1c643c9e1f15..21661c7959c8 100644 --- a/drivers/spi/spi_s3c24xx.c +++ b/drivers/spi/spi_s3c24xx.c | |||
@@ -236,6 +236,19 @@ static irqreturn_t s3c24xx_spi_irq(int irq, void *dev) | |||
236 | return IRQ_HANDLED; | 236 | return IRQ_HANDLED; |
237 | } | 237 | } |
238 | 238 | ||
239 | static void s3c24xx_spi_initialsetup(struct s3c24xx_spi *hw) | ||
240 | { | ||
241 | /* for the moment, permanently enable the clock */ | ||
242 | |||
243 | clk_enable(hw->clk); | ||
244 | |||
245 | /* program defaults into the registers */ | ||
246 | |||
247 | writeb(0xff, hw->regs + S3C2410_SPPRE); | ||
248 | writeb(SPPIN_DEFAULT, hw->regs + S3C2410_SPPIN); | ||
249 | writeb(SPCON_DEFAULT, hw->regs + S3C2410_SPCON); | ||
250 | } | ||
251 | |||
239 | static int __init s3c24xx_spi_probe(struct platform_device *pdev) | 252 | static int __init s3c24xx_spi_probe(struct platform_device *pdev) |
240 | { | 253 | { |
241 | struct s3c2410_spi_info *pdata; | 254 | struct s3c2410_spi_info *pdata; |
@@ -327,15 +340,7 @@ static int __init s3c24xx_spi_probe(struct platform_device *pdev) | |||
327 | goto err_no_clk; | 340 | goto err_no_clk; |
328 | } | 341 | } |
329 | 342 | ||
330 | /* for the moment, permanently enable the clock */ | 343 | s3c24xx_spi_initialsetup(hw); |
331 | |||
332 | clk_enable(hw->clk); | ||
333 | |||
334 | /* program defaults into the registers */ | ||
335 | |||
336 | writeb(0xff, hw->regs + S3C2410_SPPRE); | ||
337 | writeb(SPPIN_DEFAULT, hw->regs + S3C2410_SPPIN); | ||
338 | writeb(SPCON_DEFAULT, hw->regs + S3C2410_SPCON); | ||
339 | 344 | ||
340 | /* setup any gpio we can */ | 345 | /* setup any gpio we can */ |
341 | 346 | ||
@@ -415,7 +420,7 @@ static int s3c24xx_spi_resume(struct platform_device *pdev) | |||
415 | { | 420 | { |
416 | struct s3c24xx_spi *hw = platform_get_drvdata(pdev); | 421 | struct s3c24xx_spi *hw = platform_get_drvdata(pdev); |
417 | 422 | ||
418 | clk_enable(hw->clk); | 423 | s3c24xx_spi_initialsetup(hw); |
419 | return 0; | 424 | return 0; |
420 | } | 425 | } |
421 | 426 | ||
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 2fcc06eb5e60..586d6f1376cf 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
@@ -389,7 +389,6 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev, | |||
389 | if (io->entries <= 0) | 389 | if (io->entries <= 0) |
390 | return io->entries; | 390 | return io->entries; |
391 | 391 | ||
392 | io->count = io->entries; | ||
393 | io->urbs = kmalloc(io->entries * sizeof *io->urbs, mem_flags); | 392 | io->urbs = kmalloc(io->entries * sizeof *io->urbs, mem_flags); |
394 | if (!io->urbs) | 393 | if (!io->urbs) |
395 | goto nomem; | 394 | goto nomem; |
@@ -458,6 +457,7 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev, | |||
458 | io->urbs[--i]->transfer_flags &= ~URB_NO_INTERRUPT; | 457 | io->urbs[--i]->transfer_flags &= ~URB_NO_INTERRUPT; |
459 | 458 | ||
460 | /* transaction state */ | 459 | /* transaction state */ |
460 | io->count = io->entries; | ||
461 | io->status = 0; | 461 | io->status = 0; |
462 | io->bytes = 0; | 462 | io->bytes = 0; |
463 | init_completion(&io->complete); | 463 | init_completion(&io->complete); |
diff --git a/drivers/usb/storage/freecom.c b/drivers/usb/storage/freecom.c index 7a4d45677227..73ac7262239e 100644 --- a/drivers/usb/storage/freecom.c +++ b/drivers/usb/storage/freecom.c | |||
@@ -26,8 +26,6 @@ | |||
26 | * (http://www.freecom.de/) | 26 | * (http://www.freecom.de/) |
27 | */ | 27 | */ |
28 | 28 | ||
29 | #include <linux/hdreg.h> | ||
30 | |||
31 | #include <scsi/scsi.h> | 29 | #include <scsi/scsi.h> |
32 | #include <scsi/scsi_cmnd.h> | 30 | #include <scsi/scsi_cmnd.h> |
33 | 31 | ||
diff --git a/drivers/video/arkfb.c b/drivers/video/arkfb.c index 38a1e8308c83..4bd569e479a7 100644 --- a/drivers/video/arkfb.c +++ b/drivers/video/arkfb.c | |||
@@ -958,20 +958,20 @@ static int __devinit ark_pci_probe(struct pci_dev *dev, const struct pci_device_ | |||
958 | /* Prepare PCI device */ | 958 | /* Prepare PCI device */ |
959 | rc = pci_enable_device(dev); | 959 | rc = pci_enable_device(dev); |
960 | if (rc < 0) { | 960 | if (rc < 0) { |
961 | dev_err(info->dev, "cannot enable PCI device\n"); | 961 | dev_err(info->device, "cannot enable PCI device\n"); |
962 | goto err_enable_device; | 962 | goto err_enable_device; |
963 | } | 963 | } |
964 | 964 | ||
965 | rc = pci_request_regions(dev, "arkfb"); | 965 | rc = pci_request_regions(dev, "arkfb"); |
966 | if (rc < 0) { | 966 | if (rc < 0) { |
967 | dev_err(info->dev, "cannot reserve framebuffer region\n"); | 967 | dev_err(info->device, "cannot reserve framebuffer region\n"); |
968 | goto err_request_regions; | 968 | goto err_request_regions; |
969 | } | 969 | } |
970 | 970 | ||
971 | par->dac = ics5342_init(ark_dac_read_regs, ark_dac_write_regs, info); | 971 | par->dac = ics5342_init(ark_dac_read_regs, ark_dac_write_regs, info); |
972 | if (! par->dac) { | 972 | if (! par->dac) { |
973 | rc = -ENOMEM; | 973 | rc = -ENOMEM; |
974 | dev_err(info->dev, "RAMDAC initialization failed\n"); | 974 | dev_err(info->device, "RAMDAC initialization failed\n"); |
975 | goto err_dac; | 975 | goto err_dac; |
976 | } | 976 | } |
977 | 977 | ||
@@ -982,7 +982,7 @@ static int __devinit ark_pci_probe(struct pci_dev *dev, const struct pci_device_ | |||
982 | info->screen_base = pci_iomap(dev, 0, 0); | 982 | info->screen_base = pci_iomap(dev, 0, 0); |
983 | if (! info->screen_base) { | 983 | if (! info->screen_base) { |
984 | rc = -ENOMEM; | 984 | rc = -ENOMEM; |
985 | dev_err(info->dev, "iomap for framebuffer failed\n"); | 985 | dev_err(info->device, "iomap for framebuffer failed\n"); |
986 | goto err_iomap; | 986 | goto err_iomap; |
987 | } | 987 | } |
988 | 988 | ||
@@ -1004,19 +1004,19 @@ static int __devinit ark_pci_probe(struct pci_dev *dev, const struct pci_device_ | |||
1004 | rc = fb_find_mode(&(info->var), info, mode_option, NULL, 0, NULL, 8); | 1004 | rc = fb_find_mode(&(info->var), info, mode_option, NULL, 0, NULL, 8); |
1005 | if (! ((rc == 1) || (rc == 2))) { | 1005 | if (! ((rc == 1) || (rc == 2))) { |
1006 | rc = -EINVAL; | 1006 | rc = -EINVAL; |
1007 | dev_err(info->dev, "mode %s not found\n", mode_option); | 1007 | dev_err(info->device, "mode %s not found\n", mode_option); |
1008 | goto err_find_mode; | 1008 | goto err_find_mode; |
1009 | } | 1009 | } |
1010 | 1010 | ||
1011 | rc = fb_alloc_cmap(&info->cmap, 256, 0); | 1011 | rc = fb_alloc_cmap(&info->cmap, 256, 0); |
1012 | if (rc < 0) { | 1012 | if (rc < 0) { |
1013 | dev_err(info->dev, "cannot allocate colormap\n"); | 1013 | dev_err(info->device, "cannot allocate colormap\n"); |
1014 | goto err_alloc_cmap; | 1014 | goto err_alloc_cmap; |
1015 | } | 1015 | } |
1016 | 1016 | ||
1017 | rc = register_framebuffer(info); | 1017 | rc = register_framebuffer(info); |
1018 | if (rc < 0) { | 1018 | if (rc < 0) { |
1019 | dev_err(info->dev, "cannot register framebugger\n"); | 1019 | dev_err(info->device, "cannot register framebugger\n"); |
1020 | goto err_reg_fb; | 1020 | goto err_reg_fb; |
1021 | } | 1021 | } |
1022 | 1022 | ||
@@ -1090,7 +1090,7 @@ static int ark_pci_suspend (struct pci_dev* dev, pm_message_t state) | |||
1090 | struct fb_info *info = pci_get_drvdata(dev); | 1090 | struct fb_info *info = pci_get_drvdata(dev); |
1091 | struct arkfb_info *par = info->par; | 1091 | struct arkfb_info *par = info->par; |
1092 | 1092 | ||
1093 | dev_info(info->dev, "suspend\n"); | 1093 | dev_info(info->device, "suspend\n"); |
1094 | 1094 | ||
1095 | acquire_console_sem(); | 1095 | acquire_console_sem(); |
1096 | mutex_lock(&(par->open_lock)); | 1096 | mutex_lock(&(par->open_lock)); |
@@ -1121,7 +1121,7 @@ static int ark_pci_resume (struct pci_dev* dev) | |||
1121 | struct fb_info *info = pci_get_drvdata(dev); | 1121 | struct fb_info *info = pci_get_drvdata(dev); |
1122 | struct arkfb_info *par = info->par; | 1122 | struct arkfb_info *par = info->par; |
1123 | 1123 | ||
1124 | dev_info(info->dev, "resume\n"); | 1124 | dev_info(info->device, "resume\n"); |
1125 | 1125 | ||
1126 | acquire_console_sem(); | 1126 | acquire_console_sem(); |
1127 | mutex_lock(&(par->open_lock)); | 1127 | mutex_lock(&(par->open_lock)); |
diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c index 620ba8120368..cc6b470073da 100644 --- a/drivers/video/aty/atyfb_base.c +++ b/drivers/video/aty/atyfb_base.c | |||
@@ -244,7 +244,7 @@ static int atyfb_sync(struct fb_info *info); | |||
244 | */ | 244 | */ |
245 | 245 | ||
246 | static int aty_init(struct fb_info *info); | 246 | static int aty_init(struct fb_info *info); |
247 | static void aty_resume_chip(struct fb_info *info); | 247 | |
248 | #ifdef CONFIG_ATARI | 248 | #ifdef CONFIG_ATARI |
249 | static int store_video_par(char *videopar, unsigned char m64_num); | 249 | static int store_video_par(char *videopar, unsigned char m64_num); |
250 | #endif | 250 | #endif |
@@ -2023,6 +2023,20 @@ static int atyfb_pci_suspend(struct pci_dev *pdev, pm_message_t state) | |||
2023 | return 0; | 2023 | return 0; |
2024 | } | 2024 | } |
2025 | 2025 | ||
2026 | static void aty_resume_chip(struct fb_info *info) | ||
2027 | { | ||
2028 | struct atyfb_par *par = info->par; | ||
2029 | |||
2030 | aty_st_le32(MEM_CNTL, par->mem_cntl, par); | ||
2031 | |||
2032 | if (par->pll_ops->resume_pll) | ||
2033 | par->pll_ops->resume_pll(info, &par->pll); | ||
2034 | |||
2035 | if (par->aux_start) | ||
2036 | aty_st_le32(BUS_CNTL, | ||
2037 | aty_ld_le32(BUS_CNTL, par) | BUS_APER_REG_DIS, par); | ||
2038 | } | ||
2039 | |||
2026 | static int atyfb_pci_resume(struct pci_dev *pdev) | 2040 | static int atyfb_pci_resume(struct pci_dev *pdev) |
2027 | { | 2041 | { |
2028 | struct fb_info *info = pci_get_drvdata(pdev); | 2042 | struct fb_info *info = pci_get_drvdata(pdev); |
@@ -2659,19 +2673,6 @@ aty_init_exit: | |||
2659 | return ret; | 2673 | return ret; |
2660 | } | 2674 | } |
2661 | 2675 | ||
2662 | static void aty_resume_chip(struct fb_info *info) | ||
2663 | { | ||
2664 | struct atyfb_par *par = info->par; | ||
2665 | |||
2666 | aty_st_le32(MEM_CNTL, par->mem_cntl, par); | ||
2667 | |||
2668 | if (par->pll_ops->resume_pll) | ||
2669 | par->pll_ops->resume_pll(info, &par->pll); | ||
2670 | |||
2671 | if (par->aux_start) | ||
2672 | aty_st_le32(BUS_CNTL, aty_ld_le32(BUS_CNTL, par) | BUS_APER_REG_DIS, par); | ||
2673 | } | ||
2674 | |||
2675 | #ifdef CONFIG_ATARI | 2676 | #ifdef CONFIG_ATARI |
2676 | static int __devinit store_video_par(char *video_str, unsigned char m64_num) | 2677 | static int __devinit store_video_par(char *video_str, unsigned char m64_num) |
2677 | { | 2678 | { |
diff --git a/drivers/video/aty/radeon_accel.c b/drivers/video/aty/radeon_accel.c index 3ca27cb13caa..4d13f68436e6 100644 --- a/drivers/video/aty/radeon_accel.c +++ b/drivers/video/aty/radeon_accel.c | |||
@@ -241,8 +241,8 @@ void radeonfb_engine_reset(struct radeonfb_info *rinfo) | |||
241 | INREG(HOST_PATH_CNTL); | 241 | INREG(HOST_PATH_CNTL); |
242 | OUTREG(HOST_PATH_CNTL, host_path_cntl); | 242 | OUTREG(HOST_PATH_CNTL, host_path_cntl); |
243 | 243 | ||
244 | if (rinfo->family != CHIP_FAMILY_R300 || | 244 | if (rinfo->family != CHIP_FAMILY_R300 && |
245 | rinfo->family != CHIP_FAMILY_R350 || | 245 | rinfo->family != CHIP_FAMILY_R350 && |
246 | rinfo->family != CHIP_FAMILY_RV350) | 246 | rinfo->family != CHIP_FAMILY_RV350) |
247 | OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset); | 247 | OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset); |
248 | 248 | ||
diff --git a/drivers/video/aty/radeon_i2c.c b/drivers/video/aty/radeon_i2c.c index f9e7c29ad9bf..8c8fa35f1b7c 100644 --- a/drivers/video/aty/radeon_i2c.c +++ b/drivers/video/aty/radeon_i2c.c | |||
@@ -69,7 +69,8 @@ static int radeon_setup_i2c_bus(struct radeon_i2c_chan *chan, const char *name) | |||
69 | { | 69 | { |
70 | int rc; | 70 | int rc; |
71 | 71 | ||
72 | strcpy(chan->adapter.name, name); | 72 | snprintf(chan->adapter.name, sizeof(chan->adapter.name), |
73 | "radeonfb %s", name); | ||
73 | chan->adapter.owner = THIS_MODULE; | 74 | chan->adapter.owner = THIS_MODULE; |
74 | chan->adapter.id = I2C_HW_B_RADEON; | 75 | chan->adapter.id = I2C_HW_B_RADEON; |
75 | chan->adapter.algo_data = &chan->algo; | 76 | chan->adapter.algo_data = &chan->algo; |
diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c index 6338d0e2fe07..ea07258565f0 100644 --- a/drivers/video/backlight/pwm_bl.c +++ b/drivers/video/backlight/pwm_bl.c | |||
@@ -68,8 +68,10 @@ static int pwm_backlight_probe(struct platform_device *pdev) | |||
68 | struct pwm_bl_data *pb; | 68 | struct pwm_bl_data *pb; |
69 | int ret; | 69 | int ret; |
70 | 70 | ||
71 | if (!data) | 71 | if (!data) { |
72 | dev_err(&pdev->dev, "failed to find platform data\n"); | ||
72 | return -EINVAL; | 73 | return -EINVAL; |
74 | } | ||
73 | 75 | ||
74 | if (data->init) { | 76 | if (data->init) { |
75 | ret = data->init(&pdev->dev); | 77 | ret = data->init(&pdev->dev); |
@@ -79,6 +81,7 @@ static int pwm_backlight_probe(struct platform_device *pdev) | |||
79 | 81 | ||
80 | pb = kzalloc(sizeof(*pb), GFP_KERNEL); | 82 | pb = kzalloc(sizeof(*pb), GFP_KERNEL); |
81 | if (!pb) { | 83 | if (!pb) { |
84 | dev_err(&pdev->dev, "no memory for state\n"); | ||
82 | ret = -ENOMEM; | 85 | ret = -ENOMEM; |
83 | goto err_alloc; | 86 | goto err_alloc; |
84 | } | 87 | } |
@@ -91,7 +94,8 @@ static int pwm_backlight_probe(struct platform_device *pdev) | |||
91 | dev_err(&pdev->dev, "unable to request PWM for backlight\n"); | 94 | dev_err(&pdev->dev, "unable to request PWM for backlight\n"); |
92 | ret = PTR_ERR(pb->pwm); | 95 | ret = PTR_ERR(pb->pwm); |
93 | goto err_pwm; | 96 | goto err_pwm; |
94 | } | 97 | } else |
98 | dev_dbg(&pdev->dev, "got pwm for backlight\n"); | ||
95 | 99 | ||
96 | bl = backlight_device_register(pdev->name, &pdev->dev, | 100 | bl = backlight_device_register(pdev->name, &pdev->dev, |
97 | pb, &pwm_backlight_ops); | 101 | pb, &pwm_backlight_ops); |
@@ -183,3 +187,5 @@ module_exit(pwm_backlight_exit); | |||
183 | 187 | ||
184 | MODULE_DESCRIPTION("PWM based Backlight Driver"); | 188 | MODULE_DESCRIPTION("PWM based Backlight Driver"); |
185 | MODULE_LICENSE("GPL"); | 189 | MODULE_LICENSE("GPL"); |
190 | MODULE_ALIAS("platform:pwm-backlight"); | ||
191 | |||
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 3ccfa76d9b2a..33859934a8e4 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
@@ -1311,6 +1311,9 @@ static void fbcon_clear(struct vc_data *vc, int sy, int sx, int height, | |||
1311 | if (!height || !width) | 1311 | if (!height || !width) |
1312 | return; | 1312 | return; |
1313 | 1313 | ||
1314 | if (sy < vc->vc_top && vc->vc_top == logo_lines) | ||
1315 | vc->vc_top = 0; | ||
1316 | |||
1314 | /* Split blits that cross physical y_wrap boundary */ | 1317 | /* Split blits that cross physical y_wrap boundary */ |
1315 | 1318 | ||
1316 | y_break = p->vrows - p->yscroll; | 1319 | y_break = p->vrows - p->yscroll; |
diff --git a/drivers/video/fsl-diu-fb.c b/drivers/video/fsl-diu-fb.c index 9cd36c223d33..bd320a2bfb7c 100644 --- a/drivers/video/fsl-diu-fb.c +++ b/drivers/video/fsl-diu-fb.c | |||
@@ -1649,8 +1649,10 @@ static int __init fsl_diu_init(void) | |||
1649 | } | 1649 | } |
1650 | 1650 | ||
1651 | prop = of_get_property(np, "d-cache-size", NULL); | 1651 | prop = of_get_property(np, "d-cache-size", NULL); |
1652 | if (prop == NULL) | 1652 | if (prop == NULL) { |
1653 | of_node_put(np); | ||
1653 | return -ENODEV; | 1654 | return -ENODEV; |
1655 | } | ||
1654 | 1656 | ||
1655 | /* Freescale PLRU requires 13/8 times the cache size to do a proper | 1657 | /* Freescale PLRU requires 13/8 times the cache size to do a proper |
1656 | displacement flush | 1658 | displacement flush |
@@ -1659,8 +1661,10 @@ static int __init fsl_diu_init(void) | |||
1659 | coherence_data_size /= 8; | 1661 | coherence_data_size /= 8; |
1660 | 1662 | ||
1661 | prop = of_get_property(np, "d-cache-line-size", NULL); | 1663 | prop = of_get_property(np, "d-cache-line-size", NULL); |
1662 | if (prop == NULL) | 1664 | if (prop == NULL) { |
1665 | of_node_put(np); | ||
1663 | return -ENODEV; | 1666 | return -ENODEV; |
1667 | } | ||
1664 | d_cache_line_size = *prop; | 1668 | d_cache_line_size = *prop; |
1665 | 1669 | ||
1666 | of_node_put(np); | 1670 | of_node_put(np); |
diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c index 2972f112dbed..8361bd0e3df1 100644 --- a/drivers/video/s3fb.c +++ b/drivers/video/s3fb.c | |||
@@ -903,13 +903,13 @@ static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_i | |||
903 | /* Prepare PCI device */ | 903 | /* Prepare PCI device */ |
904 | rc = pci_enable_device(dev); | 904 | rc = pci_enable_device(dev); |
905 | if (rc < 0) { | 905 | if (rc < 0) { |
906 | dev_err(info->dev, "cannot enable PCI device\n"); | 906 | dev_err(info->device, "cannot enable PCI device\n"); |
907 | goto err_enable_device; | 907 | goto err_enable_device; |
908 | } | 908 | } |
909 | 909 | ||
910 | rc = pci_request_regions(dev, "s3fb"); | 910 | rc = pci_request_regions(dev, "s3fb"); |
911 | if (rc < 0) { | 911 | if (rc < 0) { |
912 | dev_err(info->dev, "cannot reserve framebuffer region\n"); | 912 | dev_err(info->device, "cannot reserve framebuffer region\n"); |
913 | goto err_request_regions; | 913 | goto err_request_regions; |
914 | } | 914 | } |
915 | 915 | ||
@@ -921,7 +921,7 @@ static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_i | |||
921 | info->screen_base = pci_iomap(dev, 0, 0); | 921 | info->screen_base = pci_iomap(dev, 0, 0); |
922 | if (! info->screen_base) { | 922 | if (! info->screen_base) { |
923 | rc = -ENOMEM; | 923 | rc = -ENOMEM; |
924 | dev_err(info->dev, "iomap for framebuffer failed\n"); | 924 | dev_err(info->device, "iomap for framebuffer failed\n"); |
925 | goto err_iomap; | 925 | goto err_iomap; |
926 | } | 926 | } |
927 | 927 | ||
@@ -965,19 +965,19 @@ static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_i | |||
965 | rc = fb_find_mode(&(info->var), info, mode_option, NULL, 0, NULL, 8); | 965 | rc = fb_find_mode(&(info->var), info, mode_option, NULL, 0, NULL, 8); |
966 | if (! ((rc == 1) || (rc == 2))) { | 966 | if (! ((rc == 1) || (rc == 2))) { |
967 | rc = -EINVAL; | 967 | rc = -EINVAL; |
968 | dev_err(info->dev, "mode %s not found\n", mode_option); | 968 | dev_err(info->device, "mode %s not found\n", mode_option); |
969 | goto err_find_mode; | 969 | goto err_find_mode; |
970 | } | 970 | } |
971 | 971 | ||
972 | rc = fb_alloc_cmap(&info->cmap, 256, 0); | 972 | rc = fb_alloc_cmap(&info->cmap, 256, 0); |
973 | if (rc < 0) { | 973 | if (rc < 0) { |
974 | dev_err(info->dev, "cannot allocate colormap\n"); | 974 | dev_err(info->device, "cannot allocate colormap\n"); |
975 | goto err_alloc_cmap; | 975 | goto err_alloc_cmap; |
976 | } | 976 | } |
977 | 977 | ||
978 | rc = register_framebuffer(info); | 978 | rc = register_framebuffer(info); |
979 | if (rc < 0) { | 979 | if (rc < 0) { |
980 | dev_err(info->dev, "cannot register framebuffer\n"); | 980 | dev_err(info->device, "cannot register framebuffer\n"); |
981 | goto err_reg_fb; | 981 | goto err_reg_fb; |
982 | } | 982 | } |
983 | 983 | ||
@@ -1053,7 +1053,7 @@ static int s3_pci_suspend(struct pci_dev* dev, pm_message_t state) | |||
1053 | struct fb_info *info = pci_get_drvdata(dev); | 1053 | struct fb_info *info = pci_get_drvdata(dev); |
1054 | struct s3fb_info *par = info->par; | 1054 | struct s3fb_info *par = info->par; |
1055 | 1055 | ||
1056 | dev_info(info->dev, "suspend\n"); | 1056 | dev_info(info->device, "suspend\n"); |
1057 | 1057 | ||
1058 | acquire_console_sem(); | 1058 | acquire_console_sem(); |
1059 | mutex_lock(&(par->open_lock)); | 1059 | mutex_lock(&(par->open_lock)); |
@@ -1085,7 +1085,7 @@ static int s3_pci_resume(struct pci_dev* dev) | |||
1085 | struct s3fb_info *par = info->par; | 1085 | struct s3fb_info *par = info->par; |
1086 | int err; | 1086 | int err; |
1087 | 1087 | ||
1088 | dev_info(info->dev, "resume\n"); | 1088 | dev_info(info->device, "resume\n"); |
1089 | 1089 | ||
1090 | acquire_console_sem(); | 1090 | acquire_console_sem(); |
1091 | mutex_lock(&(par->open_lock)); | 1091 | mutex_lock(&(par->open_lock)); |
@@ -1102,7 +1102,7 @@ static int s3_pci_resume(struct pci_dev* dev) | |||
1102 | if (err) { | 1102 | if (err) { |
1103 | mutex_unlock(&(par->open_lock)); | 1103 | mutex_unlock(&(par->open_lock)); |
1104 | release_console_sem(); | 1104 | release_console_sem(); |
1105 | dev_err(info->dev, "error %d enabling device for resume\n", err); | 1105 | dev_err(info->device, "error %d enabling device for resume\n", err); |
1106 | return err; | 1106 | return err; |
1107 | } | 1107 | } |
1108 | pci_set_master(dev); | 1108 | pci_set_master(dev); |
diff --git a/drivers/video/vt8623fb.c b/drivers/video/vt8623fb.c index 4a484ee98f8a..34aae7a2a62b 100644 --- a/drivers/video/vt8623fb.c +++ b/drivers/video/vt8623fb.c | |||
@@ -677,13 +677,13 @@ static int __devinit vt8623_pci_probe(struct pci_dev *dev, const struct pci_devi | |||
677 | 677 | ||
678 | rc = pci_enable_device(dev); | 678 | rc = pci_enable_device(dev); |
679 | if (rc < 0) { | 679 | if (rc < 0) { |
680 | dev_err(info->dev, "cannot enable PCI device\n"); | 680 | dev_err(info->device, "cannot enable PCI device\n"); |
681 | goto err_enable_device; | 681 | goto err_enable_device; |
682 | } | 682 | } |
683 | 683 | ||
684 | rc = pci_request_regions(dev, "vt8623fb"); | 684 | rc = pci_request_regions(dev, "vt8623fb"); |
685 | if (rc < 0) { | 685 | if (rc < 0) { |
686 | dev_err(info->dev, "cannot reserve framebuffer region\n"); | 686 | dev_err(info->device, "cannot reserve framebuffer region\n"); |
687 | goto err_request_regions; | 687 | goto err_request_regions; |
688 | } | 688 | } |
689 | 689 | ||
@@ -696,14 +696,14 @@ static int __devinit vt8623_pci_probe(struct pci_dev *dev, const struct pci_devi | |||
696 | info->screen_base = pci_iomap(dev, 0, 0); | 696 | info->screen_base = pci_iomap(dev, 0, 0); |
697 | if (! info->screen_base) { | 697 | if (! info->screen_base) { |
698 | rc = -ENOMEM; | 698 | rc = -ENOMEM; |
699 | dev_err(info->dev, "iomap for framebuffer failed\n"); | 699 | dev_err(info->device, "iomap for framebuffer failed\n"); |
700 | goto err_iomap_1; | 700 | goto err_iomap_1; |
701 | } | 701 | } |
702 | 702 | ||
703 | par->mmio_base = pci_iomap(dev, 1, 0); | 703 | par->mmio_base = pci_iomap(dev, 1, 0); |
704 | if (! par->mmio_base) { | 704 | if (! par->mmio_base) { |
705 | rc = -ENOMEM; | 705 | rc = -ENOMEM; |
706 | dev_err(info->dev, "iomap for MMIO failed\n"); | 706 | dev_err(info->device, "iomap for MMIO failed\n"); |
707 | goto err_iomap_2; | 707 | goto err_iomap_2; |
708 | } | 708 | } |
709 | 709 | ||
@@ -714,7 +714,7 @@ static int __devinit vt8623_pci_probe(struct pci_dev *dev, const struct pci_devi | |||
714 | if ((16 <= memsize1) && (memsize1 <= 64) && (memsize1 == memsize2)) | 714 | if ((16 <= memsize1) && (memsize1 <= 64) && (memsize1 == memsize2)) |
715 | info->screen_size = memsize1 << 20; | 715 | info->screen_size = memsize1 << 20; |
716 | else { | 716 | else { |
717 | dev_err(info->dev, "memory size detection failed (%x %x), suppose 16 MB\n", memsize1, memsize2); | 717 | dev_err(info->device, "memory size detection failed (%x %x), suppose 16 MB\n", memsize1, memsize2); |
718 | info->screen_size = 16 << 20; | 718 | info->screen_size = 16 << 20; |
719 | } | 719 | } |
720 | 720 | ||
@@ -731,19 +731,19 @@ static int __devinit vt8623_pci_probe(struct pci_dev *dev, const struct pci_devi | |||
731 | rc = fb_find_mode(&(info->var), info, mode_option, NULL, 0, NULL, 8); | 731 | rc = fb_find_mode(&(info->var), info, mode_option, NULL, 0, NULL, 8); |
732 | if (! ((rc == 1) || (rc == 2))) { | 732 | if (! ((rc == 1) || (rc == 2))) { |
733 | rc = -EINVAL; | 733 | rc = -EINVAL; |
734 | dev_err(info->dev, "mode %s not found\n", mode_option); | 734 | dev_err(info->device, "mode %s not found\n", mode_option); |
735 | goto err_find_mode; | 735 | goto err_find_mode; |
736 | } | 736 | } |
737 | 737 | ||
738 | rc = fb_alloc_cmap(&info->cmap, 256, 0); | 738 | rc = fb_alloc_cmap(&info->cmap, 256, 0); |
739 | if (rc < 0) { | 739 | if (rc < 0) { |
740 | dev_err(info->dev, "cannot allocate colormap\n"); | 740 | dev_err(info->device, "cannot allocate colormap\n"); |
741 | goto err_alloc_cmap; | 741 | goto err_alloc_cmap; |
742 | } | 742 | } |
743 | 743 | ||
744 | rc = register_framebuffer(info); | 744 | rc = register_framebuffer(info); |
745 | if (rc < 0) { | 745 | if (rc < 0) { |
746 | dev_err(info->dev, "cannot register framebugger\n"); | 746 | dev_err(info->device, "cannot register framebugger\n"); |
747 | goto err_reg_fb; | 747 | goto err_reg_fb; |
748 | } | 748 | } |
749 | 749 | ||
@@ -817,7 +817,7 @@ static int vt8623_pci_suspend(struct pci_dev* dev, pm_message_t state) | |||
817 | struct fb_info *info = pci_get_drvdata(dev); | 817 | struct fb_info *info = pci_get_drvdata(dev); |
818 | struct vt8623fb_info *par = info->par; | 818 | struct vt8623fb_info *par = info->par; |
819 | 819 | ||
820 | dev_info(info->dev, "suspend\n"); | 820 | dev_info(info->device, "suspend\n"); |
821 | 821 | ||
822 | acquire_console_sem(); | 822 | acquire_console_sem(); |
823 | mutex_lock(&(par->open_lock)); | 823 | mutex_lock(&(par->open_lock)); |
@@ -848,7 +848,7 @@ static int vt8623_pci_resume(struct pci_dev* dev) | |||
848 | struct fb_info *info = pci_get_drvdata(dev); | 848 | struct fb_info *info = pci_get_drvdata(dev); |
849 | struct vt8623fb_info *par = info->par; | 849 | struct vt8623fb_info *par = info->par; |
850 | 850 | ||
851 | dev_info(info->dev, "resume\n"); | 851 | dev_info(info->device, "resume\n"); |
852 | 852 | ||
853 | acquire_console_sem(); | 853 | acquire_console_sem(); |
854 | mutex_lock(&(par->open_lock)); | 854 | mutex_lock(&(par->open_lock)); |
diff --git a/drivers/watchdog/ar7_wdt.c b/drivers/watchdog/ar7_wdt.c index 2eb48c0df32c..ef7b0d67095e 100644 --- a/drivers/watchdog/ar7_wdt.c +++ b/drivers/watchdog/ar7_wdt.c | |||
@@ -69,7 +69,8 @@ struct ar7_wdt { | |||
69 | u32 prescale; | 69 | u32 prescale; |
70 | }; | 70 | }; |
71 | 71 | ||
72 | static struct semaphore open_semaphore; | 72 | static unsigned long wdt_is_open; |
73 | static spinlock_t wdt_lock; | ||
73 | static unsigned expect_close; | 74 | static unsigned expect_close; |
74 | 75 | ||
75 | /* XXX currently fixed, allows max margin ~68.72 secs */ | 76 | /* XXX currently fixed, allows max margin ~68.72 secs */ |
@@ -154,8 +155,10 @@ static void ar7_wdt_update_margin(int new_margin) | |||
154 | u32 change; | 155 | u32 change; |
155 | 156 | ||
156 | change = new_margin * (ar7_vbus_freq() / prescale_value); | 157 | change = new_margin * (ar7_vbus_freq() / prescale_value); |
157 | if (change < 1) change = 1; | 158 | if (change < 1) |
158 | if (change > 0xffff) change = 0xffff; | 159 | change = 1; |
160 | if (change > 0xffff) | ||
161 | change = 0xffff; | ||
159 | ar7_wdt_change(change); | 162 | ar7_wdt_change(change); |
160 | margin = change * prescale_value / ar7_vbus_freq(); | 163 | margin = change * prescale_value / ar7_vbus_freq(); |
161 | printk(KERN_INFO DRVNAME | 164 | printk(KERN_INFO DRVNAME |
@@ -179,7 +182,7 @@ static void ar7_wdt_disable_wdt(void) | |||
179 | static int ar7_wdt_open(struct inode *inode, struct file *file) | 182 | static int ar7_wdt_open(struct inode *inode, struct file *file) |
180 | { | 183 | { |
181 | /* only allow one at a time */ | 184 | /* only allow one at a time */ |
182 | if (down_trylock(&open_semaphore)) | 185 | if (test_and_set_bit(0, &wdt_is_open)) |
183 | return -EBUSY; | 186 | return -EBUSY; |
184 | ar7_wdt_enable_wdt(); | 187 | ar7_wdt_enable_wdt(); |
185 | expect_close = 0; | 188 | expect_close = 0; |
@@ -195,9 +198,7 @@ static int ar7_wdt_release(struct inode *inode, struct file *file) | |||
195 | "will not disable the watchdog timer\n"); | 198 | "will not disable the watchdog timer\n"); |
196 | else if (!nowayout) | 199 | else if (!nowayout) |
197 | ar7_wdt_disable_wdt(); | 200 | ar7_wdt_disable_wdt(); |
198 | 201 | clear_bit(0, &wdt_is_open); | |
199 | up(&open_semaphore); | ||
200 | |||
201 | return 0; | 202 | return 0; |
202 | } | 203 | } |
203 | 204 | ||
@@ -222,7 +223,9 @@ static ssize_t ar7_wdt_write(struct file *file, const char *data, | |||
222 | if (len) { | 223 | if (len) { |
223 | size_t i; | 224 | size_t i; |
224 | 225 | ||
226 | spin_lock(&wdt_lock); | ||
225 | ar7_wdt_kick(1); | 227 | ar7_wdt_kick(1); |
228 | spin_unlock(&wdt_lock); | ||
226 | 229 | ||
227 | expect_close = 0; | 230 | expect_close = 0; |
228 | for (i = 0; i < len; ++i) { | 231 | for (i = 0; i < len; ++i) { |
@@ -237,8 +240,8 @@ static ssize_t ar7_wdt_write(struct file *file, const char *data, | |||
237 | return len; | 240 | return len; |
238 | } | 241 | } |
239 | 242 | ||
240 | static int ar7_wdt_ioctl(struct inode *inode, struct file *file, | 243 | static long ar7_wdt_ioctl(struct file *file, |
241 | unsigned int cmd, unsigned long arg) | 244 | unsigned int cmd, unsigned long arg) |
242 | { | 245 | { |
243 | static struct watchdog_info ident = { | 246 | static struct watchdog_info ident = { |
244 | .identity = LONGNAME, | 247 | .identity = LONGNAME, |
@@ -269,8 +272,10 @@ static int ar7_wdt_ioctl(struct inode *inode, struct file *file, | |||
269 | if (new_margin < 1) | 272 | if (new_margin < 1) |
270 | return -EINVAL; | 273 | return -EINVAL; |
271 | 274 | ||
275 | spin_lock(&wdt_lock); | ||
272 | ar7_wdt_update_margin(new_margin); | 276 | ar7_wdt_update_margin(new_margin); |
273 | ar7_wdt_kick(1); | 277 | ar7_wdt_kick(1); |
278 | spin_unlock(&wdt_lock); | ||
274 | 279 | ||
275 | case WDIOC_GETTIMEOUT: | 280 | case WDIOC_GETTIMEOUT: |
276 | if (put_user(margin, (int *)arg)) | 281 | if (put_user(margin, (int *)arg)) |
@@ -282,7 +287,7 @@ static int ar7_wdt_ioctl(struct inode *inode, struct file *file, | |||
282 | static const struct file_operations ar7_wdt_fops = { | 287 | static const struct file_operations ar7_wdt_fops = { |
283 | .owner = THIS_MODULE, | 288 | .owner = THIS_MODULE, |
284 | .write = ar7_wdt_write, | 289 | .write = ar7_wdt_write, |
285 | .ioctl = ar7_wdt_ioctl, | 290 | .unlocked_ioctl = ar7_wdt_ioctl, |
286 | .open = ar7_wdt_open, | 291 | .open = ar7_wdt_open, |
287 | .release = ar7_wdt_release, | 292 | .release = ar7_wdt_release, |
288 | }; | 293 | }; |
@@ -297,6 +302,8 @@ static int __init ar7_wdt_init(void) | |||
297 | { | 302 | { |
298 | int rc; | 303 | int rc; |
299 | 304 | ||
305 | spin_lock_init(&wdt_lock); | ||
306 | |||
300 | ar7_wdt_get_regs(); | 307 | ar7_wdt_get_regs(); |
301 | 308 | ||
302 | if (!request_mem_region(ar7_regs_wdt, sizeof(struct ar7_wdt), | 309 | if (!request_mem_region(ar7_regs_wdt, sizeof(struct ar7_wdt), |
@@ -312,8 +319,6 @@ static int __init ar7_wdt_init(void) | |||
312 | ar7_wdt_prescale(prescale_value); | 319 | ar7_wdt_prescale(prescale_value); |
313 | ar7_wdt_update_margin(margin); | 320 | ar7_wdt_update_margin(margin); |
314 | 321 | ||
315 | sema_init(&open_semaphore, 1); | ||
316 | |||
317 | rc = register_reboot_notifier(&ar7_wdt_notifier); | 322 | rc = register_reboot_notifier(&ar7_wdt_notifier); |
318 | if (rc) { | 323 | if (rc) { |
319 | printk(KERN_ERR DRVNAME | 324 | printk(KERN_ERR DRVNAME |
diff --git a/drivers/watchdog/it8712f_wdt.c b/drivers/watchdog/it8712f_wdt.c index 445b7e812112..51bfd5721833 100644 --- a/drivers/watchdog/it8712f_wdt.c +++ b/drivers/watchdog/it8712f_wdt.c | |||
@@ -30,9 +30,8 @@ | |||
30 | #include <linux/fs.h> | 30 | #include <linux/fs.h> |
31 | #include <linux/pci.h> | 31 | #include <linux/pci.h> |
32 | #include <linux/spinlock.h> | 32 | #include <linux/spinlock.h> |
33 | 33 | #include <linux/uaccess.h> | |
34 | #include <asm/uaccess.h> | 34 | #include <linux/io.h> |
35 | #include <asm/io.h> | ||
36 | 35 | ||
37 | #define NAME "it8712f_wdt" | 36 | #define NAME "it8712f_wdt" |
38 | 37 | ||
@@ -50,7 +49,7 @@ static int nowayout = WATCHDOG_NOWAYOUT; | |||
50 | module_param(nowayout, int, 0); | 49 | module_param(nowayout, int, 0); |
51 | MODULE_PARM_DESC(nowayout, "Disable watchdog shutdown on close"); | 50 | MODULE_PARM_DESC(nowayout, "Disable watchdog shutdown on close"); |
52 | 51 | ||
53 | static struct semaphore it8712f_wdt_sem; | 52 | static unsigned long wdt_open; |
54 | static unsigned expect_close; | 53 | static unsigned expect_close; |
55 | static spinlock_t io_lock; | 54 | static spinlock_t io_lock; |
56 | static unsigned char revision; | 55 | static unsigned char revision; |
@@ -86,22 +85,19 @@ static unsigned short address; | |||
86 | #define WDT_OUT_PWROK 0x10 | 85 | #define WDT_OUT_PWROK 0x10 |
87 | #define WDT_OUT_KRST 0x40 | 86 | #define WDT_OUT_KRST 0x40 |
88 | 87 | ||
89 | static int | 88 | static int superio_inb(int reg) |
90 | superio_inb(int reg) | ||
91 | { | 89 | { |
92 | outb(reg, REG); | 90 | outb(reg, REG); |
93 | return inb(VAL); | 91 | return inb(VAL); |
94 | } | 92 | } |
95 | 93 | ||
96 | static void | 94 | static void superio_outb(int val, int reg) |
97 | superio_outb(int val, int reg) | ||
98 | { | 95 | { |
99 | outb(reg, REG); | 96 | outb(reg, REG); |
100 | outb(val, VAL); | 97 | outb(val, VAL); |
101 | } | 98 | } |
102 | 99 | ||
103 | static int | 100 | static int superio_inw(int reg) |
104 | superio_inw(int reg) | ||
105 | { | 101 | { |
106 | int val; | 102 | int val; |
107 | outb(reg++, REG); | 103 | outb(reg++, REG); |
@@ -111,15 +107,13 @@ superio_inw(int reg) | |||
111 | return val; | 107 | return val; |
112 | } | 108 | } |
113 | 109 | ||
114 | static inline void | 110 | static inline void superio_select(int ldn) |
115 | superio_select(int ldn) | ||
116 | { | 111 | { |
117 | outb(LDN, REG); | 112 | outb(LDN, REG); |
118 | outb(ldn, VAL); | 113 | outb(ldn, VAL); |
119 | } | 114 | } |
120 | 115 | ||
121 | static inline void | 116 | static inline void superio_enter(void) |
122 | superio_enter(void) | ||
123 | { | 117 | { |
124 | spin_lock(&io_lock); | 118 | spin_lock(&io_lock); |
125 | outb(0x87, REG); | 119 | outb(0x87, REG); |
@@ -128,22 +122,19 @@ superio_enter(void) | |||
128 | outb(0x55, REG); | 122 | outb(0x55, REG); |
129 | } | 123 | } |
130 | 124 | ||
131 | static inline void | 125 | static inline void superio_exit(void) |
132 | superio_exit(void) | ||
133 | { | 126 | { |
134 | outb(0x02, REG); | 127 | outb(0x02, REG); |
135 | outb(0x02, VAL); | 128 | outb(0x02, VAL); |
136 | spin_unlock(&io_lock); | 129 | spin_unlock(&io_lock); |
137 | } | 130 | } |
138 | 131 | ||
139 | static inline void | 132 | static inline void it8712f_wdt_ping(void) |
140 | it8712f_wdt_ping(void) | ||
141 | { | 133 | { |
142 | inb(address); | 134 | inb(address); |
143 | } | 135 | } |
144 | 136 | ||
145 | static void | 137 | static void it8712f_wdt_update_margin(void) |
146 | it8712f_wdt_update_margin(void) | ||
147 | { | 138 | { |
148 | int config = WDT_OUT_KRST | WDT_OUT_PWROK; | 139 | int config = WDT_OUT_KRST | WDT_OUT_PWROK; |
149 | int units = margin; | 140 | int units = margin; |
@@ -165,8 +156,7 @@ it8712f_wdt_update_margin(void) | |||
165 | superio_outb(units, WDT_TIMEOUT); | 156 | superio_outb(units, WDT_TIMEOUT); |
166 | } | 157 | } |
167 | 158 | ||
168 | static int | 159 | static int it8712f_wdt_get_status(void) |
169 | it8712f_wdt_get_status(void) | ||
170 | { | 160 | { |
171 | if (superio_inb(WDT_CONTROL) & 0x01) | 161 | if (superio_inb(WDT_CONTROL) & 0x01) |
172 | return WDIOF_CARDRESET; | 162 | return WDIOF_CARDRESET; |
@@ -174,8 +164,7 @@ it8712f_wdt_get_status(void) | |||
174 | return 0; | 164 | return 0; |
175 | } | 165 | } |
176 | 166 | ||
177 | static void | 167 | static void it8712f_wdt_enable(void) |
178 | it8712f_wdt_enable(void) | ||
179 | { | 168 | { |
180 | printk(KERN_DEBUG NAME ": enabling watchdog timer\n"); | 169 | printk(KERN_DEBUG NAME ": enabling watchdog timer\n"); |
181 | superio_enter(); | 170 | superio_enter(); |
@@ -190,8 +179,7 @@ it8712f_wdt_enable(void) | |||
190 | it8712f_wdt_ping(); | 179 | it8712f_wdt_ping(); |
191 | } | 180 | } |
192 | 181 | ||
193 | static void | 182 | static void it8712f_wdt_disable(void) |
194 | it8712f_wdt_disable(void) | ||
195 | { | 183 | { |
196 | printk(KERN_DEBUG NAME ": disabling watchdog timer\n"); | 184 | printk(KERN_DEBUG NAME ": disabling watchdog timer\n"); |
197 | 185 | ||
@@ -207,8 +195,7 @@ it8712f_wdt_disable(void) | |||
207 | superio_exit(); | 195 | superio_exit(); |
208 | } | 196 | } |
209 | 197 | ||
210 | static int | 198 | static int it8712f_wdt_notify(struct notifier_block *this, |
211 | it8712f_wdt_notify(struct notifier_block *this, | ||
212 | unsigned long code, void *unused) | 199 | unsigned long code, void *unused) |
213 | { | 200 | { |
214 | if (code == SYS_HALT || code == SYS_POWER_OFF) | 201 | if (code == SYS_HALT || code == SYS_POWER_OFF) |
@@ -222,9 +209,8 @@ static struct notifier_block it8712f_wdt_notifier = { | |||
222 | .notifier_call = it8712f_wdt_notify, | 209 | .notifier_call = it8712f_wdt_notify, |
223 | }; | 210 | }; |
224 | 211 | ||
225 | static ssize_t | 212 | static ssize_t it8712f_wdt_write(struct file *file, const char __user *data, |
226 | it8712f_wdt_write(struct file *file, const char __user *data, | 213 | size_t len, loff_t *ppos) |
227 | size_t len, loff_t *ppos) | ||
228 | { | 214 | { |
229 | /* check for a magic close character */ | 215 | /* check for a magic close character */ |
230 | if (len) { | 216 | if (len) { |
@@ -245,9 +231,8 @@ it8712f_wdt_write(struct file *file, const char __user *data, | |||
245 | return len; | 231 | return len; |
246 | } | 232 | } |
247 | 233 | ||
248 | static int | 234 | static long it8712f_wdt_ioctl(struct file *file, unsigned int cmd, |
249 | it8712f_wdt_ioctl(struct inode *inode, struct file *file, | 235 | unsigned long arg) |
250 | unsigned int cmd, unsigned long arg) | ||
251 | { | 236 | { |
252 | void __user *argp = (void __user *)arg; | 237 | void __user *argp = (void __user *)arg; |
253 | int __user *p = argp; | 238 | int __user *p = argp; |
@@ -302,19 +287,16 @@ it8712f_wdt_ioctl(struct inode *inode, struct file *file, | |||
302 | } | 287 | } |
303 | } | 288 | } |
304 | 289 | ||
305 | static int | 290 | static int it8712f_wdt_open(struct inode *inode, struct file *file) |
306 | it8712f_wdt_open(struct inode *inode, struct file *file) | ||
307 | { | 291 | { |
308 | /* only allow one at a time */ | 292 | /* only allow one at a time */ |
309 | if (down_trylock(&it8712f_wdt_sem)) | 293 | if (test_and_set_bit(0, &wdt_open)) |
310 | return -EBUSY; | 294 | return -EBUSY; |
311 | it8712f_wdt_enable(); | 295 | it8712f_wdt_enable(); |
312 | |||
313 | return nonseekable_open(inode, file); | 296 | return nonseekable_open(inode, file); |
314 | } | 297 | } |
315 | 298 | ||
316 | static int | 299 | static int it8712f_wdt_release(struct inode *inode, struct file *file) |
317 | it8712f_wdt_release(struct inode *inode, struct file *file) | ||
318 | { | 300 | { |
319 | if (expect_close != 42) { | 301 | if (expect_close != 42) { |
320 | printk(KERN_WARNING NAME | 302 | printk(KERN_WARNING NAME |
@@ -324,7 +306,7 @@ it8712f_wdt_release(struct inode *inode, struct file *file) | |||
324 | it8712f_wdt_disable(); | 306 | it8712f_wdt_disable(); |
325 | } | 307 | } |
326 | expect_close = 0; | 308 | expect_close = 0; |
327 | up(&it8712f_wdt_sem); | 309 | clear_bit(0, &wdt_open); |
328 | 310 | ||
329 | return 0; | 311 | return 0; |
330 | } | 312 | } |
@@ -333,7 +315,7 @@ static const struct file_operations it8712f_wdt_fops = { | |||
333 | .owner = THIS_MODULE, | 315 | .owner = THIS_MODULE, |
334 | .llseek = no_llseek, | 316 | .llseek = no_llseek, |
335 | .write = it8712f_wdt_write, | 317 | .write = it8712f_wdt_write, |
336 | .ioctl = it8712f_wdt_ioctl, | 318 | .unlocked_ioctl = it8712f_wdt_ioctl, |
337 | .open = it8712f_wdt_open, | 319 | .open = it8712f_wdt_open, |
338 | .release = it8712f_wdt_release, | 320 | .release = it8712f_wdt_release, |
339 | }; | 321 | }; |
@@ -344,8 +326,7 @@ static struct miscdevice it8712f_wdt_miscdev = { | |||
344 | .fops = &it8712f_wdt_fops, | 326 | .fops = &it8712f_wdt_fops, |
345 | }; | 327 | }; |
346 | 328 | ||
347 | static int __init | 329 | static int __init it8712f_wdt_find(unsigned short *address) |
348 | it8712f_wdt_find(unsigned short *address) | ||
349 | { | 330 | { |
350 | int err = -ENODEV; | 331 | int err = -ENODEV; |
351 | int chip_type; | 332 | int chip_type; |
@@ -387,8 +368,7 @@ exit: | |||
387 | return err; | 368 | return err; |
388 | } | 369 | } |
389 | 370 | ||
390 | static int __init | 371 | static int __init it8712f_wdt_init(void) |
391 | it8712f_wdt_init(void) | ||
392 | { | 372 | { |
393 | int err = 0; | 373 | int err = 0; |
394 | 374 | ||
@@ -404,8 +384,6 @@ it8712f_wdt_init(void) | |||
404 | 384 | ||
405 | it8712f_wdt_disable(); | 385 | it8712f_wdt_disable(); |
406 | 386 | ||
407 | sema_init(&it8712f_wdt_sem, 1); | ||
408 | |||
409 | err = register_reboot_notifier(&it8712f_wdt_notifier); | 387 | err = register_reboot_notifier(&it8712f_wdt_notifier); |
410 | if (err) { | 388 | if (err) { |
411 | printk(KERN_ERR NAME ": unable to register reboot notifier\n"); | 389 | printk(KERN_ERR NAME ": unable to register reboot notifier\n"); |
@@ -430,8 +408,7 @@ out: | |||
430 | return err; | 408 | return err; |
431 | } | 409 | } |
432 | 410 | ||
433 | static void __exit | 411 | static void __exit it8712f_wdt_exit(void) |
434 | it8712f_wdt_exit(void) | ||
435 | { | 412 | { |
436 | misc_deregister(&it8712f_wdt_miscdev); | 413 | misc_deregister(&it8712f_wdt_miscdev); |
437 | unregister_reboot_notifier(&it8712f_wdt_notifier); | 414 | unregister_reboot_notifier(&it8712f_wdt_notifier); |
diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c index 98532c0e0689..97b4a2e8eb09 100644 --- a/drivers/watchdog/s3c2410_wdt.c +++ b/drivers/watchdog/s3c2410_wdt.c | |||
@@ -46,9 +46,8 @@ | |||
46 | #include <linux/platform_device.h> | 46 | #include <linux/platform_device.h> |
47 | #include <linux/interrupt.h> | 47 | #include <linux/interrupt.h> |
48 | #include <linux/clk.h> | 48 | #include <linux/clk.h> |
49 | 49 | #include <linux/uaccess.h> | |
50 | #include <asm/uaccess.h> | 50 | #include <linux/io.h> |
51 | #include <asm/io.h> | ||
52 | 51 | ||
53 | #include <asm/arch/map.h> | 52 | #include <asm/arch/map.h> |
54 | 53 | ||
@@ -65,8 +64,8 @@ | |||
65 | static int nowayout = WATCHDOG_NOWAYOUT; | 64 | static int nowayout = WATCHDOG_NOWAYOUT; |
66 | static int tmr_margin = CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME; | 65 | static int tmr_margin = CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME; |
67 | static int tmr_atboot = CONFIG_S3C2410_WATCHDOG_ATBOOT; | 66 | static int tmr_atboot = CONFIG_S3C2410_WATCHDOG_ATBOOT; |
68 | static int soft_noboot = 0; | 67 | static int soft_noboot; |
69 | static int debug = 0; | 68 | static int debug; |
70 | 69 | ||
71 | module_param(tmr_margin, int, 0); | 70 | module_param(tmr_margin, int, 0); |
72 | module_param(tmr_atboot, int, 0); | 71 | module_param(tmr_atboot, int, 0); |
@@ -74,24 +73,23 @@ module_param(nowayout, int, 0); | |||
74 | module_param(soft_noboot, int, 0); | 73 | module_param(soft_noboot, int, 0); |
75 | module_param(debug, int, 0); | 74 | module_param(debug, int, 0); |
76 | 75 | ||
77 | MODULE_PARM_DESC(tmr_margin, "Watchdog tmr_margin in seconds. default=" __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME) ")"); | 76 | MODULE_PARM_DESC(tmr_margin, "Watchdog tmr_margin in seconds. default=" |
78 | 77 | __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME) ")"); | |
79 | MODULE_PARM_DESC(tmr_atboot, "Watchdog is started at boot time if set to 1, default=" __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_ATBOOT)); | 78 | MODULE_PARM_DESC(tmr_atboot, |
80 | 79 | "Watchdog is started at boot time if set to 1, default=" | |
81 | MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); | 80 | __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_ATBOOT)); |
82 | 81 | MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" | |
82 | __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); | ||
83 | MODULE_PARM_DESC(soft_noboot, "Watchdog action, set to 1 to ignore reboots, 0 to reboot (default depends on ONLY_TESTING)"); | 83 | MODULE_PARM_DESC(soft_noboot, "Watchdog action, set to 1 to ignore reboots, 0 to reboot (default depends on ONLY_TESTING)"); |
84 | |||
85 | MODULE_PARM_DESC(debug, "Watchdog debug, set to >1 for debug, (default 0)"); | 84 | MODULE_PARM_DESC(debug, "Watchdog debug, set to >1 for debug, (default 0)"); |
86 | 85 | ||
87 | 86 | ||
88 | typedef enum close_state { | 87 | typedef enum close_state { |
89 | CLOSE_STATE_NOT, | 88 | CLOSE_STATE_NOT, |
90 | CLOSE_STATE_ALLOW=0x4021 | 89 | CLOSE_STATE_ALLOW = 0x4021 |
91 | } close_state_t; | 90 | } close_state_t; |
92 | 91 | ||
93 | static DECLARE_MUTEX(open_lock); | 92 | static unsigned long open_lock; |
94 | |||
95 | static struct device *wdt_dev; /* platform device attached to */ | 93 | static struct device *wdt_dev; /* platform device attached to */ |
96 | static struct resource *wdt_mem; | 94 | static struct resource *wdt_mem; |
97 | static struct resource *wdt_irq; | 95 | static struct resource *wdt_irq; |
@@ -99,38 +97,58 @@ static struct clk *wdt_clock; | |||
99 | static void __iomem *wdt_base; | 97 | static void __iomem *wdt_base; |
100 | static unsigned int wdt_count; | 98 | static unsigned int wdt_count; |
101 | static close_state_t allow_close; | 99 | static close_state_t allow_close; |
100 | static DEFINE_SPINLOCK(wdt_lock); | ||
102 | 101 | ||
103 | /* watchdog control routines */ | 102 | /* watchdog control routines */ |
104 | 103 | ||
105 | #define DBG(msg...) do { \ | 104 | #define DBG(msg...) do { \ |
106 | if (debug) \ | 105 | if (debug) \ |
107 | printk(KERN_INFO msg); \ | 106 | printk(KERN_INFO msg); \ |
108 | } while(0) | 107 | } while (0) |
109 | 108 | ||
110 | /* functions */ | 109 | /* functions */ |
111 | 110 | ||
112 | static int s3c2410wdt_keepalive(void) | 111 | static void s3c2410wdt_keepalive(void) |
113 | { | 112 | { |
113 | spin_lock(&wdt_lock); | ||
114 | writel(wdt_count, wdt_base + S3C2410_WTCNT); | 114 | writel(wdt_count, wdt_base + S3C2410_WTCNT); |
115 | return 0; | 115 | spin_unlock(&wdt_lock); |
116 | } | 116 | } |
117 | 117 | ||
118 | static int s3c2410wdt_stop(void) | 118 | static void __s3c2410wdt_stop(void) |
119 | { | 119 | { |
120 | unsigned long wtcon; | 120 | unsigned long wtcon; |
121 | 121 | ||
122 | spin_lock(&wdt_lock); | ||
122 | wtcon = readl(wdt_base + S3C2410_WTCON); | 123 | wtcon = readl(wdt_base + S3C2410_WTCON); |
123 | wtcon &= ~(S3C2410_WTCON_ENABLE | S3C2410_WTCON_RSTEN); | 124 | wtcon &= ~(S3C2410_WTCON_ENABLE | S3C2410_WTCON_RSTEN); |
124 | writel(wtcon, wdt_base + S3C2410_WTCON); | 125 | writel(wtcon, wdt_base + S3C2410_WTCON); |
126 | spin_unlock(&wdt_lock); | ||
127 | } | ||
125 | 128 | ||
126 | return 0; | 129 | static void __s3c2410wdt_stop(void) |
130 | { | ||
131 | unsigned long wtcon; | ||
132 | |||
133 | wtcon = readl(wdt_base + S3C2410_WTCON); | ||
134 | wtcon &= ~(S3C2410_WTCON_ENABLE | S3C2410_WTCON_RSTEN); | ||
135 | writel(wtcon, wdt_base + S3C2410_WTCON); | ||
136 | } | ||
137 | |||
138 | static void s3c2410wdt_stop(void) | ||
139 | { | ||
140 | spin_lock(&wdt_lock); | ||
141 | __s3c2410wdt_stop(); | ||
142 | spin_unlock(&wdt_lock); | ||
127 | } | 143 | } |
128 | 144 | ||
129 | static int s3c2410wdt_start(void) | 145 | static void s3c2410wdt_start(void) |
130 | { | 146 | { |
131 | unsigned long wtcon; | 147 | unsigned long wtcon; |
132 | 148 | ||
133 | s3c2410wdt_stop(); | 149 | spin_lock(&wdt_lock); |
150 | |||
151 | __s3c2410wdt_stop(); | ||
134 | 152 | ||
135 | wtcon = readl(wdt_base + S3C2410_WTCON); | 153 | wtcon = readl(wdt_base + S3C2410_WTCON); |
136 | wtcon |= S3C2410_WTCON_ENABLE | S3C2410_WTCON_DIV128; | 154 | wtcon |= S3C2410_WTCON_ENABLE | S3C2410_WTCON_DIV128; |
@@ -149,6 +167,7 @@ static int s3c2410wdt_start(void) | |||
149 | writel(wdt_count, wdt_base + S3C2410_WTDAT); | 167 | writel(wdt_count, wdt_base + S3C2410_WTDAT); |
150 | writel(wdt_count, wdt_base + S3C2410_WTCNT); | 168 | writel(wdt_count, wdt_base + S3C2410_WTCNT); |
151 | writel(wtcon, wdt_base + S3C2410_WTCON); | 169 | writel(wtcon, wdt_base + S3C2410_WTCON); |
170 | spin_unlock(&wdt_lock); | ||
152 | 171 | ||
153 | return 0; | 172 | return 0; |
154 | } | 173 | } |
@@ -211,7 +230,7 @@ static int s3c2410wdt_set_heartbeat(int timeout) | |||
211 | 230 | ||
212 | static int s3c2410wdt_open(struct inode *inode, struct file *file) | 231 | static int s3c2410wdt_open(struct inode *inode, struct file *file) |
213 | { | 232 | { |
214 | if(down_trylock(&open_lock)) | 233 | if (test_and_set_bit(0, &open_lock)) |
215 | return -EBUSY; | 234 | return -EBUSY; |
216 | 235 | ||
217 | if (nowayout) | 236 | if (nowayout) |
@@ -231,15 +250,14 @@ static int s3c2410wdt_release(struct inode *inode, struct file *file) | |||
231 | * Lock it in if it's a module and we set nowayout | 250 | * Lock it in if it's a module and we set nowayout |
232 | */ | 251 | */ |
233 | 252 | ||
234 | if (allow_close == CLOSE_STATE_ALLOW) { | 253 | if (allow_close == CLOSE_STATE_ALLOW) |
235 | s3c2410wdt_stop(); | 254 | s3c2410wdt_stop(); |
236 | } else { | 255 | else { |
237 | dev_err(wdt_dev, "Unexpected close, not stopping watchdog\n"); | 256 | dev_err(wdt_dev, "Unexpected close, not stopping watchdog\n"); |
238 | s3c2410wdt_keepalive(); | 257 | s3c2410wdt_keepalive(); |
239 | } | 258 | } |
240 | |||
241 | allow_close = CLOSE_STATE_NOT; | 259 | allow_close = CLOSE_STATE_NOT; |
242 | up(&open_lock); | 260 | clear_bit(0, &open_lock); |
243 | return 0; | 261 | return 0; |
244 | } | 262 | } |
245 | 263 | ||
@@ -249,7 +267,7 @@ static ssize_t s3c2410wdt_write(struct file *file, const char __user *data, | |||
249 | /* | 267 | /* |
250 | * Refresh the timer. | 268 | * Refresh the timer. |
251 | */ | 269 | */ |
252 | if(len) { | 270 | if (len) { |
253 | if (!nowayout) { | 271 | if (!nowayout) { |
254 | size_t i; | 272 | size_t i; |
255 | 273 | ||
@@ -265,7 +283,6 @@ static ssize_t s3c2410wdt_write(struct file *file, const char __user *data, | |||
265 | allow_close = CLOSE_STATE_ALLOW; | 283 | allow_close = CLOSE_STATE_ALLOW; |
266 | } | 284 | } |
267 | } | 285 | } |
268 | |||
269 | s3c2410wdt_keepalive(); | 286 | s3c2410wdt_keepalive(); |
270 | } | 287 | } |
271 | return len; | 288 | return len; |
@@ -273,48 +290,41 @@ static ssize_t s3c2410wdt_write(struct file *file, const char __user *data, | |||
273 | 290 | ||
274 | #define OPTIONS WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE | 291 | #define OPTIONS WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE |
275 | 292 | ||
276 | static struct watchdog_info s3c2410_wdt_ident = { | 293 | static const struct watchdog_info s3c2410_wdt_ident = { |
277 | .options = OPTIONS, | 294 | .options = OPTIONS, |
278 | .firmware_version = 0, | 295 | .firmware_version = 0, |
279 | .identity = "S3C2410 Watchdog", | 296 | .identity = "S3C2410 Watchdog", |
280 | }; | 297 | }; |
281 | 298 | ||
282 | 299 | ||
283 | static int s3c2410wdt_ioctl(struct inode *inode, struct file *file, | 300 | static long s3c2410wdt_ioctl(struct file *file, unsigned int cmd, |
284 | unsigned int cmd, unsigned long arg) | 301 | unsigned long arg) |
285 | { | 302 | { |
286 | void __user *argp = (void __user *)arg; | 303 | void __user *argp = (void __user *)arg; |
287 | int __user *p = argp; | 304 | int __user *p = argp; |
288 | int new_margin; | 305 | int new_margin; |
289 | 306 | ||
290 | switch (cmd) { | 307 | switch (cmd) { |
291 | default: | 308 | default: |
292 | return -ENOTTY; | 309 | return -ENOTTY; |
293 | 310 | case WDIOC_GETSUPPORT: | |
294 | case WDIOC_GETSUPPORT: | 311 | return copy_to_user(argp, &s3c2410_wdt_ident, |
295 | return copy_to_user(argp, &s3c2410_wdt_ident, | 312 | sizeof(s3c2410_wdt_ident)) ? -EFAULT : 0; |
296 | sizeof(s3c2410_wdt_ident)) ? -EFAULT : 0; | 313 | case WDIOC_GETSTATUS: |
297 | 314 | case WDIOC_GETBOOTSTATUS: | |
298 | case WDIOC_GETSTATUS: | 315 | return put_user(0, p); |
299 | case WDIOC_GETBOOTSTATUS: | 316 | case WDIOC_KEEPALIVE: |
300 | return put_user(0, p); | 317 | s3c2410wdt_keepalive(); |
301 | 318 | return 0; | |
302 | case WDIOC_KEEPALIVE: | 319 | case WDIOC_SETTIMEOUT: |
303 | s3c2410wdt_keepalive(); | 320 | if (get_user(new_margin, p)) |
304 | return 0; | 321 | return -EFAULT; |
305 | 322 | if (s3c2410wdt_set_heartbeat(new_margin)) | |
306 | case WDIOC_SETTIMEOUT: | 323 | return -EINVAL; |
307 | if (get_user(new_margin, p)) | 324 | s3c2410wdt_keepalive(); |
308 | return -EFAULT; | 325 | return put_user(tmr_margin, p); |
309 | 326 | case WDIOC_GETTIMEOUT: | |
310 | if (s3c2410wdt_set_heartbeat(new_margin)) | 327 | return put_user(tmr_margin, p); |
311 | return -EINVAL; | ||
312 | |||
313 | s3c2410wdt_keepalive(); | ||
314 | return put_user(tmr_margin, p); | ||
315 | |||
316 | case WDIOC_GETTIMEOUT: | ||
317 | return put_user(tmr_margin, p); | ||
318 | } | 328 | } |
319 | } | 329 | } |
320 | 330 | ||
@@ -324,7 +334,7 @@ static const struct file_operations s3c2410wdt_fops = { | |||
324 | .owner = THIS_MODULE, | 334 | .owner = THIS_MODULE, |
325 | .llseek = no_llseek, | 335 | .llseek = no_llseek, |
326 | .write = s3c2410wdt_write, | 336 | .write = s3c2410wdt_write, |
327 | .ioctl = s3c2410wdt_ioctl, | 337 | .unlocked_ioctl = s3c2410wdt_ioctl, |
328 | .open = s3c2410wdt_open, | 338 | .open = s3c2410wdt_open, |
329 | .release = s3c2410wdt_release, | 339 | .release = s3c2410wdt_release, |
330 | }; | 340 | }; |
@@ -411,14 +421,15 @@ static int s3c2410wdt_probe(struct platform_device *pdev) | |||
411 | * not, try the default value */ | 421 | * not, try the default value */ |
412 | 422 | ||
413 | if (s3c2410wdt_set_heartbeat(tmr_margin)) { | 423 | if (s3c2410wdt_set_heartbeat(tmr_margin)) { |
414 | started = s3c2410wdt_set_heartbeat(CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME); | 424 | started = s3c2410wdt_set_heartbeat( |
425 | CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME); | ||
415 | 426 | ||
416 | if (started == 0) { | 427 | if (started == 0) |
417 | dev_info(dev,"tmr_margin value out of range, default %d used\n", | 428 | dev_info(dev, |
429 | "tmr_margin value out of range, default %d used\n", | ||
418 | CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME); | 430 | CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME); |
419 | } else { | 431 | else |
420 | dev_info(dev, "default timer value is out of range, cannot start\n"); | 432 | dev_info(dev, "default timer value is out of range, cannot start\n"); |
421 | } | ||
422 | } | 433 | } |
423 | 434 | ||
424 | ret = misc_register(&s3c2410wdt_miscdev); | 435 | ret = misc_register(&s3c2410wdt_miscdev); |
@@ -447,7 +458,7 @@ static int s3c2410wdt_probe(struct platform_device *pdev) | |||
447 | (wtcon & S3C2410_WTCON_ENABLE) ? "" : "in", | 458 | (wtcon & S3C2410_WTCON_ENABLE) ? "" : "in", |
448 | (wtcon & S3C2410_WTCON_RSTEN) ? "" : "dis", | 459 | (wtcon & S3C2410_WTCON_RSTEN) ? "" : "dis", |
449 | (wtcon & S3C2410_WTCON_INTEN) ? "" : "en"); | 460 | (wtcon & S3C2410_WTCON_INTEN) ? "" : "en"); |
450 | 461 | ||
451 | return 0; | 462 | return 0; |
452 | 463 | ||
453 | err_clk: | 464 | err_clk: |
@@ -487,7 +498,7 @@ static int s3c2410wdt_remove(struct platform_device *dev) | |||
487 | 498 | ||
488 | static void s3c2410wdt_shutdown(struct platform_device *dev) | 499 | static void s3c2410wdt_shutdown(struct platform_device *dev) |
489 | { | 500 | { |
490 | s3c2410wdt_stop(); | 501 | s3c2410wdt_stop(); |
491 | } | 502 | } |
492 | 503 | ||
493 | #ifdef CONFIG_PM | 504 | #ifdef CONFIG_PM |
@@ -540,7 +551,8 @@ static struct platform_driver s3c2410wdt_driver = { | |||
540 | }; | 551 | }; |
541 | 552 | ||
542 | 553 | ||
543 | static char banner[] __initdata = KERN_INFO "S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics\n"; | 554 | static char banner[] __initdata = |
555 | KERN_INFO "S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics\n"; | ||
544 | 556 | ||
545 | static int __init watchdog_init(void) | 557 | static int __init watchdog_init(void) |
546 | { | 558 | { |
diff --git a/drivers/watchdog/sc1200wdt.c b/drivers/watchdog/sc1200wdt.c index 35cddff7020f..621ebad56d86 100644 --- a/drivers/watchdog/sc1200wdt.c +++ b/drivers/watchdog/sc1200wdt.c | |||
@@ -15,14 +15,18 @@ | |||
15 | * | 15 | * |
16 | * Changelog: | 16 | * Changelog: |
17 | * 20020220 Zwane Mwaikambo Code based on datasheet, no hardware. | 17 | * 20020220 Zwane Mwaikambo Code based on datasheet, no hardware. |
18 | * 20020221 Zwane Mwaikambo Cleanups as suggested by Jeff Garzik and Alan Cox. | 18 | * 20020221 Zwane Mwaikambo Cleanups as suggested by Jeff Garzik |
19 | * and Alan Cox. | ||
19 | * 20020222 Zwane Mwaikambo Added probing. | 20 | * 20020222 Zwane Mwaikambo Added probing. |
20 | * 20020225 Zwane Mwaikambo Added ISAPNP support. | 21 | * 20020225 Zwane Mwaikambo Added ISAPNP support. |
21 | * 20020412 Rob Radez Broke out start/stop functions | 22 | * 20020412 Rob Radez Broke out start/stop functions |
22 | * <rob@osinvestor.com> Return proper status instead of temperature warning | 23 | * <rob@osinvestor.com> Return proper status instead of |
23 | * Add WDIOC_GETBOOTSTATUS and WDIOC_SETOPTIONS ioctls | 24 | * temperature warning |
25 | * Add WDIOC_GETBOOTSTATUS and | ||
26 | * WDIOC_SETOPTIONS ioctls | ||
24 | * Fix CONFIG_WATCHDOG_NOWAYOUT | 27 | * Fix CONFIG_WATCHDOG_NOWAYOUT |
25 | * 20020530 Joel Becker Add Matt Domsch's nowayout module option | 28 | * 20020530 Joel Becker Add Matt Domsch's nowayout module |
29 | * option | ||
26 | * 20030116 Adam Belay Updated to the latest pnp code | 30 | * 20030116 Adam Belay Updated to the latest pnp code |
27 | * | 31 | * |
28 | */ | 32 | */ |
@@ -39,9 +43,8 @@ | |||
39 | #include <linux/pnp.h> | 43 | #include <linux/pnp.h> |
40 | #include <linux/fs.h> | 44 | #include <linux/fs.h> |
41 | #include <linux/semaphore.h> | 45 | #include <linux/semaphore.h> |
42 | 46 | #include <linux/io.h> | |
43 | #include <asm/io.h> | 47 | #include <linux/uaccess.h> |
44 | #include <asm/uaccess.h> | ||
45 | 48 | ||
46 | #define SC1200_MODULE_VER "build 20020303" | 49 | #define SC1200_MODULE_VER "build 20020303" |
47 | #define SC1200_MODULE_NAME "sc1200wdt" | 50 | #define SC1200_MODULE_NAME "sc1200wdt" |
@@ -72,7 +75,7 @@ static char banner[] __initdata = KERN_INFO PFX SC1200_MODULE_VER; | |||
72 | static int timeout = 1; | 75 | static int timeout = 1; |
73 | static int io = -1; | 76 | static int io = -1; |
74 | static int io_len = 2; /* for non plug and play */ | 77 | static int io_len = 2; /* for non plug and play */ |
75 | static struct semaphore open_sem; | 78 | static unsigned long open_flag; |
76 | static char expect_close; | 79 | static char expect_close; |
77 | static DEFINE_SPINLOCK(sc1200wdt_lock); /* io port access serialisation */ | 80 | static DEFINE_SPINLOCK(sc1200wdt_lock); /* io port access serialisation */ |
78 | 81 | ||
@@ -81,7 +84,8 @@ static int isapnp = 1; | |||
81 | static struct pnp_dev *wdt_dev; | 84 | static struct pnp_dev *wdt_dev; |
82 | 85 | ||
83 | module_param(isapnp, int, 0); | 86 | module_param(isapnp, int, 0); |
84 | MODULE_PARM_DESC(isapnp, "When set to 0 driver ISA PnP support will be disabled"); | 87 | MODULE_PARM_DESC(isapnp, |
88 | "When set to 0 driver ISA PnP support will be disabled"); | ||
85 | #endif | 89 | #endif |
86 | 90 | ||
87 | module_param(io, int, 0); | 91 | module_param(io, int, 0); |
@@ -91,26 +95,40 @@ MODULE_PARM_DESC(timeout, "range is 0-255 minutes, default is 1"); | |||
91 | 95 | ||
92 | static int nowayout = WATCHDOG_NOWAYOUT; | 96 | static int nowayout = WATCHDOG_NOWAYOUT; |
93 | module_param(nowayout, int, 0); | 97 | module_param(nowayout, int, 0); |
94 | MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); | 98 | MODULE_PARM_DESC(nowayout, |
99 | "Watchdog cannot be stopped once started (default=" | ||
100 | __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); | ||
95 | 101 | ||
96 | 102 | ||
97 | 103 | ||
98 | /* Read from Data Register */ | 104 | /* Read from Data Register */ |
99 | static inline void sc1200wdt_read_data(unsigned char index, unsigned char *data) | 105 | static inline void __sc1200wdt_read_data(unsigned char index, |
106 | unsigned char *data) | ||
100 | { | 107 | { |
101 | spin_lock(&sc1200wdt_lock); | ||
102 | outb_p(index, PMIR); | 108 | outb_p(index, PMIR); |
103 | *data = inb(PMDR); | 109 | *data = inb(PMDR); |
104 | spin_unlock(&sc1200wdt_lock); | ||
105 | } | 110 | } |
106 | 111 | ||
112 | static void sc1200wdt_read_data(unsigned char index, unsigned char *data) | ||
113 | { | ||
114 | spin_lock(&sc1200wdt_lock); | ||
115 | __sc1200wdt_read_data(index, data); | ||
116 | spin_unlock(&sc1200wdt_lock); | ||
117 | } | ||
107 | 118 | ||
108 | /* Write to Data Register */ | 119 | /* Write to Data Register */ |
109 | static inline void sc1200wdt_write_data(unsigned char index, unsigned char data) | 120 | static inline void __sc1200wdt_write_data(unsigned char index, |
121 | unsigned char data) | ||
110 | { | 122 | { |
111 | spin_lock(&sc1200wdt_lock); | ||
112 | outb_p(index, PMIR); | 123 | outb_p(index, PMIR); |
113 | outb(data, PMDR); | 124 | outb(data, PMDR); |
125 | } | ||
126 | |||
127 | static inline void sc1200wdt_write_data(unsigned char index, | ||
128 | unsigned char data) | ||
129 | { | ||
130 | spin_lock(&sc1200wdt_lock); | ||
131 | __sc1200wdt_write_data(index, data); | ||
114 | spin_unlock(&sc1200wdt_lock); | 132 | spin_unlock(&sc1200wdt_lock); |
115 | } | 133 | } |
116 | 134 | ||
@@ -118,22 +136,23 @@ static inline void sc1200wdt_write_data(unsigned char index, unsigned char data) | |||
118 | static void sc1200wdt_start(void) | 136 | static void sc1200wdt_start(void) |
119 | { | 137 | { |
120 | unsigned char reg; | 138 | unsigned char reg; |
139 | spin_lock(&sc1200wdt_lock); | ||
121 | 140 | ||
122 | sc1200wdt_read_data(WDCF, ®); | 141 | __sc1200wdt_read_data(WDCF, ®); |
123 | /* assert WDO when any of the following interrupts are triggered too */ | 142 | /* assert WDO when any of the following interrupts are triggered too */ |
124 | reg |= (KBC_IRQ | MSE_IRQ | UART1_IRQ | UART2_IRQ); | 143 | reg |= (KBC_IRQ | MSE_IRQ | UART1_IRQ | UART2_IRQ); |
125 | sc1200wdt_write_data(WDCF, reg); | 144 | __sc1200wdt_write_data(WDCF, reg); |
126 | /* set the timeout and get the ball rolling */ | 145 | /* set the timeout and get the ball rolling */ |
127 | sc1200wdt_write_data(WDTO, timeout); | 146 | __sc1200wdt_write_data(WDTO, timeout); |
128 | } | ||
129 | 147 | ||
148 | spin_unlock(&sc1200wdt_lock); | ||
149 | } | ||
130 | 150 | ||
131 | static void sc1200wdt_stop(void) | 151 | static void sc1200wdt_stop(void) |
132 | { | 152 | { |
133 | sc1200wdt_write_data(WDTO, 0); | 153 | sc1200wdt_write_data(WDTO, 0); |
134 | } | 154 | } |
135 | 155 | ||
136 | |||
137 | /* This returns the status of the WDO signal, inactive high. */ | 156 | /* This returns the status of the WDO signal, inactive high. */ |
138 | static inline int sc1200wdt_status(void) | 157 | static inline int sc1200wdt_status(void) |
139 | { | 158 | { |
@@ -144,14 +163,13 @@ static inline int sc1200wdt_status(void) | |||
144 | * KEEPALIVEPING which is a bit of a kludge because there's nothing | 163 | * KEEPALIVEPING which is a bit of a kludge because there's nothing |
145 | * else for enabled/disabled status | 164 | * else for enabled/disabled status |
146 | */ | 165 | */ |
147 | return (ret & 0x01) ? 0 : WDIOF_KEEPALIVEPING; /* bits 1 - 7 are undefined */ | 166 | return (ret & 0x01) ? 0 : WDIOF_KEEPALIVEPING; |
148 | } | 167 | } |
149 | 168 | ||
150 | |||
151 | static int sc1200wdt_open(struct inode *inode, struct file *file) | 169 | static int sc1200wdt_open(struct inode *inode, struct file *file) |
152 | { | 170 | { |
153 | /* allow one at a time */ | 171 | /* allow one at a time */ |
154 | if (down_trylock(&open_sem)) | 172 | if (test_and_set_bit(0, &open_flag)) |
155 | return -EBUSY; | 173 | return -EBUSY; |
156 | 174 | ||
157 | if (timeout > MAX_TIMEOUT) | 175 | if (timeout > MAX_TIMEOUT) |
@@ -164,71 +182,71 @@ static int sc1200wdt_open(struct inode *inode, struct file *file) | |||
164 | } | 182 | } |
165 | 183 | ||
166 | 184 | ||
167 | static int sc1200wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) | 185 | static long sc1200wdt_ioctl(struct file *file, unsigned int cmd, |
186 | unsigned long arg) | ||
168 | { | 187 | { |
169 | int new_timeout; | 188 | int new_timeout; |
170 | void __user *argp = (void __user *)arg; | 189 | void __user *argp = (void __user *)arg; |
171 | int __user *p = argp; | 190 | int __user *p = argp; |
172 | static struct watchdog_info ident = { | 191 | static const struct watchdog_info ident = { |
173 | .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE, | 192 | .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | |
193 | WDIOF_MAGICCLOSE, | ||
174 | .firmware_version = 0, | 194 | .firmware_version = 0, |
175 | .identity = "PC87307/PC97307", | 195 | .identity = "PC87307/PC97307", |
176 | }; | 196 | }; |
177 | 197 | ||
178 | switch (cmd) { | 198 | switch (cmd) { |
179 | default: | ||
180 | return -ENOTTY; | ||
181 | |||
182 | case WDIOC_GETSUPPORT: | ||
183 | if (copy_to_user(argp, &ident, sizeof ident)) | ||
184 | return -EFAULT; | ||
185 | return 0; | ||
186 | |||
187 | case WDIOC_GETSTATUS: | ||
188 | return put_user(sc1200wdt_status(), p); | ||
189 | |||
190 | case WDIOC_GETBOOTSTATUS: | ||
191 | return put_user(0, p); | ||
192 | |||
193 | case WDIOC_KEEPALIVE: | ||
194 | sc1200wdt_write_data(WDTO, timeout); | ||
195 | return 0; | ||
196 | 199 | ||
197 | case WDIOC_SETTIMEOUT: | 200 | case WDIOC_GETSUPPORT: |
198 | if (get_user(new_timeout, p)) | 201 | if (copy_to_user(argp, &ident, sizeof ident)) |
199 | return -EFAULT; | 202 | return -EFAULT; |
203 | return 0; | ||
200 | 204 | ||
201 | /* the API states this is given in secs */ | 205 | case WDIOC_GETSTATUS: |
202 | new_timeout /= 60; | 206 | return put_user(sc1200wdt_status(), p); |
203 | if (new_timeout < 0 || new_timeout > MAX_TIMEOUT) | ||
204 | return -EINVAL; | ||
205 | 207 | ||
206 | timeout = new_timeout; | 208 | case WDIOC_GETBOOTSTATUS: |
207 | sc1200wdt_write_data(WDTO, timeout); | 209 | return put_user(0, p); |
208 | /* fall through and return the new timeout */ | ||
209 | 210 | ||
210 | case WDIOC_GETTIMEOUT: | 211 | case WDIOC_KEEPALIVE: |
211 | return put_user(timeout * 60, p); | 212 | sc1200wdt_write_data(WDTO, timeout); |
213 | return 0; | ||
214 | |||
215 | case WDIOC_SETTIMEOUT: | ||
216 | if (get_user(new_timeout, p)) | ||
217 | return -EFAULT; | ||
218 | /* the API states this is given in secs */ | ||
219 | new_timeout /= 60; | ||
220 | if (new_timeout < 0 || new_timeout > MAX_TIMEOUT) | ||
221 | return -EINVAL; | ||
222 | timeout = new_timeout; | ||
223 | sc1200wdt_write_data(WDTO, timeout); | ||
224 | /* fall through and return the new timeout */ | ||
212 | 225 | ||
213 | case WDIOC_SETOPTIONS: | 226 | case WDIOC_GETTIMEOUT: |
214 | { | 227 | return put_user(timeout * 60, p); |
215 | int options, retval = -EINVAL; | ||
216 | 228 | ||
217 | if (get_user(options, p)) | 229 | case WDIOC_SETOPTIONS: |
218 | return -EFAULT; | 230 | { |
231 | int options, retval = -EINVAL; | ||
219 | 232 | ||
220 | if (options & WDIOS_DISABLECARD) { | 233 | if (get_user(options, p)) |
221 | sc1200wdt_stop(); | 234 | return -EFAULT; |
222 | retval = 0; | ||
223 | } | ||
224 | 235 | ||
225 | if (options & WDIOS_ENABLECARD) { | 236 | if (options & WDIOS_DISABLECARD) { |
226 | sc1200wdt_start(); | 237 | sc1200wdt_stop(); |
227 | retval = 0; | 238 | retval = 0; |
228 | } | 239 | } |
229 | 240 | ||
230 | return retval; | 241 | if (options & WDIOS_ENABLECARD) { |
242 | sc1200wdt_start(); | ||
243 | retval = 0; | ||
231 | } | 244 | } |
245 | |||
246 | return retval; | ||
247 | } | ||
248 | default: | ||
249 | return -ENOTTY; | ||
232 | } | 250 | } |
233 | } | 251 | } |
234 | 252 | ||
@@ -240,16 +258,18 @@ static int sc1200wdt_release(struct inode *inode, struct file *file) | |||
240 | printk(KERN_INFO PFX "Watchdog disabled\n"); | 258 | printk(KERN_INFO PFX "Watchdog disabled\n"); |
241 | } else { | 259 | } else { |
242 | sc1200wdt_write_data(WDTO, timeout); | 260 | sc1200wdt_write_data(WDTO, timeout); |
243 | printk(KERN_CRIT PFX "Unexpected close!, timeout = %d min(s)\n", timeout); | 261 | printk(KERN_CRIT PFX |
262 | "Unexpected close!, timeout = %d min(s)\n", timeout); | ||
244 | } | 263 | } |
245 | up(&open_sem); | 264 | clear_bit(0, &open_flag); |
246 | expect_close = 0; | 265 | expect_close = 0; |
247 | 266 | ||
248 | return 0; | 267 | return 0; |
249 | } | 268 | } |
250 | 269 | ||
251 | 270 | ||
252 | static ssize_t sc1200wdt_write(struct file *file, const char __user *data, size_t len, loff_t *ppos) | 271 | static ssize_t sc1200wdt_write(struct file *file, const char __user *data, |
272 | size_t len, loff_t *ppos) | ||
253 | { | 273 | { |
254 | if (len) { | 274 | if (len) { |
255 | if (!nowayout) { | 275 | if (!nowayout) { |
@@ -275,7 +295,8 @@ static ssize_t sc1200wdt_write(struct file *file, const char __user *data, size_ | |||
275 | } | 295 | } |
276 | 296 | ||
277 | 297 | ||
278 | static int sc1200wdt_notify_sys(struct notifier_block *this, unsigned long code, void *unused) | 298 | static int sc1200wdt_notify_sys(struct notifier_block *this, |
299 | unsigned long code, void *unused) | ||
279 | { | 300 | { |
280 | if (code == SYS_DOWN || code == SYS_HALT) | 301 | if (code == SYS_DOWN || code == SYS_HALT) |
281 | sc1200wdt_stop(); | 302 | sc1200wdt_stop(); |
@@ -284,23 +305,20 @@ static int sc1200wdt_notify_sys(struct notifier_block *this, unsigned long code, | |||
284 | } | 305 | } |
285 | 306 | ||
286 | 307 | ||
287 | static struct notifier_block sc1200wdt_notifier = | 308 | static struct notifier_block sc1200wdt_notifier = { |
288 | { | ||
289 | .notifier_call = sc1200wdt_notify_sys, | 309 | .notifier_call = sc1200wdt_notify_sys, |
290 | }; | 310 | }; |
291 | 311 | ||
292 | static const struct file_operations sc1200wdt_fops = | 312 | static const struct file_operations sc1200wdt_fops = { |
293 | { | ||
294 | .owner = THIS_MODULE, | 313 | .owner = THIS_MODULE, |
295 | .llseek = no_llseek, | 314 | .llseek = no_llseek, |
296 | .write = sc1200wdt_write, | 315 | .write = sc1200wdt_write, |
297 | .ioctl = sc1200wdt_ioctl, | 316 | .unlocked_ioctl = sc1200wdt_ioctl, |
298 | .open = sc1200wdt_open, | 317 | .open = sc1200wdt_open, |
299 | .release = sc1200wdt_release, | 318 | .release = sc1200wdt_release, |
300 | }; | 319 | }; |
301 | 320 | ||
302 | static struct miscdevice sc1200wdt_miscdev = | 321 | static struct miscdevice sc1200wdt_miscdev = { |
303 | { | ||
304 | .minor = WATCHDOG_MINOR, | 322 | .minor = WATCHDOG_MINOR, |
305 | .name = "watchdog", | 323 | .name = "watchdog", |
306 | .fops = &sc1200wdt_fops, | 324 | .fops = &sc1200wdt_fops, |
@@ -312,14 +330,14 @@ static int __init sc1200wdt_probe(void) | |||
312 | /* The probe works by reading the PMC3 register's default value of 0x0e | 330 | /* The probe works by reading the PMC3 register's default value of 0x0e |
313 | * there is one caveat, if the device disables the parallel port or any | 331 | * there is one caveat, if the device disables the parallel port or any |
314 | * of the UARTs we won't be able to detect it. | 332 | * of the UARTs we won't be able to detect it. |
315 | * Nb. This could be done with accuracy by reading the SID registers, but | 333 | * NB. This could be done with accuracy by reading the SID registers, |
316 | * we don't have access to those io regions. | 334 | * but we don't have access to those io regions. |
317 | */ | 335 | */ |
318 | 336 | ||
319 | unsigned char reg; | 337 | unsigned char reg; |
320 | 338 | ||
321 | sc1200wdt_read_data(PMC3, ®); | 339 | sc1200wdt_read_data(PMC3, ®); |
322 | reg &= 0x0f; /* we don't want the UART busy bits */ | 340 | reg &= 0x0f; /* we don't want the UART busy bits */ |
323 | return (reg == 0x0e) ? 0 : -ENODEV; | 341 | return (reg == 0x0e) ? 0 : -ENODEV; |
324 | } | 342 | } |
325 | 343 | ||
@@ -332,7 +350,8 @@ static struct pnp_device_id scl200wdt_pnp_devices[] = { | |||
332 | {.id = ""}, | 350 | {.id = ""}, |
333 | }; | 351 | }; |
334 | 352 | ||
335 | static int scl200wdt_pnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id) | 353 | static int scl200wdt_pnp_probe(struct pnp_dev *dev, |
354 | const struct pnp_device_id *dev_id) | ||
336 | { | 355 | { |
337 | /* this driver only supports one card at a time */ | 356 | /* this driver only supports one card at a time */ |
338 | if (wdt_dev || !isapnp) | 357 | if (wdt_dev || !isapnp) |
@@ -347,13 +366,14 @@ static int scl200wdt_pnp_probe(struct pnp_dev * dev, const struct pnp_device_id | |||
347 | return -EBUSY; | 366 | return -EBUSY; |
348 | } | 367 | } |
349 | 368 | ||
350 | printk(KERN_INFO "scl200wdt: PnP device found at io port %#x/%d\n", io, io_len); | 369 | printk(KERN_INFO "scl200wdt: PnP device found at io port %#x/%d\n", |
370 | io, io_len); | ||
351 | return 0; | 371 | return 0; |
352 | } | 372 | } |
353 | 373 | ||
354 | static void scl200wdt_pnp_remove(struct pnp_dev * dev) | 374 | static void scl200wdt_pnp_remove(struct pnp_dev *dev) |
355 | { | 375 | { |
356 | if (wdt_dev){ | 376 | if (wdt_dev) { |
357 | release_region(io, io_len); | 377 | release_region(io, io_len); |
358 | wdt_dev = NULL; | 378 | wdt_dev = NULL; |
359 | } | 379 | } |
@@ -375,8 +395,6 @@ static int __init sc1200wdt_init(void) | |||
375 | 395 | ||
376 | printk("%s\n", banner); | 396 | printk("%s\n", banner); |
377 | 397 | ||
378 | sema_init(&open_sem, 1); | ||
379 | |||
380 | #if defined CONFIG_PNP | 398 | #if defined CONFIG_PNP |
381 | if (isapnp) { | 399 | if (isapnp) { |
382 | ret = pnp_register_driver(&scl200wdt_pnp_driver); | 400 | ret = pnp_register_driver(&scl200wdt_pnp_driver); |
@@ -410,13 +428,16 @@ static int __init sc1200wdt_init(void) | |||
410 | 428 | ||
411 | ret = register_reboot_notifier(&sc1200wdt_notifier); | 429 | ret = register_reboot_notifier(&sc1200wdt_notifier); |
412 | if (ret) { | 430 | if (ret) { |
413 | printk(KERN_ERR PFX "Unable to register reboot notifier err = %d\n", ret); | 431 | printk(KERN_ERR PFX |
432 | "Unable to register reboot notifier err = %d\n", ret); | ||
414 | goto out_io; | 433 | goto out_io; |
415 | } | 434 | } |
416 | 435 | ||
417 | ret = misc_register(&sc1200wdt_miscdev); | 436 | ret = misc_register(&sc1200wdt_miscdev); |
418 | if (ret) { | 437 | if (ret) { |
419 | printk(KERN_ERR PFX "Unable to register miscdev on minor %d\n", WATCHDOG_MINOR); | 438 | printk(KERN_ERR PFX |
439 | "Unable to register miscdev on minor %d\n", | ||
440 | WATCHDOG_MINOR); | ||
420 | goto out_rbt; | 441 | goto out_rbt; |
421 | } | 442 | } |
422 | 443 | ||
@@ -446,7 +467,7 @@ static void __exit sc1200wdt_exit(void) | |||
446 | unregister_reboot_notifier(&sc1200wdt_notifier); | 467 | unregister_reboot_notifier(&sc1200wdt_notifier); |
447 | 468 | ||
448 | #if defined CONFIG_PNP | 469 | #if defined CONFIG_PNP |
449 | if(isapnp) | 470 | if (isapnp) |
450 | pnp_unregister_driver(&scl200wdt_pnp_driver); | 471 | pnp_unregister_driver(&scl200wdt_pnp_driver); |
451 | else | 472 | else |
452 | #endif | 473 | #endif |
diff --git a/drivers/watchdog/wdt.c b/drivers/watchdog/wdt.c index 756fb15fdce7..53a6b18bcb9a 100644 --- a/drivers/watchdog/wdt.c +++ b/drivers/watchdog/wdt.c | |||
@@ -24,9 +24,10 @@ | |||
24 | * Matt Crocker). | 24 | * Matt Crocker). |
25 | * Alan Cox : Added wdt= boot option | 25 | * Alan Cox : Added wdt= boot option |
26 | * Alan Cox : Cleaned up copy/user stuff | 26 | * Alan Cox : Cleaned up copy/user stuff |
27 | * Tim Hockin : Added insmod parameters, comment cleanup | 27 | * Tim Hockin : Added insmod parameters, comment |
28 | * Parameterized timeout | 28 | * cleanup, parameterized timeout |
29 | * Tigran Aivazian : Restructured wdt_init() to handle failures | 29 | * Tigran Aivazian : Restructured wdt_init() to handle |
30 | * failures | ||
30 | * Joel Becker : Added WDIOC_GET/SETTIMEOUT | 31 | * Joel Becker : Added WDIOC_GET/SETTIMEOUT |
31 | * Matt Domsch : Added nowayout module option | 32 | * Matt Domsch : Added nowayout module option |
32 | */ | 33 | */ |
@@ -42,9 +43,9 @@ | |||
42 | #include <linux/notifier.h> | 43 | #include <linux/notifier.h> |
43 | #include <linux/reboot.h> | 44 | #include <linux/reboot.h> |
44 | #include <linux/init.h> | 45 | #include <linux/init.h> |
46 | #include <linux/io.h> | ||
47 | #include <linux/uaccess.h> | ||
45 | 48 | ||
46 | #include <asm/io.h> | ||
47 | #include <asm/uaccess.h> | ||
48 | #include <asm/system.h> | 49 | #include <asm/system.h> |
49 | #include "wd501p.h" | 50 | #include "wd501p.h" |
50 | 51 | ||
@@ -60,15 +61,19 @@ static char expect_close; | |||
60 | static int heartbeat = WD_TIMO; | 61 | static int heartbeat = WD_TIMO; |
61 | static int wd_heartbeat; | 62 | static int wd_heartbeat; |
62 | module_param(heartbeat, int, 0); | 63 | module_param(heartbeat, int, 0); |
63 | MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536, default=" __MODULE_STRING(WD_TIMO) ")"); | 64 | MODULE_PARM_DESC(heartbeat, |
65 | "Watchdog heartbeat in seconds. (0 < heartbeat < 65536, default=" | ||
66 | __MODULE_STRING(WD_TIMO) ")"); | ||
64 | 67 | ||
65 | static int nowayout = WATCHDOG_NOWAYOUT; | 68 | static int nowayout = WATCHDOG_NOWAYOUT; |
66 | module_param(nowayout, int, 0); | 69 | module_param(nowayout, int, 0); |
67 | MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); | 70 | MODULE_PARM_DESC(nowayout, |
71 | "Watchdog cannot be stopped once started (default=" | ||
72 | __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); | ||
68 | 73 | ||
69 | /* You must set these - there is no sane way to probe for this board. */ | 74 | /* You must set these - there is no sane way to probe for this board. */ |
70 | static int io=0x240; | 75 | static int io = 0x240; |
71 | static int irq=11; | 76 | static int irq = 11; |
72 | 77 | ||
73 | static DEFINE_SPINLOCK(wdt_lock); | 78 | static DEFINE_SPINLOCK(wdt_lock); |
74 | 79 | ||
@@ -82,7 +87,8 @@ MODULE_PARM_DESC(irq, "WDT irq (default=11)"); | |||
82 | static int tachometer; | 87 | static int tachometer; |
83 | 88 | ||
84 | module_param(tachometer, int, 0); | 89 | module_param(tachometer, int, 0); |
85 | MODULE_PARM_DESC(tachometer, "WDT501-P Fan Tachometer support (0=disable, default=0)"); | 90 | MODULE_PARM_DESC(tachometer, |
91 | "WDT501-P Fan Tachometer support (0=disable, default=0)"); | ||
86 | #endif /* CONFIG_WDT_501 */ | 92 | #endif /* CONFIG_WDT_501 */ |
87 | 93 | ||
88 | /* | 94 | /* |
@@ -91,9 +97,9 @@ MODULE_PARM_DESC(tachometer, "WDT501-P Fan Tachometer support (0=disable, defaul | |||
91 | 97 | ||
92 | static void wdt_ctr_mode(int ctr, int mode) | 98 | static void wdt_ctr_mode(int ctr, int mode) |
93 | { | 99 | { |
94 | ctr<<=6; | 100 | ctr <<= 6; |
95 | ctr|=0x30; | 101 | ctr |= 0x30; |
96 | ctr|=(mode<<1); | 102 | ctr |= (mode << 1); |
97 | outb_p(ctr, WDT_CR); | 103 | outb_p(ctr, WDT_CR); |
98 | } | 104 | } |
99 | 105 | ||
@@ -114,12 +120,15 @@ static int wdt_start(void) | |||
114 | unsigned long flags; | 120 | unsigned long flags; |
115 | spin_lock_irqsave(&wdt_lock, flags); | 121 | spin_lock_irqsave(&wdt_lock, flags); |
116 | inb_p(WDT_DC); /* Disable watchdog */ | 122 | inb_p(WDT_DC); /* Disable watchdog */ |
117 | wdt_ctr_mode(0,3); /* Program CTR0 for Mode 3: Square Wave Generator */ | 123 | wdt_ctr_mode(0, 3); /* Program CTR0 for Mode 3: |
118 | wdt_ctr_mode(1,2); /* Program CTR1 for Mode 2: Rate Generator */ | 124 | Square Wave Generator */ |
119 | wdt_ctr_mode(2,0); /* Program CTR2 for Mode 0: Pulse on Terminal Count */ | 125 | wdt_ctr_mode(1, 2); /* Program CTR1 for Mode 2: |
126 | Rate Generator */ | ||
127 | wdt_ctr_mode(2, 0); /* Program CTR2 for Mode 0: | ||
128 | Pulse on Terminal Count */ | ||
120 | wdt_ctr_load(0, 8948); /* Count at 100Hz */ | 129 | wdt_ctr_load(0, 8948); /* Count at 100Hz */ |
121 | wdt_ctr_load(1,wd_heartbeat); /* Heartbeat */ | 130 | wdt_ctr_load(1, wd_heartbeat); /* Heartbeat */ |
122 | wdt_ctr_load(2,65535); /* Length of reset pulse */ | 131 | wdt_ctr_load(2, 65535); /* Length of reset pulse */ |
123 | outb_p(0, WDT_DC); /* Enable watchdog */ | 132 | outb_p(0, WDT_DC); /* Enable watchdog */ |
124 | spin_unlock_irqrestore(&wdt_lock, flags); | 133 | spin_unlock_irqrestore(&wdt_lock, flags); |
125 | return 0; | 134 | return 0; |
@@ -131,13 +140,13 @@ static int wdt_start(void) | |||
131 | * Stop the watchdog driver. | 140 | * Stop the watchdog driver. |
132 | */ | 141 | */ |
133 | 142 | ||
134 | static int wdt_stop (void) | 143 | static int wdt_stop(void) |
135 | { | 144 | { |
136 | unsigned long flags; | 145 | unsigned long flags; |
137 | spin_lock_irqsave(&wdt_lock, flags); | 146 | spin_lock_irqsave(&wdt_lock, flags); |
138 | /* Turn the card off */ | 147 | /* Turn the card off */ |
139 | inb_p(WDT_DC); /* Disable watchdog */ | 148 | inb_p(WDT_DC); /* Disable watchdog */ |
140 | wdt_ctr_load(2,0); /* 0 length reset pulses now */ | 149 | wdt_ctr_load(2, 0); /* 0 length reset pulses now */ |
141 | spin_unlock_irqrestore(&wdt_lock, flags); | 150 | spin_unlock_irqrestore(&wdt_lock, flags); |
142 | return 0; | 151 | return 0; |
143 | } | 152 | } |
@@ -145,8 +154,8 @@ static int wdt_stop (void) | |||
145 | /** | 154 | /** |
146 | * wdt_ping: | 155 | * wdt_ping: |
147 | * | 156 | * |
148 | * Reload counter one with the watchdog heartbeat. We don't bother reloading | 157 | * Reload counter one with the watchdog heartbeat. We don't bother |
149 | * the cascade counter. | 158 | * reloading the cascade counter. |
150 | */ | 159 | */ |
151 | 160 | ||
152 | static int wdt_ping(void) | 161 | static int wdt_ping(void) |
@@ -155,8 +164,9 @@ static int wdt_ping(void) | |||
155 | spin_lock_irqsave(&wdt_lock, flags); | 164 | spin_lock_irqsave(&wdt_lock, flags); |
156 | /* Write a watchdog value */ | 165 | /* Write a watchdog value */ |
157 | inb_p(WDT_DC); /* Disable watchdog */ | 166 | inb_p(WDT_DC); /* Disable watchdog */ |
158 | wdt_ctr_mode(1,2); /* Re-Program CTR1 for Mode 2: Rate Generator */ | 167 | wdt_ctr_mode(1, 2); /* Re-Program CTR1 for Mode 2: |
159 | wdt_ctr_load(1,wd_heartbeat); /* Heartbeat */ | 168 | Rate Generator */ |
169 | wdt_ctr_load(1, wd_heartbeat); /* Heartbeat */ | ||
160 | outb_p(0, WDT_DC); /* Enable watchdog */ | 170 | outb_p(0, WDT_DC); /* Enable watchdog */ |
161 | spin_unlock_irqrestore(&wdt_lock, flags); | 171 | spin_unlock_irqrestore(&wdt_lock, flags); |
162 | return 0; | 172 | return 0; |
@@ -166,13 +176,14 @@ static int wdt_ping(void) | |||
166 | * wdt_set_heartbeat: | 176 | * wdt_set_heartbeat: |
167 | * @t: the new heartbeat value that needs to be set. | 177 | * @t: the new heartbeat value that needs to be set. |
168 | * | 178 | * |
169 | * Set a new heartbeat value for the watchdog device. If the heartbeat value is | 179 | * Set a new heartbeat value for the watchdog device. If the heartbeat |
170 | * incorrect we keep the old value and return -EINVAL. If successfull we | 180 | * value is incorrect we keep the old value and return -EINVAL. If |
171 | * return 0. | 181 | * successful we return 0. |
172 | */ | 182 | */ |
183 | |||
173 | static int wdt_set_heartbeat(int t) | 184 | static int wdt_set_heartbeat(int t) |
174 | { | 185 | { |
175 | if ((t < 1) || (t > 65535)) | 186 | if (t < 1 || t > 65535) |
176 | return -EINVAL; | 187 | return -EINVAL; |
177 | 188 | ||
178 | heartbeat = t; | 189 | heartbeat = t; |
@@ -200,7 +211,7 @@ static int wdt_get_status(int *status) | |||
200 | new_status = inb_p(WDT_SR); | 211 | new_status = inb_p(WDT_SR); |
201 | spin_unlock_irqrestore(&wdt_lock, flags); | 212 | spin_unlock_irqrestore(&wdt_lock, flags); |
202 | 213 | ||
203 | *status=0; | 214 | *status = 0; |
204 | if (new_status & WDC_SR_ISOI0) | 215 | if (new_status & WDC_SR_ISOI0) |
205 | *status |= WDIOF_EXTERN1; | 216 | *status |= WDIOF_EXTERN1; |
206 | if (new_status & WDC_SR_ISII1) | 217 | if (new_status & WDC_SR_ISII1) |
@@ -266,7 +277,7 @@ static irqreturn_t wdt_interrupt(int irq, void *dev_id) | |||
266 | 277 | ||
267 | #ifdef CONFIG_WDT_501 | 278 | #ifdef CONFIG_WDT_501 |
268 | if (!(status & WDC_SR_TGOOD)) | 279 | if (!(status & WDC_SR_TGOOD)) |
269 | printk(KERN_CRIT "Overheat alarm.(%d)\n",inb_p(WDT_RT)); | 280 | printk(KERN_CRIT "Overheat alarm.(%d)\n", inb_p(WDT_RT)); |
270 | if (!(status & WDC_SR_PSUOVER)) | 281 | if (!(status & WDC_SR_PSUOVER)) |
271 | printk(KERN_CRIT "PSU over voltage.\n"); | 282 | printk(KERN_CRIT "PSU over voltage.\n"); |
272 | if (!(status & WDC_SR_PSUUNDR)) | 283 | if (!(status & WDC_SR_PSUUNDR)) |
@@ -304,9 +315,10 @@ static irqreturn_t wdt_interrupt(int irq, void *dev_id) | |||
304 | * write of data will do, as we we don't define content meaning. | 315 | * write of data will do, as we we don't define content meaning. |
305 | */ | 316 | */ |
306 | 317 | ||
307 | static ssize_t wdt_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) | 318 | static ssize_t wdt_write(struct file *file, const char __user *buf, |
319 | size_t count, loff_t *ppos) | ||
308 | { | 320 | { |
309 | if(count) { | 321 | if (count) { |
310 | if (!nowayout) { | 322 | if (!nowayout) { |
311 | size_t i; | 323 | size_t i; |
312 | 324 | ||
@@ -328,7 +340,6 @@ static ssize_t wdt_write(struct file *file, const char __user *buf, size_t count | |||
328 | 340 | ||
329 | /** | 341 | /** |
330 | * wdt_ioctl: | 342 | * wdt_ioctl: |
331 | * @inode: inode of the device | ||
332 | * @file: file handle to the device | 343 | * @file: file handle to the device |
333 | * @cmd: watchdog command | 344 | * @cmd: watchdog command |
334 | * @arg: argument pointer | 345 | * @arg: argument pointer |
@@ -338,8 +349,7 @@ static ssize_t wdt_write(struct file *file, const char __user *buf, size_t count | |||
338 | * querying capabilities and current status. | 349 | * querying capabilities and current status. |
339 | */ | 350 | */ |
340 | 351 | ||
341 | static int wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | 352 | static long wdt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
342 | unsigned long arg) | ||
343 | { | 353 | { |
344 | void __user *argp = (void __user *)arg; | 354 | void __user *argp = (void __user *)arg; |
345 | int __user *p = argp; | 355 | int __user *p = argp; |
@@ -362,32 +372,28 @@ static int wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
362 | ident.options |= WDIOF_FANFAULT; | 372 | ident.options |= WDIOF_FANFAULT; |
363 | #endif /* CONFIG_WDT_501 */ | 373 | #endif /* CONFIG_WDT_501 */ |
364 | 374 | ||
365 | switch(cmd) | 375 | switch (cmd) { |
366 | { | 376 | default: |
367 | default: | 377 | return -ENOTTY; |
368 | return -ENOTTY; | 378 | case WDIOC_GETSUPPORT: |
369 | case WDIOC_GETSUPPORT: | 379 | return copy_to_user(argp, &ident, sizeof(ident)) ? -EFAULT : 0; |
370 | return copy_to_user(argp, &ident, sizeof(ident))?-EFAULT:0; | 380 | case WDIOC_GETSTATUS: |
371 | 381 | wdt_get_status(&status); | |
372 | case WDIOC_GETSTATUS: | 382 | return put_user(status, p); |
373 | wdt_get_status(&status); | 383 | case WDIOC_GETBOOTSTATUS: |
374 | return put_user(status, p); | 384 | return put_user(0, p); |
375 | case WDIOC_GETBOOTSTATUS: | 385 | case WDIOC_KEEPALIVE: |
376 | return put_user(0, p); | 386 | wdt_ping(); |
377 | case WDIOC_KEEPALIVE: | 387 | return 0; |
378 | wdt_ping(); | 388 | case WDIOC_SETTIMEOUT: |
379 | return 0; | 389 | if (get_user(new_heartbeat, p)) |
380 | case WDIOC_SETTIMEOUT: | 390 | return -EFAULT; |
381 | if (get_user(new_heartbeat, p)) | 391 | if (wdt_set_heartbeat(new_heartbeat)) |
382 | return -EFAULT; | 392 | return -EINVAL; |
383 | 393 | wdt_ping(); | |
384 | if (wdt_set_heartbeat(new_heartbeat)) | 394 | /* Fall */ |
385 | return -EINVAL; | 395 | case WDIOC_GETTIMEOUT: |
386 | 396 | return put_user(heartbeat, p); | |
387 | wdt_ping(); | ||
388 | /* Fall */ | ||
389 | case WDIOC_GETTIMEOUT: | ||
390 | return put_user(heartbeat, p); | ||
391 | } | 397 | } |
392 | } | 398 | } |
393 | 399 | ||
@@ -405,7 +411,7 @@ static int wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
405 | 411 | ||
406 | static int wdt_open(struct inode *inode, struct file *file) | 412 | static int wdt_open(struct inode *inode, struct file *file) |
407 | { | 413 | { |
408 | if(test_and_set_bit(0, &wdt_is_open)) | 414 | if (test_and_set_bit(0, &wdt_is_open)) |
409 | return -EBUSY; | 415 | return -EBUSY; |
410 | /* | 416 | /* |
411 | * Activate | 417 | * Activate |
@@ -432,7 +438,8 @@ static int wdt_release(struct inode *inode, struct file *file) | |||
432 | wdt_stop(); | 438 | wdt_stop(); |
433 | clear_bit(0, &wdt_is_open); | 439 | clear_bit(0, &wdt_is_open); |
434 | } else { | 440 | } else { |
435 | printk(KERN_CRIT "wdt: WDT device closed unexpectedly. WDT will not stop!\n"); | 441 | printk(KERN_CRIT |
442 | "wdt: WDT device closed unexpectedly. WDT will not stop!\n"); | ||
436 | wdt_ping(); | 443 | wdt_ping(); |
437 | } | 444 | } |
438 | expect_close = 0; | 445 | expect_close = 0; |
@@ -451,14 +458,15 @@ static int wdt_release(struct inode *inode, struct file *file) | |||
451 | * farenheit. It was designed by an imperial measurement luddite. | 458 | * farenheit. It was designed by an imperial measurement luddite. |
452 | */ | 459 | */ |
453 | 460 | ||
454 | static ssize_t wdt_temp_read(struct file *file, char __user *buf, size_t count, loff_t *ptr) | 461 | static ssize_t wdt_temp_read(struct file *file, char __user *buf, |
462 | size_t count, loff_t *ptr) | ||
455 | { | 463 | { |
456 | int temperature; | 464 | int temperature; |
457 | 465 | ||
458 | if (wdt_get_temperature(&temperature)) | 466 | if (wdt_get_temperature(&temperature)) |
459 | return -EFAULT; | 467 | return -EFAULT; |
460 | 468 | ||
461 | if (copy_to_user (buf, &temperature, 1)) | 469 | if (copy_to_user(buf, &temperature, 1)) |
462 | return -EFAULT; | 470 | return -EFAULT; |
463 | 471 | ||
464 | return 1; | 472 | return 1; |
@@ -506,10 +514,8 @@ static int wdt_temp_release(struct inode *inode, struct file *file) | |||
506 | static int wdt_notify_sys(struct notifier_block *this, unsigned long code, | 514 | static int wdt_notify_sys(struct notifier_block *this, unsigned long code, |
507 | void *unused) | 515 | void *unused) |
508 | { | 516 | { |
509 | if(code==SYS_DOWN || code==SYS_HALT) { | 517 | if (code == SYS_DOWN || code == SYS_HALT) |
510 | /* Turn the card off */ | ||
511 | wdt_stop(); | 518 | wdt_stop(); |
512 | } | ||
513 | return NOTIFY_DONE; | 519 | return NOTIFY_DONE; |
514 | } | 520 | } |
515 | 521 | ||
@@ -522,7 +528,7 @@ static const struct file_operations wdt_fops = { | |||
522 | .owner = THIS_MODULE, | 528 | .owner = THIS_MODULE, |
523 | .llseek = no_llseek, | 529 | .llseek = no_llseek, |
524 | .write = wdt_write, | 530 | .write = wdt_write, |
525 | .ioctl = wdt_ioctl, | 531 | .unlocked_ioctl = wdt_ioctl, |
526 | .open = wdt_open, | 532 | .open = wdt_open, |
527 | .release = wdt_release, | 533 | .release = wdt_release, |
528 | }; | 534 | }; |
@@ -576,7 +582,7 @@ static void __exit wdt_exit(void) | |||
576 | #endif /* CONFIG_WDT_501 */ | 582 | #endif /* CONFIG_WDT_501 */ |
577 | unregister_reboot_notifier(&wdt_notifier); | 583 | unregister_reboot_notifier(&wdt_notifier); |
578 | free_irq(irq, NULL); | 584 | free_irq(irq, NULL); |
579 | release_region(io,8); | 585 | release_region(io, 8); |
580 | } | 586 | } |
581 | 587 | ||
582 | /** | 588 | /** |
@@ -591,44 +597,49 @@ static int __init wdt_init(void) | |||
591 | { | 597 | { |
592 | int ret; | 598 | int ret; |
593 | 599 | ||
594 | /* Check that the heartbeat value is within it's range ; if not reset to the default */ | 600 | /* Check that the heartbeat value is within it's range; |
601 | if not reset to the default */ | ||
595 | if (wdt_set_heartbeat(heartbeat)) { | 602 | if (wdt_set_heartbeat(heartbeat)) { |
596 | wdt_set_heartbeat(WD_TIMO); | 603 | wdt_set_heartbeat(WD_TIMO); |
597 | printk(KERN_INFO "wdt: heartbeat value must be 0<heartbeat<65536, using %d\n", | 604 | printk(KERN_INFO "wdt: heartbeat value must be 0 < heartbeat < 65536, using %d\n", |
598 | WD_TIMO); | 605 | WD_TIMO); |
599 | } | 606 | } |
600 | 607 | ||
601 | if (!request_region(io, 8, "wdt501p")) { | 608 | if (!request_region(io, 8, "wdt501p")) { |
602 | printk(KERN_ERR "wdt: I/O address 0x%04x already in use\n", io); | 609 | printk(KERN_ERR |
610 | "wdt: I/O address 0x%04x already in use\n", io); | ||
603 | ret = -EBUSY; | 611 | ret = -EBUSY; |
604 | goto out; | 612 | goto out; |
605 | } | 613 | } |
606 | 614 | ||
607 | ret = request_irq(irq, wdt_interrupt, IRQF_DISABLED, "wdt501p", NULL); | 615 | ret = request_irq(irq, wdt_interrupt, IRQF_DISABLED, "wdt501p", NULL); |
608 | if(ret) { | 616 | if (ret) { |
609 | printk(KERN_ERR "wdt: IRQ %d is not free.\n", irq); | 617 | printk(KERN_ERR "wdt: IRQ %d is not free.\n", irq); |
610 | goto outreg; | 618 | goto outreg; |
611 | } | 619 | } |
612 | 620 | ||
613 | ret = register_reboot_notifier(&wdt_notifier); | 621 | ret = register_reboot_notifier(&wdt_notifier); |
614 | if(ret) { | 622 | if (ret) { |
615 | printk(KERN_ERR "wdt: cannot register reboot notifier (err=%d)\n", ret); | 623 | printk(KERN_ERR |
624 | "wdt: cannot register reboot notifier (err=%d)\n", ret); | ||
616 | goto outirq; | 625 | goto outirq; |
617 | } | 626 | } |
618 | 627 | ||
619 | #ifdef CONFIG_WDT_501 | 628 | #ifdef CONFIG_WDT_501 |
620 | ret = misc_register(&temp_miscdev); | 629 | ret = misc_register(&temp_miscdev); |
621 | if (ret) { | 630 | if (ret) { |
622 | printk(KERN_ERR "wdt: cannot register miscdev on minor=%d (err=%d)\n", | 631 | printk(KERN_ERR |
623 | TEMP_MINOR, ret); | 632 | "wdt: cannot register miscdev on minor=%d (err=%d)\n", |
633 | TEMP_MINOR, ret); | ||
624 | goto outrbt; | 634 | goto outrbt; |
625 | } | 635 | } |
626 | #endif /* CONFIG_WDT_501 */ | 636 | #endif /* CONFIG_WDT_501 */ |
627 | 637 | ||
628 | ret = misc_register(&wdt_miscdev); | 638 | ret = misc_register(&wdt_miscdev); |
629 | if (ret) { | 639 | if (ret) { |
630 | printk(KERN_ERR "wdt: cannot register miscdev on minor=%d (err=%d)\n", | 640 | printk(KERN_ERR |
631 | WATCHDOG_MINOR, ret); | 641 | "wdt: cannot register miscdev on minor=%d (err=%d)\n", |
642 | WATCHDOG_MINOR, ret); | ||
632 | goto outmisc; | 643 | goto outmisc; |
633 | } | 644 | } |
634 | 645 | ||
@@ -636,7 +647,8 @@ static int __init wdt_init(void) | |||
636 | printk(KERN_INFO "WDT500/501-P driver 0.10 at 0x%04x (Interrupt %d). heartbeat=%d sec (nowayout=%d)\n", | 647 | printk(KERN_INFO "WDT500/501-P driver 0.10 at 0x%04x (Interrupt %d). heartbeat=%d sec (nowayout=%d)\n", |
637 | io, irq, heartbeat, nowayout); | 648 | io, irq, heartbeat, nowayout); |
638 | #ifdef CONFIG_WDT_501 | 649 | #ifdef CONFIG_WDT_501 |
639 | printk(KERN_INFO "wdt: Fan Tachometer is %s\n", (tachometer ? "Enabled" : "Disabled")); | 650 | printk(KERN_INFO "wdt: Fan Tachometer is %s\n", |
651 | (tachometer ? "Enabled" : "Disabled")); | ||
640 | #endif /* CONFIG_WDT_501 */ | 652 | #endif /* CONFIG_WDT_501 */ |
641 | 653 | ||
642 | out: | 654 | out: |
@@ -651,7 +663,7 @@ outrbt: | |||
651 | outirq: | 663 | outirq: |
652 | free_irq(irq, NULL); | 664 | free_irq(irq, NULL); |
653 | outreg: | 665 | outreg: |
654 | release_region(io,8); | 666 | release_region(io, 8); |
655 | goto out; | 667 | goto out; |
656 | } | 668 | } |
657 | 669 | ||
diff --git a/drivers/watchdog/wdt_pci.c b/drivers/watchdog/wdt_pci.c index 1355608683e4..5d922fd6eafc 100644 --- a/drivers/watchdog/wdt_pci.c +++ b/drivers/watchdog/wdt_pci.c | |||
@@ -29,9 +29,11 @@ | |||
29 | * JP Nollmann : Added support for PCI wdt501p | 29 | * JP Nollmann : Added support for PCI wdt501p |
30 | * Alan Cox : Split ISA and PCI cards into two drivers | 30 | * Alan Cox : Split ISA and PCI cards into two drivers |
31 | * Jeff Garzik : PCI cleanups | 31 | * Jeff Garzik : PCI cleanups |
32 | * Tigran Aivazian : Restructured wdtpci_init_one() to handle failures | 32 | * Tigran Aivazian : Restructured wdtpci_init_one() to handle |
33 | * failures | ||
33 | * Joel Becker : Added WDIOC_GET/SETTIMEOUT | 34 | * Joel Becker : Added WDIOC_GET/SETTIMEOUT |
34 | * Zwane Mwaikambo : Magic char closing, locking changes, cleanups | 35 | * Zwane Mwaikambo : Magic char closing, locking changes, |
36 | * cleanups | ||
35 | * Matt Domsch : nowayout module option | 37 | * Matt Domsch : nowayout module option |
36 | */ | 38 | */ |
37 | 39 | ||
@@ -42,14 +44,15 @@ | |||
42 | #include <linux/miscdevice.h> | 44 | #include <linux/miscdevice.h> |
43 | #include <linux/watchdog.h> | 45 | #include <linux/watchdog.h> |
44 | #include <linux/ioport.h> | 46 | #include <linux/ioport.h> |
47 | #include <linux/delay.h> | ||
45 | #include <linux/notifier.h> | 48 | #include <linux/notifier.h> |
46 | #include <linux/reboot.h> | 49 | #include <linux/reboot.h> |
47 | #include <linux/init.h> | 50 | #include <linux/init.h> |
48 | #include <linux/fs.h> | 51 | #include <linux/fs.h> |
49 | #include <linux/pci.h> | 52 | #include <linux/pci.h> |
53 | #include <linux/io.h> | ||
54 | #include <linux/uaccess.h> | ||
50 | 55 | ||
51 | #include <asm/io.h> | ||
52 | #include <asm/uaccess.h> | ||
53 | #include <asm/system.h> | 56 | #include <asm/system.h> |
54 | 57 | ||
55 | #define WDT_IS_PCI | 58 | #define WDT_IS_PCI |
@@ -73,7 +76,7 @@ | |||
73 | /* We can only use 1 card due to the /dev/watchdog restriction */ | 76 | /* We can only use 1 card due to the /dev/watchdog restriction */ |
74 | static int dev_count; | 77 | static int dev_count; |
75 | 78 | ||
76 | static struct semaphore open_sem; | 79 | static unsigned long open_lock; |
77 | static DEFINE_SPINLOCK(wdtpci_lock); | 80 | static DEFINE_SPINLOCK(wdtpci_lock); |
78 | static char expect_close; | 81 | static char expect_close; |
79 | 82 | ||
@@ -86,18 +89,23 @@ static int irq; | |||
86 | static int heartbeat = WD_TIMO; | 89 | static int heartbeat = WD_TIMO; |
87 | static int wd_heartbeat; | 90 | static int wd_heartbeat; |
88 | module_param(heartbeat, int, 0); | 91 | module_param(heartbeat, int, 0); |
89 | MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536, default=" __MODULE_STRING(WD_TIMO) ")"); | 92 | MODULE_PARM_DESC(heartbeat, |
93 | "Watchdog heartbeat in seconds. (0<heartbeat<65536, default=" | ||
94 | __MODULE_STRING(WD_TIMO) ")"); | ||
90 | 95 | ||
91 | static int nowayout = WATCHDOG_NOWAYOUT; | 96 | static int nowayout = WATCHDOG_NOWAYOUT; |
92 | module_param(nowayout, int, 0); | 97 | module_param(nowayout, int, 0); |
93 | MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); | 98 | MODULE_PARM_DESC(nowayout, |
99 | "Watchdog cannot be stopped once started (default=" | ||
100 | __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); | ||
94 | 101 | ||
95 | #ifdef CONFIG_WDT_501_PCI | 102 | #ifdef CONFIG_WDT_501_PCI |
96 | /* Support for the Fan Tachometer on the PCI-WDT501 */ | 103 | /* Support for the Fan Tachometer on the PCI-WDT501 */ |
97 | static int tachometer; | 104 | static int tachometer; |
98 | 105 | ||
99 | module_param(tachometer, int, 0); | 106 | module_param(tachometer, int, 0); |
100 | MODULE_PARM_DESC(tachometer, "PCI-WDT501 Fan Tachometer support (0=disable, default=0)"); | 107 | MODULE_PARM_DESC(tachometer, |
108 | "PCI-WDT501 Fan Tachometer support (0=disable, default=0)"); | ||
101 | #endif /* CONFIG_WDT_501_PCI */ | 109 | #endif /* CONFIG_WDT_501_PCI */ |
102 | 110 | ||
103 | /* | 111 | /* |
@@ -106,16 +114,19 @@ MODULE_PARM_DESC(tachometer, "PCI-WDT501 Fan Tachometer support (0=disable, defa | |||
106 | 114 | ||
107 | static void wdtpci_ctr_mode(int ctr, int mode) | 115 | static void wdtpci_ctr_mode(int ctr, int mode) |
108 | { | 116 | { |
109 | ctr<<=6; | 117 | ctr <<= 6; |
110 | ctr|=0x30; | 118 | ctr |= 0x30; |
111 | ctr|=(mode<<1); | 119 | ctr |= (mode << 1); |
112 | outb_p(ctr, WDT_CR); | 120 | outb(ctr, WDT_CR); |
121 | udelay(8); | ||
113 | } | 122 | } |
114 | 123 | ||
115 | static void wdtpci_ctr_load(int ctr, int val) | 124 | static void wdtpci_ctr_load(int ctr, int val) |
116 | { | 125 | { |
117 | outb_p(val&0xFF, WDT_COUNT0+ctr); | 126 | outb(val & 0xFF, WDT_COUNT0 + ctr); |
118 | outb_p(val>>8, WDT_COUNT0+ctr); | 127 | udelay(8); |
128 | outb(val >> 8, WDT_COUNT0 + ctr); | ||
129 | udelay(8); | ||
119 | } | 130 | } |
120 | 131 | ||
121 | /** | 132 | /** |
@@ -134,23 +145,35 @@ static int wdtpci_start(void) | |||
134 | * "pet" the watchdog, as Access says. | 145 | * "pet" the watchdog, as Access says. |
135 | * This resets the clock outputs. | 146 | * This resets the clock outputs. |
136 | */ | 147 | */ |
137 | inb_p(WDT_DC); /* Disable watchdog */ | 148 | inb(WDT_DC); /* Disable watchdog */ |
138 | wdtpci_ctr_mode(2,0); /* Program CTR2 for Mode 0: Pulse on Terminal Count */ | 149 | udelay(8); |
139 | outb_p(0, WDT_DC); /* Enable watchdog */ | 150 | wdtpci_ctr_mode(2, 0); /* Program CTR2 for Mode 0: |
140 | 151 | Pulse on Terminal Count */ | |
141 | inb_p(WDT_DC); /* Disable watchdog */ | 152 | outb(0, WDT_DC); /* Enable watchdog */ |
142 | outb_p(0, WDT_CLOCK); /* 2.0833MHz clock */ | 153 | udelay(8); |
143 | inb_p(WDT_BUZZER); /* disable */ | 154 | inb(WDT_DC); /* Disable watchdog */ |
144 | inb_p(WDT_OPTONOTRST); /* disable */ | 155 | udelay(8); |
145 | inb_p(WDT_OPTORST); /* disable */ | 156 | outb(0, WDT_CLOCK); /* 2.0833MHz clock */ |
146 | inb_p(WDT_PROGOUT); /* disable */ | 157 | udelay(8); |
147 | wdtpci_ctr_mode(0,3); /* Program CTR0 for Mode 3: Square Wave Generator */ | 158 | inb(WDT_BUZZER); /* disable */ |
148 | wdtpci_ctr_mode(1,2); /* Program CTR1 for Mode 2: Rate Generator */ | 159 | udelay(8); |
149 | wdtpci_ctr_mode(2,1); /* Program CTR2 for Mode 1: Retriggerable One-Shot */ | 160 | inb(WDT_OPTONOTRST); /* disable */ |
150 | wdtpci_ctr_load(0,20833); /* count at 100Hz */ | 161 | udelay(8); |
151 | wdtpci_ctr_load(1,wd_heartbeat);/* Heartbeat */ | 162 | inb(WDT_OPTORST); /* disable */ |
163 | udelay(8); | ||
164 | inb(WDT_PROGOUT); /* disable */ | ||
165 | udelay(8); | ||
166 | wdtpci_ctr_mode(0, 3); /* Program CTR0 for Mode 3: | ||
167 | Square Wave Generator */ | ||
168 | wdtpci_ctr_mode(1, 2); /* Program CTR1 for Mode 2: | ||
169 | Rate Generator */ | ||
170 | wdtpci_ctr_mode(2, 1); /* Program CTR2 for Mode 1: | ||
171 | Retriggerable One-Shot */ | ||
172 | wdtpci_ctr_load(0, 20833); /* count at 100Hz */ | ||
173 | wdtpci_ctr_load(1, wd_heartbeat);/* Heartbeat */ | ||
152 | /* DO NOT LOAD CTR2 on PCI card! -- JPN */ | 174 | /* DO NOT LOAD CTR2 on PCI card! -- JPN */ |
153 | outb_p(0, WDT_DC); /* Enable watchdog */ | 175 | outb(0, WDT_DC); /* Enable watchdog */ |
176 | udelay(8); | ||
154 | 177 | ||
155 | spin_unlock_irqrestore(&wdtpci_lock, flags); | 178 | spin_unlock_irqrestore(&wdtpci_lock, flags); |
156 | return 0; | 179 | return 0; |
@@ -162,14 +185,15 @@ static int wdtpci_start(void) | |||
162 | * Stop the watchdog driver. | 185 | * Stop the watchdog driver. |
163 | */ | 186 | */ |
164 | 187 | ||
165 | static int wdtpci_stop (void) | 188 | static int wdtpci_stop(void) |
166 | { | 189 | { |
167 | unsigned long flags; | 190 | unsigned long flags; |
168 | 191 | ||
169 | /* Turn the card off */ | 192 | /* Turn the card off */ |
170 | spin_lock_irqsave(&wdtpci_lock, flags); | 193 | spin_lock_irqsave(&wdtpci_lock, flags); |
171 | inb_p(WDT_DC); /* Disable watchdog */ | 194 | inb(WDT_DC); /* Disable watchdog */ |
172 | wdtpci_ctr_load(2,0); /* 0 length reset pulses now */ | 195 | udelay(8); |
196 | wdtpci_ctr_load(2, 0); /* 0 length reset pulses now */ | ||
173 | spin_unlock_irqrestore(&wdtpci_lock, flags); | 197 | spin_unlock_irqrestore(&wdtpci_lock, flags); |
174 | return 0; | 198 | return 0; |
175 | } | 199 | } |
@@ -177,20 +201,23 @@ static int wdtpci_stop (void) | |||
177 | /** | 201 | /** |
178 | * wdtpci_ping: | 202 | * wdtpci_ping: |
179 | * | 203 | * |
180 | * Reload counter one with the watchdog heartbeat. We don't bother reloading | 204 | * Reload counter one with the watchdog heartbeat. We don't bother |
181 | * the cascade counter. | 205 | * reloading the cascade counter. |
182 | */ | 206 | */ |
183 | 207 | ||
184 | static int wdtpci_ping(void) | 208 | static int wdtpci_ping(void) |
185 | { | 209 | { |
186 | unsigned long flags; | 210 | unsigned long flags; |
187 | 211 | ||
188 | /* Write a watchdog value */ | ||
189 | spin_lock_irqsave(&wdtpci_lock, flags); | 212 | spin_lock_irqsave(&wdtpci_lock, flags); |
190 | inb_p(WDT_DC); /* Disable watchdog */ | 213 | /* Write a watchdog value */ |
191 | wdtpci_ctr_mode(1,2); /* Re-Program CTR1 for Mode 2: Rate Generator */ | 214 | inb(WDT_DC); /* Disable watchdog */ |
192 | wdtpci_ctr_load(1,wd_heartbeat);/* Heartbeat */ | 215 | udelay(8); |
193 | outb_p(0, WDT_DC); /* Enable watchdog */ | 216 | wdtpci_ctr_mode(1, 2); /* Re-Program CTR1 for Mode 2: |
217 | Rate Generator */ | ||
218 | wdtpci_ctr_load(1, wd_heartbeat);/* Heartbeat */ | ||
219 | outb(0, WDT_DC); /* Enable watchdog */ | ||
220 | udelay(8); | ||
194 | spin_unlock_irqrestore(&wdtpci_lock, flags); | 221 | spin_unlock_irqrestore(&wdtpci_lock, flags); |
195 | return 0; | 222 | return 0; |
196 | } | 223 | } |
@@ -199,14 +226,14 @@ static int wdtpci_ping(void) | |||
199 | * wdtpci_set_heartbeat: | 226 | * wdtpci_set_heartbeat: |
200 | * @t: the new heartbeat value that needs to be set. | 227 | * @t: the new heartbeat value that needs to be set. |
201 | * | 228 | * |
202 | * Set a new heartbeat value for the watchdog device. If the heartbeat value is | 229 | * Set a new heartbeat value for the watchdog device. If the heartbeat |
203 | * incorrect we keep the old value and return -EINVAL. If successfull we | 230 | * value is incorrect we keep the old value and return -EINVAL. |
204 | * return 0. | 231 | * If successful we return 0. |
205 | */ | 232 | */ |
206 | static int wdtpci_set_heartbeat(int t) | 233 | static int wdtpci_set_heartbeat(int t) |
207 | { | 234 | { |
208 | /* Arbitrary, can't find the card's limits */ | 235 | /* Arbitrary, can't find the card's limits */ |
209 | if ((t < 1) || (t > 65535)) | 236 | if (t < 1 || t > 65535) |
210 | return -EINVAL; | 237 | return -EINVAL; |
211 | 238 | ||
212 | heartbeat = t; | 239 | heartbeat = t; |
@@ -227,9 +254,14 @@ static int wdtpci_set_heartbeat(int t) | |||
227 | 254 | ||
228 | static int wdtpci_get_status(int *status) | 255 | static int wdtpci_get_status(int *status) |
229 | { | 256 | { |
230 | unsigned char new_status=inb_p(WDT_SR); | 257 | unsigned char new_status; |
258 | unsigned long flags; | ||
259 | |||
260 | spin_lock_irqsave(&wdtpci_lock, flags); | ||
261 | new_status = inb(WDT_SR); | ||
262 | spin_unlock_irqrestore(&wdtpci_lock, flags); | ||
231 | 263 | ||
232 | *status=0; | 264 | *status = 0; |
233 | if (new_status & WDC_SR_ISOI0) | 265 | if (new_status & WDC_SR_ISOI0) |
234 | *status |= WDIOF_EXTERN1; | 266 | *status |= WDIOF_EXTERN1; |
235 | if (new_status & WDC_SR_ISII1) | 267 | if (new_status & WDC_SR_ISII1) |
@@ -259,8 +291,12 @@ static int wdtpci_get_status(int *status) | |||
259 | 291 | ||
260 | static int wdtpci_get_temperature(int *temperature) | 292 | static int wdtpci_get_temperature(int *temperature) |
261 | { | 293 | { |
262 | unsigned short c=inb_p(WDT_RT); | 294 | unsigned short c; |
263 | 295 | unsigned long flags; | |
296 | spin_lock_irqsave(&wdtpci_lock, flags); | ||
297 | c = inb(WDT_RT); | ||
298 | udelay(8); | ||
299 | spin_unlock_irqrestore(&wdtpci_lock, flags); | ||
264 | *temperature = (c * 11 / 15) + 7; | 300 | *temperature = (c * 11 / 15) + 7; |
265 | return 0; | 301 | return 0; |
266 | } | 302 | } |
@@ -282,17 +318,25 @@ static irqreturn_t wdtpci_interrupt(int irq, void *dev_id) | |||
282 | * Read the status register see what is up and | 318 | * Read the status register see what is up and |
283 | * then printk it. | 319 | * then printk it. |
284 | */ | 320 | */ |
285 | unsigned char status=inb_p(WDT_SR); | 321 | unsigned char status; |
322 | |||
323 | spin_lock(&wdtpci_lock); | ||
324 | |||
325 | status = inb(WDT_SR); | ||
326 | udelay(8); | ||
286 | 327 | ||
287 | printk(KERN_CRIT PFX "status %d\n", status); | 328 | printk(KERN_CRIT PFX "status %d\n", status); |
288 | 329 | ||
289 | #ifdef CONFIG_WDT_501_PCI | 330 | #ifdef CONFIG_WDT_501_PCI |
290 | if (!(status & WDC_SR_TGOOD)) | 331 | if (!(status & WDC_SR_TGOOD)) { |
291 | printk(KERN_CRIT PFX "Overheat alarm.(%d)\n",inb_p(WDT_RT)); | 332 | u8 alarm = inb(WDT_RT); |
333 | printk(KERN_CRIT PFX "Overheat alarm.(%d)\n", alarm); | ||
334 | udelay(8); | ||
335 | } | ||
292 | if (!(status & WDC_SR_PSUOVER)) | 336 | if (!(status & WDC_SR_PSUOVER)) |
293 | printk(KERN_CRIT PFX "PSU over voltage.\n"); | 337 | printk(KERN_CRIT PFX "PSU over voltage.\n"); |
294 | if (!(status & WDC_SR_PSUUNDR)) | 338 | if (!(status & WDC_SR_PSUUNDR)) |
295 | printk(KERN_CRIT PFX "PSU under voltage.\n"); | 339 | printk(KERN_CRIT PFX "PSU under voltage.\n"); |
296 | if (tachometer) { | 340 | if (tachometer) { |
297 | if (!(status & WDC_SR_FANGOOD)) | 341 | if (!(status & WDC_SR_FANGOOD)) |
298 | printk(KERN_CRIT PFX "Possible fan fault.\n"); | 342 | printk(KERN_CRIT PFX "Possible fan fault.\n"); |
@@ -310,6 +354,7 @@ static irqreturn_t wdtpci_interrupt(int irq, void *dev_id) | |||
310 | printk(KERN_CRIT PFX "Reset in 5ms.\n"); | 354 | printk(KERN_CRIT PFX "Reset in 5ms.\n"); |
311 | #endif | 355 | #endif |
312 | } | 356 | } |
357 | spin_unlock(&wdtpci_lock); | ||
313 | return IRQ_HANDLED; | 358 | return IRQ_HANDLED; |
314 | } | 359 | } |
315 | 360 | ||
@@ -325,7 +370,8 @@ static irqreturn_t wdtpci_interrupt(int irq, void *dev_id) | |||
325 | * write of data will do, as we we don't define content meaning. | 370 | * write of data will do, as we we don't define content meaning. |
326 | */ | 371 | */ |
327 | 372 | ||
328 | static ssize_t wdtpci_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) | 373 | static ssize_t wdtpci_write(struct file *file, const char __user *buf, |
374 | size_t count, loff_t *ppos) | ||
329 | { | 375 | { |
330 | if (count) { | 376 | if (count) { |
331 | if (!nowayout) { | 377 | if (!nowayout) { |
@@ -335,7 +381,7 @@ static ssize_t wdtpci_write(struct file *file, const char __user *buf, size_t co | |||
335 | 381 | ||
336 | for (i = 0; i != count; i++) { | 382 | for (i = 0; i != count; i++) { |
337 | char c; | 383 | char c; |
338 | if(get_user(c, buf+i)) | 384 | if (get_user(c, buf+i)) |
339 | return -EFAULT; | 385 | return -EFAULT; |
340 | if (c == 'V') | 386 | if (c == 'V') |
341 | expect_close = 42; | 387 | expect_close = 42; |
@@ -343,13 +389,11 @@ static ssize_t wdtpci_write(struct file *file, const char __user *buf, size_t co | |||
343 | } | 389 | } |
344 | wdtpci_ping(); | 390 | wdtpci_ping(); |
345 | } | 391 | } |
346 | |||
347 | return count; | 392 | return count; |
348 | } | 393 | } |
349 | 394 | ||
350 | /** | 395 | /** |
351 | * wdtpci_ioctl: | 396 | * wdtpci_ioctl: |
352 | * @inode: inode of the device | ||
353 | * @file: file handle to the device | 397 | * @file: file handle to the device |
354 | * @cmd: watchdog command | 398 | * @cmd: watchdog command |
355 | * @arg: argument pointer | 399 | * @arg: argument pointer |
@@ -359,8 +403,8 @@ static ssize_t wdtpci_write(struct file *file, const char __user *buf, size_t co | |||
359 | * querying capabilities and current status. | 403 | * querying capabilities and current status. |
360 | */ | 404 | */ |
361 | 405 | ||
362 | static int wdtpci_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | 406 | static long wdtpci_ioctl(struct file *file, unsigned int cmd, |
363 | unsigned long arg) | 407 | unsigned long arg) |
364 | { | 408 | { |
365 | int new_heartbeat; | 409 | int new_heartbeat; |
366 | int status; | 410 | int status; |
@@ -383,33 +427,29 @@ static int wdtpci_ioctl(struct inode *inode, struct file *file, unsigned int cmd | |||
383 | ident.options |= WDIOF_FANFAULT; | 427 | ident.options |= WDIOF_FANFAULT; |
384 | #endif /* CONFIG_WDT_501_PCI */ | 428 | #endif /* CONFIG_WDT_501_PCI */ |
385 | 429 | ||
386 | switch(cmd) | 430 | switch (cmd) { |
387 | { | 431 | default: |
388 | default: | 432 | return -ENOTTY; |
389 | return -ENOTTY; | 433 | case WDIOC_GETSUPPORT: |
390 | case WDIOC_GETSUPPORT: | 434 | return copy_to_user(argp, &ident, sizeof(ident)) ? -EFAULT : 0; |
391 | return copy_to_user(argp, &ident, sizeof(ident))?-EFAULT:0; | 435 | case WDIOC_GETSTATUS: |
392 | 436 | wdtpci_get_status(&status); | |
393 | case WDIOC_GETSTATUS: | 437 | return put_user(status, p); |
394 | wdtpci_get_status(&status); | 438 | case WDIOC_GETBOOTSTATUS: |
395 | return put_user(status, p); | 439 | return put_user(0, p); |
396 | case WDIOC_GETBOOTSTATUS: | 440 | case WDIOC_KEEPALIVE: |
397 | return put_user(0, p); | 441 | wdtpci_ping(); |
398 | case WDIOC_KEEPALIVE: | 442 | return 0; |
399 | wdtpci_ping(); | 443 | case WDIOC_SETTIMEOUT: |
400 | return 0; | 444 | if (get_user(new_heartbeat, p)) |
401 | case WDIOC_SETTIMEOUT: | 445 | return -EFAULT; |
402 | if (get_user(new_heartbeat, p)) | 446 | if (wdtpci_set_heartbeat(new_heartbeat)) |
403 | return -EFAULT; | 447 | return -EINVAL; |
404 | 448 | wdtpci_ping(); | |
405 | if (wdtpci_set_heartbeat(new_heartbeat)) | 449 | /* Fall */ |
406 | return -EINVAL; | 450 | case WDIOC_GETTIMEOUT: |
407 | 451 | return put_user(heartbeat, p); | |
408 | wdtpci_ping(); | 452 | } |
409 | /* Fall */ | ||
410 | case WDIOC_GETTIMEOUT: | ||
411 | return put_user(heartbeat, p); | ||
412 | } | ||
413 | } | 453 | } |
414 | 454 | ||
415 | /** | 455 | /** |
@@ -426,12 +466,11 @@ static int wdtpci_ioctl(struct inode *inode, struct file *file, unsigned int cmd | |||
426 | 466 | ||
427 | static int wdtpci_open(struct inode *inode, struct file *file) | 467 | static int wdtpci_open(struct inode *inode, struct file *file) |
428 | { | 468 | { |
429 | if (down_trylock(&open_sem)) | 469 | if (test_and_set_bit(0, &open_lock)) |
430 | return -EBUSY; | 470 | return -EBUSY; |
431 | 471 | ||
432 | if (nowayout) { | 472 | if (nowayout) |
433 | __module_get(THIS_MODULE); | 473 | __module_get(THIS_MODULE); |
434 | } | ||
435 | /* | 474 | /* |
436 | * Activate | 475 | * Activate |
437 | */ | 476 | */ |
@@ -460,7 +499,7 @@ static int wdtpci_release(struct inode *inode, struct file *file) | |||
460 | wdtpci_ping(); | 499 | wdtpci_ping(); |
461 | } | 500 | } |
462 | expect_close = 0; | 501 | expect_close = 0; |
463 | up(&open_sem); | 502 | clear_bit(0, &open_lock); |
464 | return 0; | 503 | return 0; |
465 | } | 504 | } |
466 | 505 | ||
@@ -476,14 +515,15 @@ static int wdtpci_release(struct inode *inode, struct file *file) | |||
476 | * fahrenheit. It was designed by an imperial measurement luddite. | 515 | * fahrenheit. It was designed by an imperial measurement luddite. |
477 | */ | 516 | */ |
478 | 517 | ||
479 | static ssize_t wdtpci_temp_read(struct file *file, char __user *buf, size_t count, loff_t *ptr) | 518 | static ssize_t wdtpci_temp_read(struct file *file, char __user *buf, |
519 | size_t count, loff_t *ptr) | ||
480 | { | 520 | { |
481 | int temperature; | 521 | int temperature; |
482 | 522 | ||
483 | if (wdtpci_get_temperature(&temperature)) | 523 | if (wdtpci_get_temperature(&temperature)) |
484 | return -EFAULT; | 524 | return -EFAULT; |
485 | 525 | ||
486 | if (copy_to_user (buf, &temperature, 1)) | 526 | if (copy_to_user(buf, &temperature, 1)) |
487 | return -EFAULT; | 527 | return -EFAULT; |
488 | 528 | ||
489 | return 1; | 529 | return 1; |
@@ -529,12 +569,10 @@ static int wdtpci_temp_release(struct inode *inode, struct file *file) | |||
529 | */ | 569 | */ |
530 | 570 | ||
531 | static int wdtpci_notify_sys(struct notifier_block *this, unsigned long code, | 571 | static int wdtpci_notify_sys(struct notifier_block *this, unsigned long code, |
532 | void *unused) | 572 | void *unused) |
533 | { | 573 | { |
534 | if (code==SYS_DOWN || code==SYS_HALT) { | 574 | if (code == SYS_DOWN || code == SYS_HALT) |
535 | /* Turn the card off */ | ||
536 | wdtpci_stop(); | 575 | wdtpci_stop(); |
537 | } | ||
538 | return NOTIFY_DONE; | 576 | return NOTIFY_DONE; |
539 | } | 577 | } |
540 | 578 | ||
@@ -547,7 +585,7 @@ static const struct file_operations wdtpci_fops = { | |||
547 | .owner = THIS_MODULE, | 585 | .owner = THIS_MODULE, |
548 | .llseek = no_llseek, | 586 | .llseek = no_llseek, |
549 | .write = wdtpci_write, | 587 | .write = wdtpci_write, |
550 | .ioctl = wdtpci_ioctl, | 588 | .unlocked_ioctl = wdtpci_ioctl, |
551 | .open = wdtpci_open, | 589 | .open = wdtpci_open, |
552 | .release = wdtpci_release, | 590 | .release = wdtpci_release, |
553 | }; | 591 | }; |
@@ -584,80 +622,85 @@ static struct notifier_block wdtpci_notifier = { | |||
584 | }; | 622 | }; |
585 | 623 | ||
586 | 624 | ||
587 | static int __devinit wdtpci_init_one (struct pci_dev *dev, | 625 | static int __devinit wdtpci_init_one(struct pci_dev *dev, |
588 | const struct pci_device_id *ent) | 626 | const struct pci_device_id *ent) |
589 | { | 627 | { |
590 | int ret = -EIO; | 628 | int ret = -EIO; |
591 | 629 | ||
592 | dev_count++; | 630 | dev_count++; |
593 | if (dev_count > 1) { | 631 | if (dev_count > 1) { |
594 | printk (KERN_ERR PFX "this driver only supports 1 device\n"); | 632 | printk(KERN_ERR PFX "This driver only supports one device\n"); |
595 | return -ENODEV; | 633 | return -ENODEV; |
596 | } | 634 | } |
597 | 635 | ||
598 | if (pci_enable_device (dev)) { | 636 | if (pci_enable_device(dev)) { |
599 | printk (KERN_ERR PFX "Not possible to enable PCI Device\n"); | 637 | printk(KERN_ERR PFX "Not possible to enable PCI Device\n"); |
600 | return -ENODEV; | 638 | return -ENODEV; |
601 | } | 639 | } |
602 | 640 | ||
603 | if (pci_resource_start (dev, 2) == 0x0000) { | 641 | if (pci_resource_start(dev, 2) == 0x0000) { |
604 | printk (KERN_ERR PFX "No I/O-Address for card detected\n"); | 642 | printk(KERN_ERR PFX "No I/O-Address for card detected\n"); |
605 | ret = -ENODEV; | 643 | ret = -ENODEV; |
606 | goto out_pci; | 644 | goto out_pci; |
607 | } | 645 | } |
608 | 646 | ||
609 | sema_init(&open_sem, 1); | ||
610 | |||
611 | irq = dev->irq; | 647 | irq = dev->irq; |
612 | io = pci_resource_start (dev, 2); | 648 | io = pci_resource_start(dev, 2); |
613 | 649 | ||
614 | if (request_region (io, 16, "wdt_pci") == NULL) { | 650 | if (request_region(io, 16, "wdt_pci") == NULL) { |
615 | printk (KERN_ERR PFX "I/O address 0x%04x already in use\n", io); | 651 | printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", io); |
616 | goto out_pci; | 652 | goto out_pci; |
617 | } | 653 | } |
618 | 654 | ||
619 | if (request_irq (irq, wdtpci_interrupt, IRQF_DISABLED | IRQF_SHARED, | 655 | if (request_irq(irq, wdtpci_interrupt, IRQF_DISABLED | IRQF_SHARED, |
620 | "wdt_pci", &wdtpci_miscdev)) { | 656 | "wdt_pci", &wdtpci_miscdev)) { |
621 | printk (KERN_ERR PFX "IRQ %d is not free\n", irq); | 657 | printk(KERN_ERR PFX "IRQ %d is not free\n", irq); |
622 | goto out_reg; | 658 | goto out_reg; |
623 | } | 659 | } |
624 | 660 | ||
625 | printk ("PCI-WDT500/501 (PCI-WDG-CSM) driver 0.10 at 0x%04x (Interrupt %d)\n", | 661 | printk(KERN_INFO |
626 | io, irq); | 662 | "PCI-WDT500/501 (PCI-WDG-CSM) driver 0.10 at 0x%04x (Interrupt %d)\n", |
663 | io, irq); | ||
627 | 664 | ||
628 | /* Check that the heartbeat value is within it's range ; if not reset to the default */ | 665 | /* Check that the heartbeat value is within its range; |
666 | if not reset to the default */ | ||
629 | if (wdtpci_set_heartbeat(heartbeat)) { | 667 | if (wdtpci_set_heartbeat(heartbeat)) { |
630 | wdtpci_set_heartbeat(WD_TIMO); | 668 | wdtpci_set_heartbeat(WD_TIMO); |
631 | printk(KERN_INFO PFX "heartbeat value must be 0<heartbeat<65536, using %d\n", | 669 | printk(KERN_INFO PFX |
632 | WD_TIMO); | 670 | "heartbeat value must be 0 < heartbeat < 65536, using %d\n", |
671 | WD_TIMO); | ||
633 | } | 672 | } |
634 | 673 | ||
635 | ret = register_reboot_notifier (&wdtpci_notifier); | 674 | ret = register_reboot_notifier(&wdtpci_notifier); |
636 | if (ret) { | 675 | if (ret) { |
637 | printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", ret); | 676 | printk(KERN_ERR PFX |
677 | "cannot register reboot notifier (err=%d)\n", ret); | ||
638 | goto out_irq; | 678 | goto out_irq; |
639 | } | 679 | } |
640 | 680 | ||
641 | #ifdef CONFIG_WDT_501_PCI | 681 | #ifdef CONFIG_WDT_501_PCI |
642 | ret = misc_register (&temp_miscdev); | 682 | ret = misc_register(&temp_miscdev); |
643 | if (ret) { | 683 | if (ret) { |
644 | printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", | 684 | printk(KERN_ERR PFX |
645 | TEMP_MINOR, ret); | 685 | "cannot register miscdev on minor=%d (err=%d)\n", |
686 | TEMP_MINOR, ret); | ||
646 | goto out_rbt; | 687 | goto out_rbt; |
647 | } | 688 | } |
648 | #endif /* CONFIG_WDT_501_PCI */ | 689 | #endif /* CONFIG_WDT_501_PCI */ |
649 | 690 | ||
650 | ret = misc_register (&wdtpci_miscdev); | 691 | ret = misc_register(&wdtpci_miscdev); |
651 | if (ret) { | 692 | if (ret) { |
652 | printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", | 693 | printk(KERN_ERR PFX |
653 | WATCHDOG_MINOR, ret); | 694 | "cannot register miscdev on minor=%d (err=%d)\n", |
695 | WATCHDOG_MINOR, ret); | ||
654 | goto out_misc; | 696 | goto out_misc; |
655 | } | 697 | } |
656 | 698 | ||
657 | printk(KERN_INFO PFX "initialized. heartbeat=%d sec (nowayout=%d)\n", | 699 | printk(KERN_INFO PFX "initialized. heartbeat=%d sec (nowayout=%d)\n", |
658 | heartbeat, nowayout); | 700 | heartbeat, nowayout); |
659 | #ifdef CONFIG_WDT_501_PCI | 701 | #ifdef CONFIG_WDT_501_PCI |
660 | printk(KERN_INFO "wdt: Fan Tachometer is %s\n", (tachometer ? "Enabled" : "Disabled")); | 702 | printk(KERN_INFO "wdt: Fan Tachometer is %s\n", |
703 | (tachometer ? "Enabled" : "Disabled")); | ||
661 | #endif /* CONFIG_WDT_501_PCI */ | 704 | #endif /* CONFIG_WDT_501_PCI */ |
662 | 705 | ||
663 | ret = 0; | 706 | ret = 0; |
@@ -673,14 +716,14 @@ out_rbt: | |||
673 | out_irq: | 716 | out_irq: |
674 | free_irq(irq, &wdtpci_miscdev); | 717 | free_irq(irq, &wdtpci_miscdev); |
675 | out_reg: | 718 | out_reg: |
676 | release_region (io, 16); | 719 | release_region(io, 16); |
677 | out_pci: | 720 | out_pci: |
678 | pci_disable_device(dev); | 721 | pci_disable_device(dev); |
679 | goto out; | 722 | goto out; |
680 | } | 723 | } |
681 | 724 | ||
682 | 725 | ||
683 | static void __devexit wdtpci_remove_one (struct pci_dev *pdev) | 726 | static void __devexit wdtpci_remove_one(struct pci_dev *pdev) |
684 | { | 727 | { |
685 | /* here we assume only one device will ever have | 728 | /* here we assume only one device will ever have |
686 | * been picked up and registered by probe function */ | 729 | * been picked up and registered by probe function */ |
@@ -728,7 +771,7 @@ static struct pci_driver wdtpci_driver = { | |||
728 | 771 | ||
729 | static void __exit wdtpci_cleanup(void) | 772 | static void __exit wdtpci_cleanup(void) |
730 | { | 773 | { |
731 | pci_unregister_driver (&wdtpci_driver); | 774 | pci_unregister_driver(&wdtpci_driver); |
732 | } | 775 | } |
733 | 776 | ||
734 | 777 | ||
@@ -742,7 +785,7 @@ static void __exit wdtpci_cleanup(void) | |||
742 | 785 | ||
743 | static int __init wdtpci_init(void) | 786 | static int __init wdtpci_init(void) |
744 | { | 787 | { |
745 | return pci_register_driver (&wdtpci_driver); | 788 | return pci_register_driver(&wdtpci_driver); |
746 | } | 789 | } |
747 | 790 | ||
748 | 791 | ||
diff --git a/firmware/ihex2fw.c b/firmware/ihex2fw.c index 660b191ed75e..8f7fdaa9e010 100644 --- a/firmware/ihex2fw.c +++ b/firmware/ihex2fw.c | |||
@@ -250,19 +250,19 @@ static void file_record(struct ihex_binrec *record) | |||
250 | 250 | ||
251 | static int output_records(int outfd) | 251 | static int output_records(int outfd) |
252 | { | 252 | { |
253 | unsigned char zeroes[5] = {0, 0, 0, 0, 0}; | 253 | unsigned char zeroes[6] = {0, 0, 0, 0, 0, 0}; |
254 | struct ihex_binrec *p = records; | 254 | struct ihex_binrec *p = records; |
255 | 255 | ||
256 | while (p) { | 256 | while (p) { |
257 | uint16_t writelen = (p->len + 9) & ~3; | 257 | uint16_t writelen = (p->len + 9) & ~3; |
258 | 258 | ||
259 | p->addr = htonl(p->addr); | 259 | p->addr = htonl(p->addr); |
260 | p->len = htonl(p->len); | 260 | p->len = htons(p->len); |
261 | write(outfd, &p->addr, writelen); | 261 | write(outfd, &p->addr, writelen); |
262 | p = p->next; | 262 | p = p->next; |
263 | } | 263 | } |
264 | /* EOF record is zero length, since we don't bother to represent | 264 | /* EOF record is zero length, since we don't bother to represent |
265 | the type field in the binary version */ | 265 | the type field in the binary version */ |
266 | write(outfd, zeroes, 5); | 266 | write(outfd, zeroes, 6); |
267 | return 0; | 267 | return 0; |
268 | } | 268 | } |
diff --git a/fs/afs/write.c b/fs/afs/write.c index 9a849ad3c489..065b4e10681a 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c | |||
@@ -404,7 +404,7 @@ static int afs_write_back_from_locked_page(struct afs_writeback *wb, | |||
404 | page = pages[loop]; | 404 | page = pages[loop]; |
405 | if (page->index > wb->last) | 405 | if (page->index > wb->last) |
406 | break; | 406 | break; |
407 | if (TestSetPageLocked(page)) | 407 | if (!trylock_page(page)) |
408 | break; | 408 | break; |
409 | if (!PageDirty(page) || | 409 | if (!PageDirty(page) || |
410 | page_private(page) != (unsigned long) wb) { | 410 | page_private(page) != (unsigned long) wb) { |
diff --git a/fs/buffer.c b/fs/buffer.c index 4dbe52948e8f..38653e36e225 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
@@ -1720,7 +1720,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page, | |||
1720 | */ | 1720 | */ |
1721 | if (wbc->sync_mode != WB_SYNC_NONE || !wbc->nonblocking) { | 1721 | if (wbc->sync_mode != WB_SYNC_NONE || !wbc->nonblocking) { |
1722 | lock_buffer(bh); | 1722 | lock_buffer(bh); |
1723 | } else if (test_set_buffer_locked(bh)) { | 1723 | } else if (!trylock_buffer(bh)) { |
1724 | redirty_page_for_writepage(wbc, page); | 1724 | redirty_page_for_writepage(wbc, page); |
1725 | continue; | 1725 | continue; |
1726 | } | 1726 | } |
@@ -3000,7 +3000,7 @@ void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]) | |||
3000 | 3000 | ||
3001 | if (rw == SWRITE || rw == SWRITE_SYNC) | 3001 | if (rw == SWRITE || rw == SWRITE_SYNC) |
3002 | lock_buffer(bh); | 3002 | lock_buffer(bh); |
3003 | else if (test_set_buffer_locked(bh)) | 3003 | else if (!trylock_buffer(bh)) |
3004 | continue; | 3004 | continue; |
3005 | 3005 | ||
3006 | if (rw == WRITE || rw == SWRITE || rw == SWRITE_SYNC) { | 3006 | if (rw == WRITE || rw == SWRITE || rw == SWRITE_SYNC) { |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 0aac824371a5..e692c42f24b5 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -1280,7 +1280,7 @@ retry: | |||
1280 | 1280 | ||
1281 | if (first < 0) | 1281 | if (first < 0) |
1282 | lock_page(page); | 1282 | lock_page(page); |
1283 | else if (TestSetPageLocked(page)) | 1283 | else if (!trylock_page(page)) |
1284 | break; | 1284 | break; |
1285 | 1285 | ||
1286 | if (unlikely(page->mapping != mapping)) { | 1286 | if (unlikely(page->mapping != mapping)) { |
diff --git a/fs/jbd/commit.c b/fs/jbd/commit.c index 2eccbfaa1d48..ae08c057e751 100644 --- a/fs/jbd/commit.c +++ b/fs/jbd/commit.c | |||
@@ -63,7 +63,7 @@ static void release_buffer_page(struct buffer_head *bh) | |||
63 | goto nope; | 63 | goto nope; |
64 | 64 | ||
65 | /* OK, it's a truncated page */ | 65 | /* OK, it's a truncated page */ |
66 | if (TestSetPageLocked(page)) | 66 | if (!trylock_page(page)) |
67 | goto nope; | 67 | goto nope; |
68 | 68 | ||
69 | page_cache_get(page); | 69 | page_cache_get(page); |
@@ -221,7 +221,7 @@ write_out_data: | |||
221 | * blocking lock_buffer(). | 221 | * blocking lock_buffer(). |
222 | */ | 222 | */ |
223 | if (buffer_dirty(bh)) { | 223 | if (buffer_dirty(bh)) { |
224 | if (test_set_buffer_locked(bh)) { | 224 | if (!trylock_buffer(bh)) { |
225 | BUFFER_TRACE(bh, "needs blocking lock"); | 225 | BUFFER_TRACE(bh, "needs blocking lock"); |
226 | spin_unlock(&journal->j_list_lock); | 226 | spin_unlock(&journal->j_list_lock); |
227 | /* Write out all data to prevent deadlocks */ | 227 | /* Write out all data to prevent deadlocks */ |
@@ -446,7 +446,7 @@ void journal_commit_transaction(journal_t *journal) | |||
446 | spin_lock(&journal->j_list_lock); | 446 | spin_lock(&journal->j_list_lock); |
447 | } | 447 | } |
448 | if (unlikely(!buffer_uptodate(bh))) { | 448 | if (unlikely(!buffer_uptodate(bh))) { |
449 | if (TestSetPageLocked(bh->b_page)) { | 449 | if (!trylock_page(bh->b_page)) { |
450 | spin_unlock(&journal->j_list_lock); | 450 | spin_unlock(&journal->j_list_lock); |
451 | lock_page(bh->b_page); | 451 | lock_page(bh->b_page); |
452 | spin_lock(&journal->j_list_lock); | 452 | spin_lock(&journal->j_list_lock); |
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index adf0395f318e..f2ad061e95ec 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c | |||
@@ -67,7 +67,7 @@ static void release_buffer_page(struct buffer_head *bh) | |||
67 | goto nope; | 67 | goto nope; |
68 | 68 | ||
69 | /* OK, it's a truncated page */ | 69 | /* OK, it's a truncated page */ |
70 | if (TestSetPageLocked(page)) | 70 | if (!trylock_page(page)) |
71 | goto nope; | 71 | goto nope; |
72 | 72 | ||
73 | page_cache_get(page); | 73 | page_cache_get(page); |
diff --git a/fs/nfs/nfsroot.c b/fs/nfs/nfsroot.c index 8478fc25daee..46763d1cd397 100644 --- a/fs/nfs/nfsroot.c +++ b/fs/nfs/nfsroot.c | |||
@@ -127,7 +127,7 @@ enum { | |||
127 | Opt_err | 127 | Opt_err |
128 | }; | 128 | }; |
129 | 129 | ||
130 | static match_table_t __initconst tokens = { | 130 | static match_table_t __initdata tokens = { |
131 | {Opt_port, "port=%u"}, | 131 | {Opt_port, "port=%u"}, |
132 | {Opt_rsize, "rsize=%u"}, | 132 | {Opt_rsize, "rsize=%u"}, |
133 | {Opt_wsize, "wsize=%u"}, | 133 | {Opt_wsize, "wsize=%u"}, |
diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c index 00e9ccde8e42..b38f944f0667 100644 --- a/fs/ntfs/aops.c +++ b/fs/ntfs/aops.c | |||
@@ -1194,7 +1194,7 @@ lock_retry_remap: | |||
1194 | tbh = bhs[i]; | 1194 | tbh = bhs[i]; |
1195 | if (!tbh) | 1195 | if (!tbh) |
1196 | continue; | 1196 | continue; |
1197 | if (unlikely(test_set_buffer_locked(tbh))) | 1197 | if (!trylock_buffer(tbh)) |
1198 | BUG(); | 1198 | BUG(); |
1199 | /* The buffer dirty state is now irrelevant, just clean it. */ | 1199 | /* The buffer dirty state is now irrelevant, just clean it. */ |
1200 | clear_buffer_dirty(tbh); | 1200 | clear_buffer_dirty(tbh); |
diff --git a/fs/ntfs/compress.c b/fs/ntfs/compress.c index 33ff314cc507..9669541d0119 100644 --- a/fs/ntfs/compress.c +++ b/fs/ntfs/compress.c | |||
@@ -665,7 +665,7 @@ lock_retry_remap: | |||
665 | for (i = 0; i < nr_bhs; i++) { | 665 | for (i = 0; i < nr_bhs; i++) { |
666 | struct buffer_head *tbh = bhs[i]; | 666 | struct buffer_head *tbh = bhs[i]; |
667 | 667 | ||
668 | if (unlikely(test_set_buffer_locked(tbh))) | 668 | if (!trylock_buffer(tbh)) |
669 | continue; | 669 | continue; |
670 | if (unlikely(buffer_uptodate(tbh))) { | 670 | if (unlikely(buffer_uptodate(tbh))) { |
671 | unlock_buffer(tbh); | 671 | unlock_buffer(tbh); |
diff --git a/fs/ntfs/mft.c b/fs/ntfs/mft.c index 790defb847e7..17d32ca6bc35 100644 --- a/fs/ntfs/mft.c +++ b/fs/ntfs/mft.c | |||
@@ -586,7 +586,7 @@ int ntfs_sync_mft_mirror(ntfs_volume *vol, const unsigned long mft_no, | |||
586 | for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) { | 586 | for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) { |
587 | struct buffer_head *tbh = bhs[i_bhs]; | 587 | struct buffer_head *tbh = bhs[i_bhs]; |
588 | 588 | ||
589 | if (unlikely(test_set_buffer_locked(tbh))) | 589 | if (!trylock_buffer(tbh)) |
590 | BUG(); | 590 | BUG(); |
591 | BUG_ON(!buffer_uptodate(tbh)); | 591 | BUG_ON(!buffer_uptodate(tbh)); |
592 | clear_buffer_dirty(tbh); | 592 | clear_buffer_dirty(tbh); |
@@ -779,7 +779,7 @@ int write_mft_record_nolock(ntfs_inode *ni, MFT_RECORD *m, int sync) | |||
779 | for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) { | 779 | for (i_bhs = 0; i_bhs < nr_bhs; i_bhs++) { |
780 | struct buffer_head *tbh = bhs[i_bhs]; | 780 | struct buffer_head *tbh = bhs[i_bhs]; |
781 | 781 | ||
782 | if (unlikely(test_set_buffer_locked(tbh))) | 782 | if (!trylock_buffer(tbh)) |
783 | BUG(); | 783 | BUG(); |
784 | BUG_ON(!buffer_uptodate(tbh)); | 784 | BUG_ON(!buffer_uptodate(tbh)); |
785 | clear_buffer_dirty(tbh); | 785 | clear_buffer_dirty(tbh); |
diff --git a/fs/omfs/inode.c b/fs/omfs/inode.c index d865f5535436..a95fe5984f4b 100644 --- a/fs/omfs/inode.c +++ b/fs/omfs/inode.c | |||
@@ -492,7 +492,8 @@ static int omfs_fill_super(struct super_block *sb, void *data, int silent) | |||
492 | if (sbi->s_num_blocks != be64_to_cpu(omfs_rb->r_num_blocks)) { | 492 | if (sbi->s_num_blocks != be64_to_cpu(omfs_rb->r_num_blocks)) { |
493 | printk(KERN_ERR "omfs: block count discrepancy between " | 493 | printk(KERN_ERR "omfs: block count discrepancy between " |
494 | "super and root blocks (%llx, %llx)\n", | 494 | "super and root blocks (%llx, %llx)\n", |
495 | sbi->s_num_blocks, be64_to_cpu(omfs_rb->r_num_blocks)); | 495 | (unsigned long long)sbi->s_num_blocks, |
496 | (unsigned long long)be64_to_cpu(omfs_rb->r_num_blocks)); | ||
496 | goto out_brelse_bh2; | 497 | goto out_brelse_bh2; |
497 | } | 498 | } |
498 | 499 | ||
diff --git a/fs/proc/base.c b/fs/proc/base.c index 01ed610f9b87..a28840b11b89 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -2423,10 +2423,13 @@ static int do_io_accounting(struct task_struct *task, char *buffer, int whole) | |||
2423 | "read_bytes: %llu\n" | 2423 | "read_bytes: %llu\n" |
2424 | "write_bytes: %llu\n" | 2424 | "write_bytes: %llu\n" |
2425 | "cancelled_write_bytes: %llu\n", | 2425 | "cancelled_write_bytes: %llu\n", |
2426 | acct.rchar, acct.wchar, | 2426 | (unsigned long long)acct.rchar, |
2427 | acct.syscr, acct.syscw, | 2427 | (unsigned long long)acct.wchar, |
2428 | acct.read_bytes, acct.write_bytes, | 2428 | (unsigned long long)acct.syscr, |
2429 | acct.cancelled_write_bytes); | 2429 | (unsigned long long)acct.syscw, |
2430 | (unsigned long long)acct.read_bytes, | ||
2431 | (unsigned long long)acct.write_bytes, | ||
2432 | (unsigned long long)acct.cancelled_write_bytes); | ||
2430 | } | 2433 | } |
2431 | 2434 | ||
2432 | static int proc_tid_io_accounting(struct task_struct *task, char *buffer) | 2435 | static int proc_tid_io_accounting(struct task_struct *task, char *buffer) |
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 192269698a8a..5699171212ae 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
@@ -2435,7 +2435,7 @@ static int reiserfs_write_full_page(struct page *page, | |||
2435 | if (wbc->sync_mode != WB_SYNC_NONE || !wbc->nonblocking) { | 2435 | if (wbc->sync_mode != WB_SYNC_NONE || !wbc->nonblocking) { |
2436 | lock_buffer(bh); | 2436 | lock_buffer(bh); |
2437 | } else { | 2437 | } else { |
2438 | if (test_set_buffer_locked(bh)) { | 2438 | if (!trylock_buffer(bh)) { |
2439 | redirty_page_for_writepage(wbc, page); | 2439 | redirty_page_for_writepage(wbc, page); |
2440 | continue; | 2440 | continue; |
2441 | } | 2441 | } |
diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index c8f60ee183b5..c21df71943a6 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c | |||
@@ -627,7 +627,7 @@ static int journal_list_still_alive(struct super_block *s, | |||
627 | static void release_buffer_page(struct buffer_head *bh) | 627 | static void release_buffer_page(struct buffer_head *bh) |
628 | { | 628 | { |
629 | struct page *page = bh->b_page; | 629 | struct page *page = bh->b_page; |
630 | if (!page->mapping && !TestSetPageLocked(page)) { | 630 | if (!page->mapping && trylock_page(page)) { |
631 | page_cache_get(page); | 631 | page_cache_get(page); |
632 | put_bh(bh); | 632 | put_bh(bh); |
633 | if (!page->mapping) | 633 | if (!page->mapping) |
@@ -855,7 +855,7 @@ static int write_ordered_buffers(spinlock_t * lock, | |||
855 | jh = JH_ENTRY(list->next); | 855 | jh = JH_ENTRY(list->next); |
856 | bh = jh->bh; | 856 | bh = jh->bh; |
857 | get_bh(bh); | 857 | get_bh(bh); |
858 | if (test_set_buffer_locked(bh)) { | 858 | if (!trylock_buffer(bh)) { |
859 | if (!buffer_dirty(bh)) { | 859 | if (!buffer_dirty(bh)) { |
860 | list_move(&jh->list, &tmp); | 860 | list_move(&jh->list, &tmp); |
861 | goto loop_next; | 861 | goto loop_next; |
@@ -3871,7 +3871,7 @@ int reiserfs_prepare_for_journal(struct super_block *p_s_sb, | |||
3871 | { | 3871 | { |
3872 | PROC_INFO_INC(p_s_sb, journal.prepare); | 3872 | PROC_INFO_INC(p_s_sb, journal.prepare); |
3873 | 3873 | ||
3874 | if (test_set_buffer_locked(bh)) { | 3874 | if (!trylock_buffer(bh)) { |
3875 | if (!wait) | 3875 | if (!wait) |
3876 | return 0; | 3876 | return 0; |
3877 | lock_buffer(bh); | 3877 | lock_buffer(bh); |
diff --git a/fs/splice.c b/fs/splice.c index b30311ba8af6..1bbc6f4bb09c 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -371,7 +371,7 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
371 | * for an in-flight io page | 371 | * for an in-flight io page |
372 | */ | 372 | */ |
373 | if (flags & SPLICE_F_NONBLOCK) { | 373 | if (flags & SPLICE_F_NONBLOCK) { |
374 | if (TestSetPageLocked(page)) { | 374 | if (!trylock_page(page)) { |
375 | error = -EAGAIN; | 375 | error = -EAGAIN; |
376 | break; | 376 | break; |
377 | } | 377 | } |
diff --git a/fs/ufs/super.c b/fs/ufs/super.c index 3e30e40aa24d..3141969b456d 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c | |||
@@ -1233,7 +1233,7 @@ static int ufs_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
1233 | { | 1233 | { |
1234 | struct ufs_sb_info *sbi = UFS_SB(vfs->mnt_sb); | 1234 | struct ufs_sb_info *sbi = UFS_SB(vfs->mnt_sb); |
1235 | unsigned mval = sbi->s_mount_opt & UFS_MOUNT_UFSTYPE; | 1235 | unsigned mval = sbi->s_mount_opt & UFS_MOUNT_UFSTYPE; |
1236 | const struct match_token *tp = tokens; | 1236 | struct match_token *tp = tokens; |
1237 | 1237 | ||
1238 | while (tp->token != Opt_onerror_panic && tp->token != mval) | 1238 | while (tp->token != Opt_onerror_panic && tp->token != mval) |
1239 | ++tp; | 1239 | ++tp; |
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 0b211cba1909..fa47e43b8b41 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
@@ -675,7 +675,7 @@ xfs_probe_cluster( | |||
675 | } else | 675 | } else |
676 | pg_offset = PAGE_CACHE_SIZE; | 676 | pg_offset = PAGE_CACHE_SIZE; |
677 | 677 | ||
678 | if (page->index == tindex && !TestSetPageLocked(page)) { | 678 | if (page->index == tindex && trylock_page(page)) { |
679 | pg_len = xfs_probe_page(page, pg_offset, mapped); | 679 | pg_len = xfs_probe_page(page, pg_offset, mapped); |
680 | unlock_page(page); | 680 | unlock_page(page); |
681 | } | 681 | } |
@@ -759,7 +759,7 @@ xfs_convert_page( | |||
759 | 759 | ||
760 | if (page->index != tindex) | 760 | if (page->index != tindex) |
761 | goto fail; | 761 | goto fail; |
762 | if (TestSetPageLocked(page)) | 762 | if (!trylock_page(page)) |
763 | goto fail; | 763 | goto fail; |
764 | if (PageWriteback(page)) | 764 | if (PageWriteback(page)) |
765 | goto fail_unlock_page; | 765 | goto fail_unlock_page; |
@@ -1104,7 +1104,7 @@ xfs_page_state_convert( | |||
1104 | * that we are writing into for the first time. | 1104 | * that we are writing into for the first time. |
1105 | */ | 1105 | */ |
1106 | type = IOMAP_NEW; | 1106 | type = IOMAP_NEW; |
1107 | if (!test_and_set_bit(BH_Lock, &bh->b_state)) { | 1107 | if (trylock_buffer(bh)) { |
1108 | ASSERT(buffer_mapped(bh)); | 1108 | ASSERT(buffer_mapped(bh)); |
1109 | if (iomap_valid) | 1109 | if (iomap_valid) |
1110 | all_bh = 1; | 1110 | all_bh = 1; |
diff --git a/include/asm-m68k/contregs.h b/include/asm-m68k/contregs.h index 1e233e7d191e..d1ea750bddfe 100644 --- a/include/asm-m68k/contregs.h +++ b/include/asm-m68k/contregs.h | |||
@@ -1,4 +1,53 @@ | |||
1 | #ifndef _M68K_CONTREGS_H | 1 | #ifndef _M68K_CONTREGS_H |
2 | #define _M68K_CONTREGS_H | 2 | #define _M68K_CONTREGS_H |
3 | #include <asm-sparc/contregs.h> | 3 | |
4 | /* contregs.h: Addresses of registers in the ASI_CONTROL alternate address | ||
5 | * space. These are for the mmu's context register, etc. | ||
6 | * | ||
7 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | ||
8 | */ | ||
9 | |||
10 | /* 3=sun3 | ||
11 | 4=sun4 (as in sun4 sysmaint student book) | ||
12 | c=sun4c (according to davem) */ | ||
13 | |||
14 | #define AC_IDPROM 0x00000000 /* 34 ID PROM, R/O, byte, 32 bytes */ | ||
15 | #define AC_PAGEMAP 0x10000000 /* 3 Pagemap R/W, long */ | ||
16 | #define AC_SEGMAP 0x20000000 /* 3 Segment map, byte */ | ||
17 | #define AC_CONTEXT 0x30000000 /* 34c current mmu-context */ | ||
18 | #define AC_SENABLE 0x40000000 /* 34c system dvma/cache/reset enable reg*/ | ||
19 | #define AC_UDVMA_ENB 0x50000000 /* 34 Not used on Sun boards, byte */ | ||
20 | #define AC_BUS_ERROR 0x60000000 /* 34 Not cleared on read, byte. */ | ||
21 | #define AC_SYNC_ERR 0x60000000 /* c fault type */ | ||
22 | #define AC_SYNC_VA 0x60000004 /* c fault virtual address */ | ||
23 | #define AC_ASYNC_ERR 0x60000008 /* c asynchronous fault type */ | ||
24 | #define AC_ASYNC_VA 0x6000000c /* c async fault virtual address */ | ||
25 | #define AC_LEDS 0x70000000 /* 34 Zero turns on LEDs, byte */ | ||
26 | #define AC_CACHETAGS 0x80000000 /* 34c direct access to the VAC tags */ | ||
27 | #define AC_CACHEDDATA 0x90000000 /* 3 c direct access to the VAC data */ | ||
28 | #define AC_UDVMA_MAP 0xD0000000 /* 4 Not used on Sun boards, byte */ | ||
29 | #define AC_VME_VECTOR 0xE0000000 /* 4 For non-Autovector VME, byte */ | ||
30 | #define AC_BOOT_SCC 0xF0000000 /* 34 bypass to access Zilog 8530. byte.*/ | ||
31 | |||
32 | /* s=Swift, h=Ross_HyperSPARC, v=TI_Viking, t=Tsunami, r=Ross_Cypress */ | ||
33 | #define AC_M_PCR 0x0000 /* shv Processor Control Reg */ | ||
34 | #define AC_M_CTPR 0x0100 /* shv Context Table Pointer Reg */ | ||
35 | #define AC_M_CXR 0x0200 /* shv Context Register */ | ||
36 | #define AC_M_SFSR 0x0300 /* shv Synchronous Fault Status Reg */ | ||
37 | #define AC_M_SFAR 0x0400 /* shv Synchronous Fault Address Reg */ | ||
38 | #define AC_M_AFSR 0x0500 /* hv Asynchronous Fault Status Reg */ | ||
39 | #define AC_M_AFAR 0x0600 /* hv Asynchronous Fault Address Reg */ | ||
40 | #define AC_M_RESET 0x0700 /* hv Reset Reg */ | ||
41 | #define AC_M_RPR 0x1000 /* hv Root Pointer Reg */ | ||
42 | #define AC_M_TSUTRCR 0x1000 /* s TLB Replacement Ctrl Reg */ | ||
43 | #define AC_M_IAPTP 0x1100 /* hv Instruction Access PTP */ | ||
44 | #define AC_M_DAPTP 0x1200 /* hv Data Access PTP */ | ||
45 | #define AC_M_ITR 0x1300 /* hv Index Tag Register */ | ||
46 | #define AC_M_TRCR 0x1400 /* hv TLB Replacement Control Reg */ | ||
47 | #define AC_M_SFSRX 0x1300 /* s Synch Fault Status Reg prim */ | ||
48 | #define AC_M_SFARX 0x1400 /* s Synch Fault Address Reg prim */ | ||
49 | #define AC_M_RPR1 0x1500 /* h Root Pointer Reg (entry 2) */ | ||
50 | #define AC_M_IAPTP1 0x1600 /* h Instruction Access PTP (entry 2) */ | ||
51 | #define AC_M_DAPTP1 0x1700 /* h Data Access PTP (entry 2) */ | ||
52 | |||
4 | #endif /* _M68K_CONTREGS_H */ | 53 | #endif /* _M68K_CONTREGS_H */ |
diff --git a/include/asm-m68k/fbio.h b/include/asm-m68k/fbio.h index c17edf8c7bc4..b9215a0907d3 100644 --- a/include/asm-m68k/fbio.h +++ b/include/asm-m68k/fbio.h | |||
@@ -1 +1,330 @@ | |||
1 | #include <asm-sparc/fbio.h> | 1 | #ifndef __LINUX_FBIO_H |
2 | #define __LINUX_FBIO_H | ||
3 | |||
4 | #include <linux/compiler.h> | ||
5 | #include <linux/types.h> | ||
6 | |||
7 | /* Constants used for fbio SunOS compatibility */ | ||
8 | /* (C) 1996 Miguel de Icaza */ | ||
9 | |||
10 | /* Frame buffer types */ | ||
11 | #define FBTYPE_NOTYPE -1 | ||
12 | #define FBTYPE_SUN1BW 0 /* mono */ | ||
13 | #define FBTYPE_SUN1COLOR 1 | ||
14 | #define FBTYPE_SUN2BW 2 | ||
15 | #define FBTYPE_SUN2COLOR 3 | ||
16 | #define FBTYPE_SUN2GP 4 | ||
17 | #define FBTYPE_SUN5COLOR 5 | ||
18 | #define FBTYPE_SUN3COLOR 6 | ||
19 | #define FBTYPE_MEMCOLOR 7 | ||
20 | #define FBTYPE_SUN4COLOR 8 | ||
21 | |||
22 | #define FBTYPE_NOTSUN1 9 | ||
23 | #define FBTYPE_NOTSUN2 10 | ||
24 | #define FBTYPE_NOTSUN3 11 | ||
25 | |||
26 | #define FBTYPE_SUNFAST_COLOR 12 /* cg6 */ | ||
27 | #define FBTYPE_SUNROP_COLOR 13 | ||
28 | #define FBTYPE_SUNFB_VIDEO 14 | ||
29 | #define FBTYPE_SUNGIFB 15 | ||
30 | #define FBTYPE_SUNGPLAS 16 | ||
31 | #define FBTYPE_SUNGP3 17 | ||
32 | #define FBTYPE_SUNGT 18 | ||
33 | #define FBTYPE_SUNLEO 19 /* zx Leo card */ | ||
34 | #define FBTYPE_MDICOLOR 20 /* cg14 */ | ||
35 | #define FBTYPE_TCXCOLOR 21 /* SUNW,tcx card */ | ||
36 | |||
37 | #define FBTYPE_LASTPLUSONE 21 /* This is not last + 1 in fact... */ | ||
38 | |||
39 | /* Does not seem to be listed in the Sun file either */ | ||
40 | #define FBTYPE_CREATOR 22 | ||
41 | #define FBTYPE_PCI_IGA1682 23 | ||
42 | #define FBTYPE_P9100COLOR 24 | ||
43 | |||
44 | #define FBTYPE_PCI_GENERIC 1000 | ||
45 | #define FBTYPE_PCI_MACH64 1001 | ||
46 | |||
47 | /* fbio ioctls */ | ||
48 | /* Returned by FBIOGTYPE */ | ||
49 | struct fbtype { | ||
50 | int fb_type; /* fb type, see above */ | ||
51 | int fb_height; /* pixels */ | ||
52 | int fb_width; /* pixels */ | ||
53 | int fb_depth; | ||
54 | int fb_cmsize; /* color map entries */ | ||
55 | int fb_size; /* fb size in bytes */ | ||
56 | }; | ||
57 | #define FBIOGTYPE _IOR('F', 0, struct fbtype) | ||
58 | |||
59 | struct fbcmap { | ||
60 | int index; /* first element (0 origin) */ | ||
61 | int count; | ||
62 | unsigned char __user *red; | ||
63 | unsigned char __user *green; | ||
64 | unsigned char __user *blue; | ||
65 | }; | ||
66 | |||
67 | #ifdef __KERNEL__ | ||
68 | #define FBIOPUTCMAP_SPARC _IOW('F', 3, struct fbcmap) | ||
69 | #define FBIOGETCMAP_SPARC _IOW('F', 4, struct fbcmap) | ||
70 | #else | ||
71 | #define FBIOPUTCMAP _IOW('F', 3, struct fbcmap) | ||
72 | #define FBIOGETCMAP _IOW('F', 4, struct fbcmap) | ||
73 | #endif | ||
74 | |||
75 | /* # of device specific values */ | ||
76 | #define FB_ATTR_NDEVSPECIFIC 8 | ||
77 | /* # of possible emulations */ | ||
78 | #define FB_ATTR_NEMUTYPES 4 | ||
79 | |||
80 | struct fbsattr { | ||
81 | int flags; | ||
82 | int emu_type; /* -1 if none */ | ||
83 | int dev_specific[FB_ATTR_NDEVSPECIFIC]; | ||
84 | }; | ||
85 | |||
86 | struct fbgattr { | ||
87 | int real_type; /* real frame buffer type */ | ||
88 | int owner; /* unknown */ | ||
89 | struct fbtype fbtype; /* real frame buffer fbtype */ | ||
90 | struct fbsattr sattr; | ||
91 | int emu_types[FB_ATTR_NEMUTYPES]; /* supported emulations */ | ||
92 | }; | ||
93 | #define FBIOSATTR _IOW('F', 5, struct fbgattr) /* Unsupported: */ | ||
94 | #define FBIOGATTR _IOR('F', 6, struct fbgattr) /* supported */ | ||
95 | |||
96 | #define FBIOSVIDEO _IOW('F', 7, int) | ||
97 | #define FBIOGVIDEO _IOR('F', 8, int) | ||
98 | |||
99 | struct fbcursor { | ||
100 | short set; /* what to set, choose from the list above */ | ||
101 | short enable; /* cursor on/off */ | ||
102 | struct fbcurpos pos; /* cursor position */ | ||
103 | struct fbcurpos hot; /* cursor hot spot */ | ||
104 | struct fbcmap cmap; /* color map info */ | ||
105 | struct fbcurpos size; /* cursor bit map size */ | ||
106 | char __user *image; /* cursor image bits */ | ||
107 | char __user *mask; /* cursor mask bits */ | ||
108 | }; | ||
109 | |||
110 | /* set/get cursor attributes/shape */ | ||
111 | #define FBIOSCURSOR _IOW('F', 24, struct fbcursor) | ||
112 | #define FBIOGCURSOR _IOWR('F', 25, struct fbcursor) | ||
113 | |||
114 | /* set/get cursor position */ | ||
115 | #define FBIOSCURPOS _IOW('F', 26, struct fbcurpos) | ||
116 | #define FBIOGCURPOS _IOW('F', 27, struct fbcurpos) | ||
117 | |||
118 | /* get max cursor size */ | ||
119 | #define FBIOGCURMAX _IOR('F', 28, struct fbcurpos) | ||
120 | |||
121 | /* wid manipulation */ | ||
122 | struct fb_wid_alloc { | ||
123 | #define FB_WID_SHARED_8 0 | ||
124 | #define FB_WID_SHARED_24 1 | ||
125 | #define FB_WID_DBL_8 2 | ||
126 | #define FB_WID_DBL_24 3 | ||
127 | __u32 wa_type; | ||
128 | __s32 wa_index; /* Set on return */ | ||
129 | __u32 wa_count; | ||
130 | }; | ||
131 | struct fb_wid_item { | ||
132 | __u32 wi_type; | ||
133 | __s32 wi_index; | ||
134 | __u32 wi_attrs; | ||
135 | __u32 wi_values[32]; | ||
136 | }; | ||
137 | struct fb_wid_list { | ||
138 | __u32 wl_flags; | ||
139 | __u32 wl_count; | ||
140 | struct fb_wid_item *wl_list; | ||
141 | }; | ||
142 | |||
143 | #define FBIO_WID_ALLOC _IOWR('F', 30, struct fb_wid_alloc) | ||
144 | #define FBIO_WID_FREE _IOW('F', 31, struct fb_wid_alloc) | ||
145 | #define FBIO_WID_PUT _IOW('F', 32, struct fb_wid_list) | ||
146 | #define FBIO_WID_GET _IOWR('F', 33, struct fb_wid_list) | ||
147 | |||
148 | /* Creator ioctls */ | ||
149 | #define FFB_IOCTL ('F'<<8) | ||
150 | #define FFB_SYS_INFO (FFB_IOCTL|80) | ||
151 | #define FFB_CLUTREAD (FFB_IOCTL|81) | ||
152 | #define FFB_CLUTPOST (FFB_IOCTL|82) | ||
153 | #define FFB_SETDIAGMODE (FFB_IOCTL|83) | ||
154 | #define FFB_GETMONITORID (FFB_IOCTL|84) | ||
155 | #define FFB_GETVIDEOMODE (FFB_IOCTL|85) | ||
156 | #define FFB_SETVIDEOMODE (FFB_IOCTL|86) | ||
157 | #define FFB_SETSERVER (FFB_IOCTL|87) | ||
158 | #define FFB_SETOVCTL (FFB_IOCTL|88) | ||
159 | #define FFB_GETOVCTL (FFB_IOCTL|89) | ||
160 | #define FFB_GETSAXNUM (FFB_IOCTL|90) | ||
161 | #define FFB_FBDEBUG (FFB_IOCTL|91) | ||
162 | |||
163 | /* Cg14 ioctls */ | ||
164 | #define MDI_IOCTL ('M'<<8) | ||
165 | #define MDI_RESET (MDI_IOCTL|1) | ||
166 | #define MDI_GET_CFGINFO (MDI_IOCTL|2) | ||
167 | #define MDI_SET_PIXELMODE (MDI_IOCTL|3) | ||
168 | # define MDI_32_PIX 32 | ||
169 | # define MDI_16_PIX 16 | ||
170 | # define MDI_8_PIX 8 | ||
171 | |||
172 | struct mdi_cfginfo { | ||
173 | int mdi_ncluts; /* Number of implemented CLUTs in this MDI */ | ||
174 | int mdi_type; /* FBTYPE name */ | ||
175 | int mdi_height; /* height */ | ||
176 | int mdi_width; /* widht */ | ||
177 | int mdi_size; /* available ram */ | ||
178 | int mdi_mode; /* 8bpp, 16bpp or 32bpp */ | ||
179 | int mdi_pixfreq; /* pixel clock (from PROM) */ | ||
180 | }; | ||
181 | |||
182 | /* SparcLinux specific ioctl for the MDI, should be replaced for | ||
183 | * the SET_XLUT/SET_CLUTn ioctls instead | ||
184 | */ | ||
185 | #define MDI_CLEAR_XLUT (MDI_IOCTL|9) | ||
186 | |||
187 | /* leo & ffb ioctls */ | ||
188 | struct fb_clut_alloc { | ||
189 | __u32 clutid; /* Set on return */ | ||
190 | __u32 flag; | ||
191 | __u32 index; | ||
192 | }; | ||
193 | |||
194 | struct fb_clut { | ||
195 | #define FB_CLUT_WAIT 0x00000001 /* Not yet implemented */ | ||
196 | __u32 flag; | ||
197 | __u32 clutid; | ||
198 | __u32 offset; | ||
199 | __u32 count; | ||
200 | char * red; | ||
201 | char * green; | ||
202 | char * blue; | ||
203 | }; | ||
204 | |||
205 | struct fb_clut32 { | ||
206 | __u32 flag; | ||
207 | __u32 clutid; | ||
208 | __u32 offset; | ||
209 | __u32 count; | ||
210 | __u32 red; | ||
211 | __u32 green; | ||
212 | __u32 blue; | ||
213 | }; | ||
214 | |||
215 | #define LEO_CLUTALLOC _IOWR('L', 53, struct fb_clut_alloc) | ||
216 | #define LEO_CLUTFREE _IOW('L', 54, struct fb_clut_alloc) | ||
217 | #define LEO_CLUTREAD _IOW('L', 55, struct fb_clut) | ||
218 | #define LEO_CLUTPOST _IOW('L', 56, struct fb_clut) | ||
219 | #define LEO_SETGAMMA _IOW('L', 68, int) /* Not yet implemented */ | ||
220 | #define LEO_GETGAMMA _IOR('L', 69, int) /* Not yet implemented */ | ||
221 | |||
222 | #ifdef __KERNEL__ | ||
223 | /* Addresses on the fd of a cgsix that are mappable */ | ||
224 | #define CG6_FBC 0x70000000 | ||
225 | #define CG6_TEC 0x70001000 | ||
226 | #define CG6_BTREGS 0x70002000 | ||
227 | #define CG6_FHC 0x70004000 | ||
228 | #define CG6_THC 0x70005000 | ||
229 | #define CG6_ROM 0x70006000 | ||
230 | #define CG6_RAM 0x70016000 | ||
231 | #define CG6_DHC 0x80000000 | ||
232 | |||
233 | #define CG3_MMAP_OFFSET 0x4000000 | ||
234 | |||
235 | /* Addresses on the fd of a tcx that are mappable */ | ||
236 | #define TCX_RAM8BIT 0x00000000 | ||
237 | #define TCX_RAM24BIT 0x01000000 | ||
238 | #define TCX_UNK3 0x10000000 | ||
239 | #define TCX_UNK4 0x20000000 | ||
240 | #define TCX_CONTROLPLANE 0x28000000 | ||
241 | #define TCX_UNK6 0x30000000 | ||
242 | #define TCX_UNK7 0x38000000 | ||
243 | #define TCX_TEC 0x70000000 | ||
244 | #define TCX_BTREGS 0x70002000 | ||
245 | #define TCX_THC 0x70004000 | ||
246 | #define TCX_DHC 0x70008000 | ||
247 | #define TCX_ALT 0x7000a000 | ||
248 | #define TCX_SYNC 0x7000e000 | ||
249 | #define TCX_UNK2 0x70010000 | ||
250 | |||
251 | /* CG14 definitions */ | ||
252 | |||
253 | /* Offsets into the OBIO space: */ | ||
254 | #define CG14_REGS 0 /* registers */ | ||
255 | #define CG14_CURSORREGS 0x1000 /* cursor registers */ | ||
256 | #define CG14_DACREGS 0x2000 /* DAC registers */ | ||
257 | #define CG14_XLUT 0x3000 /* X Look Up Table -- ??? */ | ||
258 | #define CG14_CLUT1 0x4000 /* Color Look Up Table */ | ||
259 | #define CG14_CLUT2 0x5000 /* Color Look Up Table */ | ||
260 | #define CG14_CLUT3 0x6000 /* Color Look Up Table */ | ||
261 | #define CG14_AUTO 0xf000 | ||
262 | |||
263 | #endif /* KERNEL */ | ||
264 | |||
265 | /* These are exported to userland for applications to use */ | ||
266 | /* Mappable offsets for the cg14: control registers */ | ||
267 | #define MDI_DIRECT_MAP 0x10000000 | ||
268 | #define MDI_CTLREG_MAP 0x20000000 | ||
269 | #define MDI_CURSOR_MAP 0x30000000 | ||
270 | #define MDI_SHDW_VRT_MAP 0x40000000 | ||
271 | |||
272 | /* Mappable offsets for the cg14: frame buffer resolutions */ | ||
273 | /* 32 bits */ | ||
274 | #define MDI_CHUNKY_XBGR_MAP 0x50000000 | ||
275 | #define MDI_CHUNKY_BGR_MAP 0x60000000 | ||
276 | |||
277 | /* 16 bits */ | ||
278 | #define MDI_PLANAR_X16_MAP 0x70000000 | ||
279 | #define MDI_PLANAR_C16_MAP 0x80000000 | ||
280 | |||
281 | /* 8 bit is done as CG3 MMAP offset */ | ||
282 | /* 32 bits, planar */ | ||
283 | #define MDI_PLANAR_X32_MAP 0x90000000 | ||
284 | #define MDI_PLANAR_B32_MAP 0xa0000000 | ||
285 | #define MDI_PLANAR_G32_MAP 0xb0000000 | ||
286 | #define MDI_PLANAR_R32_MAP 0xc0000000 | ||
287 | |||
288 | /* Mappable offsets on leo */ | ||
289 | #define LEO_SS0_MAP 0x00000000 | ||
290 | #define LEO_LC_SS0_USR_MAP 0x00800000 | ||
291 | #define LEO_LD_SS0_MAP 0x00801000 | ||
292 | #define LEO_LX_CURSOR_MAP 0x00802000 | ||
293 | #define LEO_SS1_MAP 0x00803000 | ||
294 | #define LEO_LC_SS1_USR_MAP 0x01003000 | ||
295 | #define LEO_LD_SS1_MAP 0x01004000 | ||
296 | #define LEO_UNK_MAP 0x01005000 | ||
297 | #define LEO_LX_KRN_MAP 0x01006000 | ||
298 | #define LEO_LC_SS0_KRN_MAP 0x01007000 | ||
299 | #define LEO_LC_SS1_KRN_MAP 0x01008000 | ||
300 | #define LEO_LD_GBL_MAP 0x01009000 | ||
301 | #define LEO_UNK2_MAP 0x0100a000 | ||
302 | |||
303 | #ifdef __KERNEL__ | ||
304 | struct fbcmap32 { | ||
305 | int index; /* first element (0 origin) */ | ||
306 | int count; | ||
307 | u32 red; | ||
308 | u32 green; | ||
309 | u32 blue; | ||
310 | }; | ||
311 | |||
312 | #define FBIOPUTCMAP32 _IOW('F', 3, struct fbcmap32) | ||
313 | #define FBIOGETCMAP32 _IOW('F', 4, struct fbcmap32) | ||
314 | |||
315 | struct fbcursor32 { | ||
316 | short set; /* what to set, choose from the list above */ | ||
317 | short enable; /* cursor on/off */ | ||
318 | struct fbcurpos pos; /* cursor position */ | ||
319 | struct fbcurpos hot; /* cursor hot spot */ | ||
320 | struct fbcmap32 cmap; /* color map info */ | ||
321 | struct fbcurpos size; /* cursor bit map size */ | ||
322 | u32 image; /* cursor image bits */ | ||
323 | u32 mask; /* cursor mask bits */ | ||
324 | }; | ||
325 | |||
326 | #define FBIOSCURSOR32 _IOW('F', 24, struct fbcursor32) | ||
327 | #define FBIOGCURSOR32 _IOW('F', 25, struct fbcursor32) | ||
328 | #endif | ||
329 | |||
330 | #endif /* __LINUX_FBIO_H */ | ||
diff --git a/include/asm-m68k/idprom.h b/include/asm-m68k/idprom.h index 4349eaf3cfe4..160616a89e05 100644 --- a/include/asm-m68k/idprom.h +++ b/include/asm-m68k/idprom.h | |||
@@ -1,6 +1,25 @@ | |||
1 | #ifndef _M68K_IDPROM_H | 1 | #ifndef _M68K_IDPROM_H |
2 | #define _M68K_IDPROM_H | 2 | #define _M68K_IDPROM_H |
3 | #include <asm-sparc/idprom.h> | 3 | /* |
4 | * idprom.h: Macros and defines for idprom routines | ||
5 | * | ||
6 | * Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu) | ||
7 | */ | ||
8 | |||
9 | #include <linux/types.h> | ||
10 | |||
11 | struct idprom { | ||
12 | u8 id_format; /* Format identifier (always 0x01) */ | ||
13 | u8 id_machtype; /* Machine type */ | ||
14 | u8 id_ethaddr[6]; /* Hardware ethernet address */ | ||
15 | s32 id_date; /* Date of manufacture */ | ||
16 | u32 id_sernum:24; /* Unique serial number */ | ||
17 | u8 id_cksum; /* Checksum - xor of the data bytes */ | ||
18 | u8 reserved[16]; | ||
19 | }; | ||
20 | |||
21 | extern struct idprom *idprom; | ||
22 | extern void idprom_init(void); | ||
4 | 23 | ||
5 | /* Sun3: in control space */ | 24 | /* Sun3: in control space */ |
6 | #define SUN3_IDPROM_BASE 0x00000000 | 25 | #define SUN3_IDPROM_BASE 0x00000000 |
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 50cfe8ceb478..eadaab44015f 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h | |||
@@ -115,7 +115,6 @@ BUFFER_FNS(Uptodate, uptodate) | |||
115 | BUFFER_FNS(Dirty, dirty) | 115 | BUFFER_FNS(Dirty, dirty) |
116 | TAS_BUFFER_FNS(Dirty, dirty) | 116 | TAS_BUFFER_FNS(Dirty, dirty) |
117 | BUFFER_FNS(Lock, locked) | 117 | BUFFER_FNS(Lock, locked) |
118 | TAS_BUFFER_FNS(Lock, locked) | ||
119 | BUFFER_FNS(Req, req) | 118 | BUFFER_FNS(Req, req) |
120 | TAS_BUFFER_FNS(Req, req) | 119 | TAS_BUFFER_FNS(Req, req) |
121 | BUFFER_FNS(Mapped, mapped) | 120 | BUFFER_FNS(Mapped, mapped) |
@@ -321,10 +320,15 @@ static inline void wait_on_buffer(struct buffer_head *bh) | |||
321 | __wait_on_buffer(bh); | 320 | __wait_on_buffer(bh); |
322 | } | 321 | } |
323 | 322 | ||
323 | static inline int trylock_buffer(struct buffer_head *bh) | ||
324 | { | ||
325 | return likely(!test_and_set_bit(BH_Lock, &bh->b_state)); | ||
326 | } | ||
327 | |||
324 | static inline void lock_buffer(struct buffer_head *bh) | 328 | static inline void lock_buffer(struct buffer_head *bh) |
325 | { | 329 | { |
326 | might_sleep(); | 330 | might_sleep(); |
327 | if (test_set_buffer_locked(bh)) | 331 | if (!trylock_buffer(bh)) |
328 | __lock_buffer(bh); | 332 | __lock_buffer(bh); |
329 | } | 333 | } |
330 | 334 | ||
diff --git a/include/linux/ide.h b/include/linux/ide.h index b846bc44a27e..87c12ed96954 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -219,18 +219,7 @@ static inline int __ide_default_irq(unsigned long base) | |||
219 | #include <asm-generic/ide_iops.h> | 219 | #include <asm-generic/ide_iops.h> |
220 | #endif | 220 | #endif |
221 | 221 | ||
222 | #ifndef MAX_HWIFS | 222 | #define MAX_HWIFS 10 |
223 | #if defined(CONFIG_BLACKFIN) || defined(CONFIG_H8300) || defined(CONFIG_XTENSA) | ||
224 | # define MAX_HWIFS 1 | ||
225 | #else | ||
226 | # define MAX_HWIFS 10 | ||
227 | #endif | ||
228 | #endif | ||
229 | |||
230 | #if !defined(MAX_HWIFS) || defined(CONFIG_EMBEDDED) | ||
231 | #undef MAX_HWIFS | ||
232 | #define MAX_HWIFS CONFIG_IDE_MAX_HWIFS | ||
233 | #endif | ||
234 | 223 | ||
235 | /* Currently only m68k, apus and m8xx need it */ | 224 | /* Currently only m68k, apus and m8xx need it */ |
236 | #ifndef IDE_ARCH_ACK_INTR | 225 | #ifndef IDE_ARCH_ACK_INTR |
@@ -509,24 +498,33 @@ struct ide_tp_ops { | |||
509 | 498 | ||
510 | extern const struct ide_tp_ops default_tp_ops; | 499 | extern const struct ide_tp_ops default_tp_ops; |
511 | 500 | ||
501 | /** | ||
502 | * struct ide_port_ops - IDE port operations | ||
503 | * | ||
504 | * @init_dev: host specific initialization of a device | ||
505 | * @set_pio_mode: routine to program host for PIO mode | ||
506 | * @set_dma_mode: routine to program host for DMA mode | ||
507 | * @selectproc: tweaks hardware to select drive | ||
508 | * @reset_poll: chipset polling based on hba specifics | ||
509 | * @pre_reset: chipset specific changes to default for device-hba resets | ||
510 | * @resetproc: routine to reset controller after a disk reset | ||
511 | * @maskproc: special host masking for drive selection | ||
512 | * @quirkproc: check host's drive quirk list | ||
513 | * | ||
514 | * @mdma_filter: filter MDMA modes | ||
515 | * @udma_filter: filter UDMA modes | ||
516 | * | ||
517 | * @cable_detect: detect cable type | ||
518 | */ | ||
512 | struct ide_port_ops { | 519 | struct ide_port_ops { |
513 | /* host specific initialization of a device */ | ||
514 | void (*init_dev)(ide_drive_t *); | 520 | void (*init_dev)(ide_drive_t *); |
515 | /* routine to program host for PIO mode */ | ||
516 | void (*set_pio_mode)(ide_drive_t *, const u8); | 521 | void (*set_pio_mode)(ide_drive_t *, const u8); |
517 | /* routine to program host for DMA mode */ | ||
518 | void (*set_dma_mode)(ide_drive_t *, const u8); | 522 | void (*set_dma_mode)(ide_drive_t *, const u8); |
519 | /* tweaks hardware to select drive */ | ||
520 | void (*selectproc)(ide_drive_t *); | 523 | void (*selectproc)(ide_drive_t *); |
521 | /* chipset polling based on hba specifics */ | ||
522 | int (*reset_poll)(ide_drive_t *); | 524 | int (*reset_poll)(ide_drive_t *); |
523 | /* chipset specific changes to default for device-hba resets */ | ||
524 | void (*pre_reset)(ide_drive_t *); | 525 | void (*pre_reset)(ide_drive_t *); |
525 | /* routine to reset controller after a disk reset */ | ||
526 | void (*resetproc)(ide_drive_t *); | 526 | void (*resetproc)(ide_drive_t *); |
527 | /* special host masking for drive selection */ | ||
528 | void (*maskproc)(ide_drive_t *, int); | 527 | void (*maskproc)(ide_drive_t *, int); |
529 | /* check host's drive quirk list */ | ||
530 | void (*quirkproc)(ide_drive_t *); | 528 | void (*quirkproc)(ide_drive_t *); |
531 | 529 | ||
532 | u8 (*mdma_filter)(ide_drive_t *); | 530 | u8 (*mdma_filter)(ide_drive_t *); |
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index a1630ba0b87c..7f4df7c7659d 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
@@ -506,6 +506,19 @@ struct ieee80211_channel_sw_ie { | |||
506 | u8 count; | 506 | u8 count; |
507 | } __attribute__ ((packed)); | 507 | } __attribute__ ((packed)); |
508 | 508 | ||
509 | /** | ||
510 | * struct ieee80211_tim | ||
511 | * | ||
512 | * This structure refers to "Traffic Indication Map information element" | ||
513 | */ | ||
514 | struct ieee80211_tim_ie { | ||
515 | u8 dtim_count; | ||
516 | u8 dtim_period; | ||
517 | u8 bitmap_ctrl; | ||
518 | /* variable size: 1 - 251 bytes */ | ||
519 | u8 virtual_map[0]; | ||
520 | } __attribute__ ((packed)); | ||
521 | |||
509 | struct ieee80211_mgmt { | 522 | struct ieee80211_mgmt { |
510 | __le16 frame_control; | 523 | __le16 frame_control; |
511 | __le16 duration; | 524 | __le16 duration; |
diff --git a/include/linux/ihex.h b/include/linux/ihex.h index 2baace2788a7..31d8629e75a1 100644 --- a/include/linux/ihex.h +++ b/include/linux/ihex.h | |||
@@ -18,7 +18,7 @@ struct ihex_binrec { | |||
18 | __be32 addr; | 18 | __be32 addr; |
19 | __be16 len; | 19 | __be16 len; |
20 | uint8_t data[0]; | 20 | uint8_t data[0]; |
21 | } __attribute__((aligned(4))); | 21 | } __attribute__((packed)); |
22 | 22 | ||
23 | /* Find the next record, taking into account the 4-byte alignment */ | 23 | /* Find the next record, taking into account the 4-byte alignment */ |
24 | static inline const struct ihex_binrec * | 24 | static inline const struct ihex_binrec * |
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 62aa4f895abe..58ff4e74b2f3 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
@@ -223,35 +223,6 @@ static inline int disable_irq_wake(unsigned int irq) | |||
223 | #define or_softirq_pending(x) (local_softirq_pending() |= (x)) | 223 | #define or_softirq_pending(x) (local_softirq_pending() |= (x)) |
224 | #endif | 224 | #endif |
225 | 225 | ||
226 | /* | ||
227 | * Temporary defines for UP kernels, until all code gets fixed. | ||
228 | */ | ||
229 | #ifndef CONFIG_SMP | ||
230 | static inline void __deprecated cli(void) | ||
231 | { | ||
232 | local_irq_disable(); | ||
233 | } | ||
234 | static inline void __deprecated sti(void) | ||
235 | { | ||
236 | local_irq_enable(); | ||
237 | } | ||
238 | static inline void __deprecated save_flags(unsigned long *x) | ||
239 | { | ||
240 | local_save_flags(*x); | ||
241 | } | ||
242 | #define save_flags(x) save_flags(&x) | ||
243 | static inline void __deprecated restore_flags(unsigned long x) | ||
244 | { | ||
245 | local_irq_restore(x); | ||
246 | } | ||
247 | |||
248 | static inline void __deprecated save_and_cli(unsigned long *x) | ||
249 | { | ||
250 | local_irq_save(*x); | ||
251 | } | ||
252 | #define save_and_cli(x) save_and_cli(&x) | ||
253 | #endif /* CONFIG_SMP */ | ||
254 | |||
255 | /* Some architectures might implement lazy enabling/disabling of | 226 | /* Some architectures might implement lazy enabling/disabling of |
256 | * interrupts. In some cases, such as stop_machine, we might want | 227 | * interrupts. In some cases, such as stop_machine, we might want |
257 | * to ensure that after a local_irq_disable(), interrupts have | 228 | * to ensure that after a local_irq_disable(), interrupts have |
diff --git a/include/linux/kexec.h b/include/linux/kexec.h index 82f88a8a827b..32110cede64f 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h | |||
@@ -130,8 +130,8 @@ void vmcoreinfo_append_str(const char *fmt, ...) | |||
130 | __attribute__ ((format (printf, 1, 2))); | 130 | __attribute__ ((format (printf, 1, 2))); |
131 | unsigned long paddr_vmcoreinfo_note(void); | 131 | unsigned long paddr_vmcoreinfo_note(void); |
132 | 132 | ||
133 | #define VMCOREINFO_OSRELEASE(name) \ | 133 | #define VMCOREINFO_OSRELEASE(value) \ |
134 | vmcoreinfo_append_str("OSRELEASE=%s\n", #name) | 134 | vmcoreinfo_append_str("OSRELEASE=%s\n", value) |
135 | #define VMCOREINFO_PAGESIZE(value) \ | 135 | #define VMCOREINFO_PAGESIZE(value) \ |
136 | vmcoreinfo_append_str("PAGESIZE=%ld\n", value) | 136 | vmcoreinfo_append_str("PAGESIZE=%ld\n", value) |
137 | #define VMCOREINFO_SYMBOL(name) \ | 137 | #define VMCOREINFO_SYMBOL(name) \ |
diff --git a/include/linux/mISDNif.h b/include/linux/mISDNif.h index 5c948f337817..8f2d60da04e7 100644 --- a/include/linux/mISDNif.h +++ b/include/linux/mISDNif.h | |||
@@ -37,7 +37,7 @@ | |||
37 | */ | 37 | */ |
38 | #define MISDN_MAJOR_VERSION 1 | 38 | #define MISDN_MAJOR_VERSION 1 |
39 | #define MISDN_MINOR_VERSION 0 | 39 | #define MISDN_MINOR_VERSION 0 |
40 | #define MISDN_RELEASE 18 | 40 | #define MISDN_RELEASE 19 |
41 | 41 | ||
42 | /* primitives for information exchange | 42 | /* primitives for information exchange |
43 | * generell format | 43 | * generell format |
@@ -242,7 +242,8 @@ struct mISDNhead { | |||
242 | #define TEI_SAPI 63 | 242 | #define TEI_SAPI 63 |
243 | #define CTRL_SAPI 0 | 243 | #define CTRL_SAPI 0 |
244 | 244 | ||
245 | #define MISDN_CHMAP_SIZE 4 | 245 | #define MISDN_MAX_CHANNEL 127 |
246 | #define MISDN_CHMAP_SIZE ((MISDN_MAX_CHANNEL + 1) >> 3) | ||
246 | 247 | ||
247 | #define SOL_MISDN 0 | 248 | #define SOL_MISDN 0 |
248 | 249 | ||
@@ -275,11 +276,32 @@ struct mISDN_devinfo { | |||
275 | u_int Dprotocols; | 276 | u_int Dprotocols; |
276 | u_int Bprotocols; | 277 | u_int Bprotocols; |
277 | u_int protocol; | 278 | u_int protocol; |
278 | u_long channelmap[MISDN_CHMAP_SIZE]; | 279 | u_char channelmap[MISDN_CHMAP_SIZE]; |
279 | u_int nrbchan; | 280 | u_int nrbchan; |
280 | char name[MISDN_MAX_IDLEN]; | 281 | char name[MISDN_MAX_IDLEN]; |
281 | }; | 282 | }; |
282 | 283 | ||
284 | static inline int | ||
285 | test_channelmap(u_int nr, u_char *map) | ||
286 | { | ||
287 | if (nr <= MISDN_MAX_CHANNEL) | ||
288 | return map[nr >> 3] & (1 << (nr & 7)); | ||
289 | else | ||
290 | return 0; | ||
291 | } | ||
292 | |||
293 | static inline void | ||
294 | set_channelmap(u_int nr, u_char *map) | ||
295 | { | ||
296 | map[nr >> 3] |= (1 << (nr & 7)); | ||
297 | } | ||
298 | |||
299 | static inline void | ||
300 | clear_channelmap(u_int nr, u_char *map) | ||
301 | { | ||
302 | map[nr >> 3] &= ~(1 << (nr & 7)); | ||
303 | } | ||
304 | |||
283 | /* CONTROL_CHANNEL parameters */ | 305 | /* CONTROL_CHANNEL parameters */ |
284 | #define MISDN_CTRL_GETOP 0x0000 | 306 | #define MISDN_CTRL_GETOP 0x0000 |
285 | #define MISDN_CTRL_LOOP 0x0001 | 307 | #define MISDN_CTRL_LOOP 0x0001 |
@@ -405,7 +427,7 @@ struct mISDNdevice { | |||
405 | u_int Dprotocols; | 427 | u_int Dprotocols; |
406 | u_int Bprotocols; | 428 | u_int Bprotocols; |
407 | u_int nrbchan; | 429 | u_int nrbchan; |
408 | u_long channelmap[MISDN_CHMAP_SIZE]; | 430 | u_char channelmap[MISDN_CHMAP_SIZE]; |
409 | struct list_head bchannels; | 431 | struct list_head bchannels; |
410 | struct mISDNchannel *teimgr; | 432 | struct mISDNchannel *teimgr; |
411 | struct device dev; | 433 | struct device dev; |
@@ -430,7 +452,7 @@ struct mISDNstack { | |||
430 | #endif | 452 | #endif |
431 | }; | 453 | }; |
432 | 454 | ||
433 | /* global alloc/queue dunctions */ | 455 | /* global alloc/queue functions */ |
434 | 456 | ||
435 | static inline struct sk_buff * | 457 | static inline struct sk_buff * |
436 | mI_alloc_skb(unsigned int len, gfp_t gfp_mask) | 458 | mI_alloc_skb(unsigned int len, gfp_t gfp_mask) |
diff --git a/include/linux/maple.h b/include/linux/maple.h index c853b1066018..c23d3f51ba40 100644 --- a/include/linux/maple.h +++ b/include/linux/maple.h | |||
@@ -51,7 +51,6 @@ struct maple_devinfo { | |||
51 | struct maple_device { | 51 | struct maple_device { |
52 | struct maple_driver *driver; | 52 | struct maple_driver *driver; |
53 | struct mapleq *mq; | 53 | struct mapleq *mq; |
54 | void *private_data; | ||
55 | void (*callback) (struct mapleq * mq); | 54 | void (*callback) (struct mapleq * mq); |
56 | unsigned long when, interval, function; | 55 | unsigned long when, interval, function; |
57 | struct maple_devinfo devinfo; | 56 | struct maple_devinfo devinfo; |
@@ -70,7 +69,9 @@ void maple_getcond_callback(struct maple_device *dev, | |||
70 | void (*callback) (struct mapleq * mq), | 69 | void (*callback) (struct mapleq * mq), |
71 | unsigned long interval, | 70 | unsigned long interval, |
72 | unsigned long function); | 71 | unsigned long function); |
73 | int maple_driver_register(struct device_driver *drv); | 72 | int maple_driver_register(struct maple_driver *); |
73 | void maple_driver_unregister(struct maple_driver *); | ||
74 | |||
74 | int maple_add_packet_sleeps(struct maple_device *mdev, u32 function, | 75 | int maple_add_packet_sleeps(struct maple_device *mdev, u32 function, |
75 | u32 command, u32 length, void *data); | 76 | u32 command, u32 length, void *data); |
76 | void maple_clear_dev(struct maple_device *mdev); | 77 | void maple_clear_dev(struct maple_device *mdev); |
@@ -78,4 +79,7 @@ void maple_clear_dev(struct maple_device *mdev); | |||
78 | #define to_maple_dev(n) container_of(n, struct maple_device, dev) | 79 | #define to_maple_dev(n) container_of(n, struct maple_device, dev) |
79 | #define to_maple_driver(n) container_of(n, struct maple_driver, drv) | 80 | #define to_maple_driver(n) container_of(n, struct maple_driver, drv) |
80 | 81 | ||
82 | #define maple_get_drvdata(d) dev_get_drvdata(&(d)->dev) | ||
83 | #define maple_set_drvdata(d,p) dev_set_drvdata(&(d)->dev, (p)) | ||
84 | |||
81 | #endif /* __LINUX_MAPLE_H */ | 85 | #endif /* __LINUX_MAPLE_H */ |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ee583f642a9f..488c56e649b5 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -61,9 +61,7 @@ struct wireless_dev; | |||
61 | #define NET_XMIT_DROP 1 /* skb dropped */ | 61 | #define NET_XMIT_DROP 1 /* skb dropped */ |
62 | #define NET_XMIT_CN 2 /* congestion notification */ | 62 | #define NET_XMIT_CN 2 /* congestion notification */ |
63 | #define NET_XMIT_POLICED 3 /* skb is shot by police */ | 63 | #define NET_XMIT_POLICED 3 /* skb is shot by police */ |
64 | #define NET_XMIT_BYPASS 4 /* packet does not leave via dequeue; | 64 | #define NET_XMIT_MASK 0xFFFF /* qdisc flags in net/sch_generic.h */ |
65 | (TC use only - dev_queue_xmit | ||
66 | returns this as NET_XMIT_SUCCESS) */ | ||
67 | 65 | ||
68 | /* Backlog congestion levels */ | 66 | /* Backlog congestion levels */ |
69 | #define NET_RX_SUCCESS 0 /* keep 'em coming, baby */ | 67 | #define NET_RX_SUCCESS 0 /* keep 'em coming, baby */ |
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 25aaccdb2f26..c74d3e875314 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h | |||
@@ -163,7 +163,7 @@ static inline int Page##uname(struct page *page) \ | |||
163 | 163 | ||
164 | struct page; /* forward declaration */ | 164 | struct page; /* forward declaration */ |
165 | 165 | ||
166 | PAGEFLAG(Locked, locked) TESTSCFLAG(Locked, locked) | 166 | TESTPAGEFLAG(Locked, locked) |
167 | PAGEFLAG(Error, error) | 167 | PAGEFLAG(Error, error) |
168 | PAGEFLAG(Referenced, referenced) TESTCLEARFLAG(Referenced, referenced) | 168 | PAGEFLAG(Referenced, referenced) TESTCLEARFLAG(Referenced, referenced) |
169 | PAGEFLAG(Dirty, dirty) TESTSCFLAG(Dirty, dirty) __CLEARPAGEFLAG(Dirty, dirty) | 169 | PAGEFLAG(Dirty, dirty) TESTSCFLAG(Dirty, dirty) __CLEARPAGEFLAG(Dirty, dirty) |
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 69ed3cb1197a..5da31c12101c 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h | |||
@@ -250,29 +250,6 @@ static inline struct page *read_mapping_page(struct address_space *mapping, | |||
250 | return read_cache_page(mapping, index, filler, data); | 250 | return read_cache_page(mapping, index, filler, data); |
251 | } | 251 | } |
252 | 252 | ||
253 | int add_to_page_cache_locked(struct page *page, struct address_space *mapping, | ||
254 | pgoff_t index, gfp_t gfp_mask); | ||
255 | int add_to_page_cache_lru(struct page *page, struct address_space *mapping, | ||
256 | pgoff_t index, gfp_t gfp_mask); | ||
257 | extern void remove_from_page_cache(struct page *page); | ||
258 | extern void __remove_from_page_cache(struct page *page); | ||
259 | |||
260 | /* | ||
261 | * Like add_to_page_cache_locked, but used to add newly allocated pages: | ||
262 | * the page is new, so we can just run SetPageLocked() against it. | ||
263 | */ | ||
264 | static inline int add_to_page_cache(struct page *page, | ||
265 | struct address_space *mapping, pgoff_t offset, gfp_t gfp_mask) | ||
266 | { | ||
267 | int error; | ||
268 | |||
269 | SetPageLocked(page); | ||
270 | error = add_to_page_cache_locked(page, mapping, offset, gfp_mask); | ||
271 | if (unlikely(error)) | ||
272 | ClearPageLocked(page); | ||
273 | return error; | ||
274 | } | ||
275 | |||
276 | /* | 253 | /* |
277 | * Return byte-offset into filesystem object for page. | 254 | * Return byte-offset into filesystem object for page. |
278 | */ | 255 | */ |
@@ -294,13 +271,28 @@ extern int __lock_page_killable(struct page *page); | |||
294 | extern void __lock_page_nosync(struct page *page); | 271 | extern void __lock_page_nosync(struct page *page); |
295 | extern void unlock_page(struct page *page); | 272 | extern void unlock_page(struct page *page); |
296 | 273 | ||
274 | static inline void set_page_locked(struct page *page) | ||
275 | { | ||
276 | set_bit(PG_locked, &page->flags); | ||
277 | } | ||
278 | |||
279 | static inline void clear_page_locked(struct page *page) | ||
280 | { | ||
281 | clear_bit(PG_locked, &page->flags); | ||
282 | } | ||
283 | |||
284 | static inline int trylock_page(struct page *page) | ||
285 | { | ||
286 | return !test_and_set_bit(PG_locked, &page->flags); | ||
287 | } | ||
288 | |||
297 | /* | 289 | /* |
298 | * lock_page may only be called if we have the page's inode pinned. | 290 | * lock_page may only be called if we have the page's inode pinned. |
299 | */ | 291 | */ |
300 | static inline void lock_page(struct page *page) | 292 | static inline void lock_page(struct page *page) |
301 | { | 293 | { |
302 | might_sleep(); | 294 | might_sleep(); |
303 | if (TestSetPageLocked(page)) | 295 | if (!trylock_page(page)) |
304 | __lock_page(page); | 296 | __lock_page(page); |
305 | } | 297 | } |
306 | 298 | ||
@@ -312,7 +304,7 @@ static inline void lock_page(struct page *page) | |||
312 | static inline int lock_page_killable(struct page *page) | 304 | static inline int lock_page_killable(struct page *page) |
313 | { | 305 | { |
314 | might_sleep(); | 306 | might_sleep(); |
315 | if (TestSetPageLocked(page)) | 307 | if (!trylock_page(page)) |
316 | return __lock_page_killable(page); | 308 | return __lock_page_killable(page); |
317 | return 0; | 309 | return 0; |
318 | } | 310 | } |
@@ -324,7 +316,7 @@ static inline int lock_page_killable(struct page *page) | |||
324 | static inline void lock_page_nosync(struct page *page) | 316 | static inline void lock_page_nosync(struct page *page) |
325 | { | 317 | { |
326 | might_sleep(); | 318 | might_sleep(); |
327 | if (TestSetPageLocked(page)) | 319 | if (!trylock_page(page)) |
328 | __lock_page_nosync(page); | 320 | __lock_page_nosync(page); |
329 | } | 321 | } |
330 | 322 | ||
@@ -409,4 +401,27 @@ static inline int fault_in_pages_readable(const char __user *uaddr, int size) | |||
409 | return ret; | 401 | return ret; |
410 | } | 402 | } |
411 | 403 | ||
404 | int add_to_page_cache_locked(struct page *page, struct address_space *mapping, | ||
405 | pgoff_t index, gfp_t gfp_mask); | ||
406 | int add_to_page_cache_lru(struct page *page, struct address_space *mapping, | ||
407 | pgoff_t index, gfp_t gfp_mask); | ||
408 | extern void remove_from_page_cache(struct page *page); | ||
409 | extern void __remove_from_page_cache(struct page *page); | ||
410 | |||
411 | /* | ||
412 | * Like add_to_page_cache_locked, but used to add newly allocated pages: | ||
413 | * the page is new, so we can just run set_page_locked() against it. | ||
414 | */ | ||
415 | static inline int add_to_page_cache(struct page *page, | ||
416 | struct address_space *mapping, pgoff_t offset, gfp_t gfp_mask) | ||
417 | { | ||
418 | int error; | ||
419 | |||
420 | set_page_locked(page); | ||
421 | error = add_to_page_cache_locked(page, mapping, offset, gfp_mask); | ||
422 | if (unlikely(error)) | ||
423 | clear_page_locked(page); | ||
424 | return error; | ||
425 | } | ||
426 | |||
412 | #endif /* _LINUX_PAGEMAP_H */ | 427 | #endif /* _LINUX_PAGEMAP_H */ |
diff --git a/include/linux/parser.h b/include/linux/parser.h index cc554ca8bc78..7dcd05075756 100644 --- a/include/linux/parser.h +++ b/include/linux/parser.h | |||
@@ -14,7 +14,7 @@ struct match_token { | |||
14 | const char *pattern; | 14 | const char *pattern; |
15 | }; | 15 | }; |
16 | 16 | ||
17 | typedef const struct match_token match_table_t[]; | 17 | typedef struct match_token match_table_t[]; |
18 | 18 | ||
19 | /* Maximum number of arguments that match_token will find in a pattern */ | 19 | /* Maximum number of arguments that match_token will find in a pattern */ |
20 | enum {MAX_OPT_ARGS = 3}; | 20 | enum {MAX_OPT_ARGS = 3}; |
diff --git a/include/linux/pm_qos_params.h b/include/linux/pm_qos_params.h index 2e4e97bd19f7..d74f75ed1e47 100644 --- a/include/linux/pm_qos_params.h +++ b/include/linux/pm_qos_params.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* interface for the pm_qos_power infrastructure of the linux kernel. | 1 | /* interface for the pm_qos_power infrastructure of the linux kernel. |
2 | * | 2 | * |
3 | * Mark Gross | 3 | * Mark Gross <mgross@linux.intel.com> |
4 | */ | 4 | */ |
5 | #include <linux/list.h> | 5 | #include <linux/list.h> |
6 | #include <linux/notifier.h> | 6 | #include <linux/notifier.h> |
diff --git a/include/linux/spi/orion_spi.h b/include/linux/spi/orion_spi.h new file mode 100644 index 000000000000..b4d9fa6f797c --- /dev/null +++ b/include/linux/spi/orion_spi.h | |||
@@ -0,0 +1,17 @@ | |||
1 | /* | ||
2 | * orion_spi.h | ||
3 | * | ||
4 | * This file is licensed under the terms of the GNU General Public | ||
5 | * License version 2. This program is licensed "as is" without any | ||
6 | * warranty of any kind, whether express or implied. | ||
7 | */ | ||
8 | |||
9 | #ifndef __LINUX_SPI_ORION_SPI_H | ||
10 | #define __LINUX_SPI_ORION_SPI_H | ||
11 | |||
12 | struct orion_spi_info { | ||
13 | u32 tclk; /* no <linux/clk.h> support yet */ | ||
14 | }; | ||
15 | |||
16 | |||
17 | #endif | ||
diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h index 12532839f508..ab3ef7aefa95 100644 --- a/include/linux/tracehook.h +++ b/include/linux/tracehook.h | |||
@@ -487,6 +487,9 @@ static inline int tracehook_notify_jctl(int notify, int why) | |||
487 | return notify || (current->ptrace & PT_PTRACED); | 487 | return notify || (current->ptrace & PT_PTRACED); |
488 | } | 488 | } |
489 | 489 | ||
490 | #define DEATH_REAP -1 | ||
491 | #define DEATH_DELAYED_GROUP_LEADER -2 | ||
492 | |||
490 | /** | 493 | /** |
491 | * tracehook_notify_death - task is dead, ready to notify parent | 494 | * tracehook_notify_death - task is dead, ready to notify parent |
492 | * @task: @current task now exiting | 495 | * @task: @current task now exiting |
@@ -501,8 +504,6 @@ static inline int tracehook_notify_jctl(int notify, int why) | |||
501 | * | 504 | * |
502 | * Called with write_lock_irq(&tasklist_lock) held. | 505 | * Called with write_lock_irq(&tasklist_lock) held. |
503 | */ | 506 | */ |
504 | #define DEATH_REAP -1 | ||
505 | #define DEATH_DELAYED_GROUP_LEADER -2 | ||
506 | static inline int tracehook_notify_death(struct task_struct *task, | 507 | static inline int tracehook_notify_death(struct task_struct *task, |
507 | void **death_cookie, int group_dead) | 508 | void **death_cookie, int group_dead) |
508 | { | 509 | { |
diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h index 8c8119ffee12..1c78d56c57e5 100644 --- a/include/linux/vt_kern.h +++ b/include/linux/vt_kern.h | |||
@@ -86,6 +86,7 @@ int con_copy_unimap(struct vc_data *dst_vc, struct vc_data *src_vc); | |||
86 | #define con_copy_unimap(d, s) (0) | 86 | #define con_copy_unimap(d, s) (0) |
87 | #define con_get_unimap(vc, ct, uct, list) (-EINVAL) | 87 | #define con_get_unimap(vc, ct, uct, list) (-EINVAL) |
88 | #define con_free_unimap(vc) do { ; } while (0) | 88 | #define con_free_unimap(vc) do { ; } while (0) |
89 | #define con_protect_unimap(vc, rdonly) do { ; } while (0) | ||
89 | 90 | ||
90 | #define vc_translate(vc, c) (c) | 91 | #define vc_translate(vc, c) (c) |
91 | #endif | 92 | #endif |
diff --git a/include/net/dst.h b/include/net/dst.h index c5c318a628f8..8a8b71e5f3f1 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
@@ -252,17 +252,7 @@ static inline int dst_output(struct sk_buff *skb) | |||
252 | /* Input packet from network to transport. */ | 252 | /* Input packet from network to transport. */ |
253 | static inline int dst_input(struct sk_buff *skb) | 253 | static inline int dst_input(struct sk_buff *skb) |
254 | { | 254 | { |
255 | int err; | 255 | return skb->dst->input(skb); |
256 | |||
257 | for (;;) { | ||
258 | err = skb->dst->input(skb); | ||
259 | |||
260 | if (likely(err == 0)) | ||
261 | return err; | ||
262 | /* Oh, Jamal... Seems, I will not forgive you this mess. :-) */ | ||
263 | if (unlikely(err != NET_XMIT_BYPASS)) | ||
264 | return err; | ||
265 | } | ||
266 | } | 256 | } |
267 | 257 | ||
268 | static inline struct dst_entry *dst_check(struct dst_entry *dst, u32 cookie) | 258 | static inline struct dst_entry *dst_check(struct dst_entry *dst, u32 cookie) |
diff --git a/include/net/flow.h b/include/net/flow.h index ad16e0076c89..228b2477ceec 100644 --- a/include/net/flow.h +++ b/include/net/flow.h | |||
@@ -47,7 +47,6 @@ struct flowi { | |||
47 | #define fl4_scope nl_u.ip4_u.scope | 47 | #define fl4_scope nl_u.ip4_u.scope |
48 | 48 | ||
49 | __u8 proto; | 49 | __u8 proto; |
50 | __u8 flags; | ||
51 | union { | 50 | union { |
52 | struct { | 51 | struct { |
53 | __be16 sport; | 52 | __be16 sport; |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index b52721008be8..b397e4d984c7 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -177,9 +177,10 @@ enum ieee80211_bss_change { | |||
177 | * @aid: association ID number, valid only when @assoc is true | 177 | * @aid: association ID number, valid only when @assoc is true |
178 | * @use_cts_prot: use CTS protection | 178 | * @use_cts_prot: use CTS protection |
179 | * @use_short_preamble: use 802.11b short preamble | 179 | * @use_short_preamble: use 802.11b short preamble |
180 | * @dtim_period: num of beacons before the next DTIM, for PSM | ||
180 | * @timestamp: beacon timestamp | 181 | * @timestamp: beacon timestamp |
181 | * @beacon_int: beacon interval | 182 | * @beacon_int: beacon interval |
182 | * @assoc_capability: capabbilities taken from assoc resp | 183 | * @assoc_capability: capabilities taken from assoc resp |
183 | * @assoc_ht: association in HT mode | 184 | * @assoc_ht: association in HT mode |
184 | * @ht_conf: ht capabilities | 185 | * @ht_conf: ht capabilities |
185 | * @ht_bss_conf: ht extended capabilities | 186 | * @ht_bss_conf: ht extended capabilities |
@@ -191,6 +192,7 @@ struct ieee80211_bss_conf { | |||
191 | /* erp related data */ | 192 | /* erp related data */ |
192 | bool use_cts_prot; | 193 | bool use_cts_prot; |
193 | bool use_short_preamble; | 194 | bool use_short_preamble; |
195 | u8 dtim_period; | ||
194 | u16 beacon_int; | 196 | u16 beacon_int; |
195 | u16 assoc_capability; | 197 | u16 assoc_capability; |
196 | u64 timestamp; | 198 | u64 timestamp; |
@@ -430,6 +432,7 @@ enum ieee80211_conf_flags { | |||
430 | * @radio_enabled: when zero, driver is required to switch off the radio. | 432 | * @radio_enabled: when zero, driver is required to switch off the radio. |
431 | * TODO make a flag | 433 | * TODO make a flag |
432 | * @beacon_int: beacon interval (TODO make interface config) | 434 | * @beacon_int: beacon interval (TODO make interface config) |
435 | * @listen_interval: listen interval in units of beacon interval | ||
433 | * @flags: configuration flags defined above | 436 | * @flags: configuration flags defined above |
434 | * @power_level: requested transmit power (in dBm) | 437 | * @power_level: requested transmit power (in dBm) |
435 | * @max_antenna_gain: maximum antenna gain (in dBi) | 438 | * @max_antenna_gain: maximum antenna gain (in dBi) |
@@ -444,6 +447,7 @@ struct ieee80211_conf { | |||
444 | int radio_enabled; | 447 | int radio_enabled; |
445 | 448 | ||
446 | int beacon_int; | 449 | int beacon_int; |
450 | u16 listen_interval; | ||
447 | u32 flags; | 451 | u32 flags; |
448 | int power_level; | 452 | int power_level; |
449 | int max_antenna_gain; | 453 | int max_antenna_gain; |
@@ -785,6 +789,9 @@ enum ieee80211_hw_flags { | |||
785 | * @max_signal: Maximum value for signal (rssi) in RX information, used | 789 | * @max_signal: Maximum value for signal (rssi) in RX information, used |
786 | * only when @IEEE80211_HW_SIGNAL_UNSPEC or @IEEE80211_HW_SIGNAL_DB | 790 | * only when @IEEE80211_HW_SIGNAL_UNSPEC or @IEEE80211_HW_SIGNAL_DB |
787 | * | 791 | * |
792 | * @max_listen_interval: max listen interval in units of beacon interval | ||
793 | * that HW supports | ||
794 | * | ||
788 | * @queues: number of available hardware transmit queues for | 795 | * @queues: number of available hardware transmit queues for |
789 | * data packets. WMM/QoS requires at least four, these | 796 | * data packets. WMM/QoS requires at least four, these |
790 | * queues need to have configurable access parameters. | 797 | * queues need to have configurable access parameters. |
@@ -812,7 +819,9 @@ struct ieee80211_hw { | |||
812 | unsigned int extra_tx_headroom; | 819 | unsigned int extra_tx_headroom; |
813 | int channel_change_time; | 820 | int channel_change_time; |
814 | int vif_data_size; | 821 | int vif_data_size; |
815 | u16 queues, ampdu_queues; | 822 | u16 queues; |
823 | u16 ampdu_queues; | ||
824 | u16 max_listen_interval; | ||
816 | s8 max_signal; | 825 | s8 max_signal; |
817 | }; | 826 | }; |
818 | 827 | ||
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index b5f40d7ef724..a7abfda3e447 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
@@ -193,10 +193,22 @@ static inline struct Qdisc *qdisc_root(struct Qdisc *qdisc) | |||
193 | return qdisc->dev_queue->qdisc; | 193 | return qdisc->dev_queue->qdisc; |
194 | } | 194 | } |
195 | 195 | ||
196 | /* The qdisc root lock is a mechanism by which to top level | ||
197 | * of a qdisc tree can be locked from any qdisc node in the | ||
198 | * forest. This allows changing the configuration of some | ||
199 | * aspect of the qdisc tree while blocking out asynchronous | ||
200 | * qdisc access in the packet processing paths. | ||
201 | * | ||
202 | * It is only legal to do this when the root will not change | ||
203 | * on us. Otherwise we'll potentially lock the wrong qdisc | ||
204 | * root. This is enforced by holding the RTNL semaphore, which | ||
205 | * all users of this lock accessor must do. | ||
206 | */ | ||
196 | static inline spinlock_t *qdisc_root_lock(struct Qdisc *qdisc) | 207 | static inline spinlock_t *qdisc_root_lock(struct Qdisc *qdisc) |
197 | { | 208 | { |
198 | struct Qdisc *root = qdisc_root(qdisc); | 209 | struct Qdisc *root = qdisc_root(qdisc); |
199 | 210 | ||
211 | ASSERT_RTNL(); | ||
200 | return qdisc_lock(root); | 212 | return qdisc_lock(root); |
201 | } | 213 | } |
202 | 214 | ||
@@ -331,6 +343,18 @@ static inline unsigned int qdisc_pkt_len(struct sk_buff *skb) | |||
331 | return qdisc_skb_cb(skb)->pkt_len; | 343 | return qdisc_skb_cb(skb)->pkt_len; |
332 | } | 344 | } |
333 | 345 | ||
346 | /* additional qdisc xmit flags (NET_XMIT_MASK in linux/netdevice.h) */ | ||
347 | enum net_xmit_qdisc_t { | ||
348 | __NET_XMIT_STOLEN = 0x00010000, | ||
349 | __NET_XMIT_BYPASS = 0x00020000, | ||
350 | }; | ||
351 | |||
352 | #ifdef CONFIG_NET_CLS_ACT | ||
353 | #define net_xmit_drop_count(e) ((e) & __NET_XMIT_STOLEN ? 0 : 1) | ||
354 | #else | ||
355 | #define net_xmit_drop_count(e) (1) | ||
356 | #endif | ||
357 | |||
334 | static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch) | 358 | static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
335 | { | 359 | { |
336 | #ifdef CONFIG_NET_SCHED | 360 | #ifdef CONFIG_NET_SCHED |
@@ -343,7 +367,7 @@ static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
343 | static inline int qdisc_enqueue_root(struct sk_buff *skb, struct Qdisc *sch) | 367 | static inline int qdisc_enqueue_root(struct sk_buff *skb, struct Qdisc *sch) |
344 | { | 368 | { |
345 | qdisc_skb_cb(skb)->pkt_len = skb->len; | 369 | qdisc_skb_cb(skb)->pkt_len = skb->len; |
346 | return qdisc_enqueue(skb, sch); | 370 | return qdisc_enqueue(skb, sch) & NET_XMIT_MASK; |
347 | } | 371 | } |
348 | 372 | ||
349 | static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch, | 373 | static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch, |
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 535a18f57a13..ab1c472ea753 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
@@ -524,8 +524,7 @@ static inline void sctp_ssn_skip(struct sctp_stream *stream, __u16 id, | |||
524 | */ | 524 | */ |
525 | struct sctp_af { | 525 | struct sctp_af { |
526 | int (*sctp_xmit) (struct sk_buff *skb, | 526 | int (*sctp_xmit) (struct sk_buff *skb, |
527 | struct sctp_transport *, | 527 | struct sctp_transport *); |
528 | int ipfragok); | ||
529 | int (*setsockopt) (struct sock *sk, | 528 | int (*setsockopt) (struct sock *sk, |
530 | int level, | 529 | int level, |
531 | int optname, | 530 | int optname, |
diff --git a/include/video/radeon.h b/include/video/radeon.h index 83467e18f5e9..95a1f2038b1d 100644 --- a/include/video/radeon.h +++ b/include/video/radeon.h | |||
@@ -527,8 +527,9 @@ | |||
527 | 527 | ||
528 | 528 | ||
529 | /* DSTCACHE_CTLSTAT bit constants */ | 529 | /* DSTCACHE_CTLSTAT bit constants */ |
530 | #define RB2D_DC_FLUSH (3 << 0) | 530 | #define RB2D_DC_FLUSH_2D (1 << 0) |
531 | #define RB2D_DC_FLUSH_ALL 0xf | 531 | #define RB2D_DC_FREE_2D (1 << 2) |
532 | #define RB2D_DC_FLUSH_ALL (RB2D_DC_FLUSH_2D | RB2D_DC_FREE_2D) | ||
532 | #define RB2D_DC_BUSY (1 << 31) | 533 | #define RB2D_DC_BUSY (1 << 31) |
533 | 534 | ||
534 | 535 | ||
diff --git a/init/main.c b/init/main.c index 9c3b68b86ca0..0bc7e167bf45 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/smp_lock.h> | 23 | #include <linux/smp_lock.h> |
24 | #include <linux/initrd.h> | 24 | #include <linux/initrd.h> |
25 | #include <linux/hdreg.h> | ||
26 | #include <linux/bootmem.h> | 25 | #include <linux/bootmem.h> |
27 | #include <linux/tty.h> | 26 | #include <linux/tty.h> |
28 | #include <linux/gfp.h> | 27 | #include <linux/gfp.h> |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 496c3dd37276..972f8e61d36a 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
@@ -243,6 +243,9 @@ static inline int open_arg(int flags, int mask) | |||
243 | 243 | ||
244 | static int audit_match_perm(struct audit_context *ctx, int mask) | 244 | static int audit_match_perm(struct audit_context *ctx, int mask) |
245 | { | 245 | { |
246 | if (unlikely(!ctx)) | ||
247 | return 0; | ||
248 | |||
246 | unsigned n = ctx->major; | 249 | unsigned n = ctx->major; |
247 | switch (audit_classify_syscall(ctx->arch, n)) { | 250 | switch (audit_classify_syscall(ctx->arch, n)) { |
248 | case 0: /* native */ | 251 | case 0: /* native */ |
@@ -284,6 +287,10 @@ static int audit_match_filetype(struct audit_context *ctx, int which) | |||
284 | { | 287 | { |
285 | unsigned index = which & ~S_IFMT; | 288 | unsigned index = which & ~S_IFMT; |
286 | mode_t mode = which & S_IFMT; | 289 | mode_t mode = which & S_IFMT; |
290 | |||
291 | if (unlikely(!ctx)) | ||
292 | return 0; | ||
293 | |||
287 | if (index >= ctx->name_count) | 294 | if (index >= ctx->name_count) |
288 | return 0; | 295 | return 0; |
289 | if (ctx->names[index].ino == -1) | 296 | if (ctx->names[index].ino == -1) |
diff --git a/kernel/dma-coherent.c b/kernel/dma-coherent.c index 7517115a8cce..91e96950cd52 100644 --- a/kernel/dma-coherent.c +++ b/kernel/dma-coherent.c | |||
@@ -77,15 +77,14 @@ void *dma_mark_declared_memory_occupied(struct device *dev, | |||
77 | { | 77 | { |
78 | struct dma_coherent_mem *mem = dev->dma_mem; | 78 | struct dma_coherent_mem *mem = dev->dma_mem; |
79 | int pos, err; | 79 | int pos, err; |
80 | int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1); | ||
81 | 80 | ||
82 | pages >>= PAGE_SHIFT; | 81 | size += device_addr & ~PAGE_MASK; |
83 | 82 | ||
84 | if (!mem) | 83 | if (!mem) |
85 | return ERR_PTR(-EINVAL); | 84 | return ERR_PTR(-EINVAL); |
86 | 85 | ||
87 | pos = (device_addr - mem->device_base) >> PAGE_SHIFT; | 86 | pos = (device_addr - mem->device_base) >> PAGE_SHIFT; |
88 | err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages)); | 87 | err = bitmap_allocate_region(mem->bitmap, pos, get_order(size)); |
89 | if (err != 0) | 88 | if (err != 0) |
90 | return ERR_PTR(err); | 89 | return ERR_PTR(err); |
91 | return mem->virt_base + (pos << PAGE_SHIFT); | 90 | return mem->virt_base + (pos << PAGE_SHIFT); |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 152abfd3589f..0314074fa232 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -323,7 +323,8 @@ static int __irq_set_trigger(struct irq_chip *chip, unsigned int irq, | |||
323 | ret = chip->set_type(irq, flags & IRQF_TRIGGER_MASK); | 323 | ret = chip->set_type(irq, flags & IRQF_TRIGGER_MASK); |
324 | 324 | ||
325 | if (ret) | 325 | if (ret) |
326 | pr_err("setting flow type for irq %u failed (%pF)\n", | 326 | pr_err("setting trigger mode %d for irq %u failed (%pF)\n", |
327 | (int)(flags & IRQF_TRIGGER_MASK), | ||
327 | irq, chip->set_type); | 328 | irq, chip->set_type); |
328 | 329 | ||
329 | return ret; | 330 | return ret; |
diff --git a/kernel/pm_qos_params.c b/kernel/pm_qos_params.c index 8cb757026386..da9c2dda6a4e 100644 --- a/kernel/pm_qos_params.c +++ b/kernel/pm_qos_params.c | |||
@@ -24,7 +24,7 @@ | |||
24 | * requirement that the application has is cleaned up when closes the file | 24 | * requirement that the application has is cleaned up when closes the file |
25 | * pointer or exits the pm_qos_object will get an opportunity to clean up. | 25 | * pointer or exits the pm_qos_object will get an opportunity to clean up. |
26 | * | 26 | * |
27 | * mark gross mgross@linux.intel.com | 27 | * Mark Gross <mgross@linux.intel.com> |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include <linux/pm_qos_params.h> | 30 | #include <linux/pm_qos_params.h> |
@@ -211,8 +211,8 @@ EXPORT_SYMBOL_GPL(pm_qos_requirement); | |||
211 | * @value: defines the qos request | 211 | * @value: defines the qos request |
212 | * | 212 | * |
213 | * This function inserts a new entry in the pm_qos_class list of requested qos | 213 | * This function inserts a new entry in the pm_qos_class list of requested qos |
214 | * performance charactoistics. It recomputes the agregate QoS expectations for | 214 | * performance characteristics. It recomputes the aggregate QoS expectations |
215 | * the pm_qos_class of parrameters. | 215 | * for the pm_qos_class of parameters. |
216 | */ | 216 | */ |
217 | int pm_qos_add_requirement(int pm_qos_class, char *name, s32 value) | 217 | int pm_qos_add_requirement(int pm_qos_class, char *name, s32 value) |
218 | { | 218 | { |
@@ -250,10 +250,10 @@ EXPORT_SYMBOL_GPL(pm_qos_add_requirement); | |||
250 | * @name: identifies the request | 250 | * @name: identifies the request |
251 | * @value: defines the qos request | 251 | * @value: defines the qos request |
252 | * | 252 | * |
253 | * Updates an existing qos requierement for the pm_qos_class of parameters along | 253 | * Updates an existing qos requirement for the pm_qos_class of parameters along |
254 | * with updating the target pm_qos_class value. | 254 | * with updating the target pm_qos_class value. |
255 | * | 255 | * |
256 | * If the named request isn't in the lest then no change is made. | 256 | * If the named request isn't in the list then no change is made. |
257 | */ | 257 | */ |
258 | int pm_qos_update_requirement(int pm_qos_class, char *name, s32 new_value) | 258 | int pm_qos_update_requirement(int pm_qos_class, char *name, s32 new_value) |
259 | { | 259 | { |
@@ -287,7 +287,7 @@ EXPORT_SYMBOL_GPL(pm_qos_update_requirement); | |||
287 | * @pm_qos_class: identifies which list of qos request to us | 287 | * @pm_qos_class: identifies which list of qos request to us |
288 | * @name: identifies the request | 288 | * @name: identifies the request |
289 | * | 289 | * |
290 | * Will remove named qos request from pm_qos_class list of parrameters and | 290 | * Will remove named qos request from pm_qos_class list of parameters and |
291 | * recompute the current target value for the pm_qos_class. | 291 | * recompute the current target value for the pm_qos_class. |
292 | */ | 292 | */ |
293 | void pm_qos_remove_requirement(int pm_qos_class, char *name) | 293 | void pm_qos_remove_requirement(int pm_qos_class, char *name) |
@@ -319,7 +319,7 @@ EXPORT_SYMBOL_GPL(pm_qos_remove_requirement); | |||
319 | * @notifier: notifier block managed by caller. | 319 | * @notifier: notifier block managed by caller. |
320 | * | 320 | * |
321 | * will register the notifier into a notification chain that gets called | 321 | * will register the notifier into a notification chain that gets called |
322 | * uppon changes to the pm_qos_class target value. | 322 | * upon changes to the pm_qos_class target value. |
323 | */ | 323 | */ |
324 | int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier) | 324 | int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier) |
325 | { | 325 | { |
@@ -338,7 +338,7 @@ EXPORT_SYMBOL_GPL(pm_qos_add_notifier); | |||
338 | * @notifier: notifier block to be removed. | 338 | * @notifier: notifier block to be removed. |
339 | * | 339 | * |
340 | * will remove the notifier from the notification chain that gets called | 340 | * will remove the notifier from the notification chain that gets called |
341 | * uppon changes to the pm_qos_class target value. | 341 | * upon changes to the pm_qos_class target value. |
342 | */ | 342 | */ |
343 | int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier) | 343 | int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier) |
344 | { | 344 | { |
diff --git a/kernel/relay.c b/kernel/relay.c index 04006ef970b8..8d13a7855c08 100644 --- a/kernel/relay.c +++ b/kernel/relay.c | |||
@@ -944,6 +944,10 @@ static void relay_file_read_consume(struct rchan_buf *buf, | |||
944 | size_t n_subbufs = buf->chan->n_subbufs; | 944 | size_t n_subbufs = buf->chan->n_subbufs; |
945 | size_t read_subbuf; | 945 | size_t read_subbuf; |
946 | 946 | ||
947 | if (buf->subbufs_produced == buf->subbufs_consumed && | ||
948 | buf->offset == buf->bytes_consumed) | ||
949 | return; | ||
950 | |||
947 | if (buf->bytes_consumed + bytes_consumed > subbuf_size) { | 951 | if (buf->bytes_consumed + bytes_consumed > subbuf_size) { |
948 | relay_subbufs_consumed(buf->chan, buf->cpu, 1); | 952 | relay_subbufs_consumed(buf->chan, buf->cpu, 1); |
949 | buf->bytes_consumed = 0; | 953 | buf->bytes_consumed = 0; |
@@ -975,6 +979,8 @@ static int relay_file_read_avail(struct rchan_buf *buf, size_t read_pos) | |||
975 | 979 | ||
976 | relay_file_read_consume(buf, read_pos, 0); | 980 | relay_file_read_consume(buf, read_pos, 0); |
977 | 981 | ||
982 | consumed = buf->subbufs_consumed; | ||
983 | |||
978 | if (unlikely(buf->offset > subbuf_size)) { | 984 | if (unlikely(buf->offset > subbuf_size)) { |
979 | if (produced == consumed) | 985 | if (produced == consumed) |
980 | return 0; | 986 | return 0; |
@@ -993,8 +999,12 @@ static int relay_file_read_avail(struct rchan_buf *buf, size_t read_pos) | |||
993 | if (consumed > produced) | 999 | if (consumed > produced) |
994 | produced += n_subbufs * subbuf_size; | 1000 | produced += n_subbufs * subbuf_size; |
995 | 1001 | ||
996 | if (consumed == produced) | 1002 | if (consumed == produced) { |
1003 | if (buf->offset == subbuf_size && | ||
1004 | buf->subbufs_produced > buf->subbufs_consumed) | ||
1005 | return 1; | ||
997 | return 0; | 1006 | return 0; |
1007 | } | ||
998 | 1008 | ||
999 | return 1; | 1009 | return 1; |
1000 | } | 1010 | } |
diff --git a/kernel/sched.c b/kernel/sched.c index 21f7da94662e..04160d277e7a 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -5004,19 +5004,21 @@ recheck: | |||
5004 | return -EPERM; | 5004 | return -EPERM; |
5005 | } | 5005 | } |
5006 | 5006 | ||
5007 | if (user) { | ||
5007 | #ifdef CONFIG_RT_GROUP_SCHED | 5008 | #ifdef CONFIG_RT_GROUP_SCHED |
5008 | /* | 5009 | /* |
5009 | * Do not allow realtime tasks into groups that have no runtime | 5010 | * Do not allow realtime tasks into groups that have no runtime |
5010 | * assigned. | 5011 | * assigned. |
5011 | */ | 5012 | */ |
5012 | if (user | 5013 | if (rt_policy(policy) && task_group(p)->rt_bandwidth.rt_runtime == 0) |
5013 | && rt_policy(policy) && task_group(p)->rt_bandwidth.rt_runtime == 0) | 5014 | return -EPERM; |
5014 | return -EPERM; | ||
5015 | #endif | 5015 | #endif |
5016 | 5016 | ||
5017 | retval = security_task_setscheduler(p, policy, param); | 5017 | retval = security_task_setscheduler(p, policy, param); |
5018 | if (retval) | 5018 | if (retval) |
5019 | return retval; | 5019 | return retval; |
5020 | } | ||
5021 | |||
5020 | /* | 5022 | /* |
5021 | * make sure no PI-waiters arrive (or leave) while we are | 5023 | * make sure no PI-waiters arrive (or leave) while we are |
5022 | * changing the priority of the task: | 5024 | * changing the priority of the task: |
diff --git a/kernel/semaphore.c b/kernel/semaphore.c index aaaeae8244e7..94a62c0d4ade 100644 --- a/kernel/semaphore.c +++ b/kernel/semaphore.c | |||
@@ -212,9 +212,7 @@ static inline int __sched __down_common(struct semaphore *sem, long state, | |||
212 | waiter.up = 0; | 212 | waiter.up = 0; |
213 | 213 | ||
214 | for (;;) { | 214 | for (;;) { |
215 | if (state == TASK_INTERRUPTIBLE && signal_pending(task)) | 215 | if (signal_pending_state(state, task)) |
216 | goto interrupted; | ||
217 | if (state == TASK_KILLABLE && fatal_signal_pending(task)) | ||
218 | goto interrupted; | 216 | goto interrupted; |
219 | if (timeout <= 0) | 217 | if (timeout <= 0) |
220 | goto timed_out; | 218 | goto timed_out; |
diff --git a/mm/filemap.c b/mm/filemap.c index d97d1ad55473..54e968650855 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -558,14 +558,14 @@ EXPORT_SYMBOL(wait_on_page_bit); | |||
558 | * But that's OK - sleepers in wait_on_page_writeback() just go back to sleep. | 558 | * But that's OK - sleepers in wait_on_page_writeback() just go back to sleep. |
559 | * | 559 | * |
560 | * The first mb is necessary to safely close the critical section opened by the | 560 | * The first mb is necessary to safely close the critical section opened by the |
561 | * TestSetPageLocked(), the second mb is necessary to enforce ordering between | 561 | * test_and_set_bit() to lock the page; the second mb is necessary to enforce |
562 | * the clear_bit and the read of the waitqueue (to avoid SMP races with a | 562 | * ordering between the clear_bit and the read of the waitqueue (to avoid SMP |
563 | * parallel wait_on_page_locked()). | 563 | * races with a parallel wait_on_page_locked()). |
564 | */ | 564 | */ |
565 | void unlock_page(struct page *page) | 565 | void unlock_page(struct page *page) |
566 | { | 566 | { |
567 | smp_mb__before_clear_bit(); | 567 | smp_mb__before_clear_bit(); |
568 | if (!TestClearPageLocked(page)) | 568 | if (!test_and_clear_bit(PG_locked, &page->flags)) |
569 | BUG(); | 569 | BUG(); |
570 | smp_mb__after_clear_bit(); | 570 | smp_mb__after_clear_bit(); |
571 | wake_up_page(page, PG_locked); | 571 | wake_up_page(page, PG_locked); |
@@ -931,7 +931,7 @@ grab_cache_page_nowait(struct address_space *mapping, pgoff_t index) | |||
931 | struct page *page = find_get_page(mapping, index); | 931 | struct page *page = find_get_page(mapping, index); |
932 | 932 | ||
933 | if (page) { | 933 | if (page) { |
934 | if (!TestSetPageLocked(page)) | 934 | if (trylock_page(page)) |
935 | return page; | 935 | return page; |
936 | page_cache_release(page); | 936 | page_cache_release(page); |
937 | return NULL; | 937 | return NULL; |
@@ -1027,7 +1027,7 @@ find_page: | |||
1027 | if (inode->i_blkbits == PAGE_CACHE_SHIFT || | 1027 | if (inode->i_blkbits == PAGE_CACHE_SHIFT || |
1028 | !mapping->a_ops->is_partially_uptodate) | 1028 | !mapping->a_ops->is_partially_uptodate) |
1029 | goto page_not_up_to_date; | 1029 | goto page_not_up_to_date; |
1030 | if (TestSetPageLocked(page)) | 1030 | if (!trylock_page(page)) |
1031 | goto page_not_up_to_date; | 1031 | goto page_not_up_to_date; |
1032 | if (!mapping->a_ops->is_partially_uptodate(page, | 1032 | if (!mapping->a_ops->is_partially_uptodate(page, |
1033 | desc, offset)) | 1033 | desc, offset)) |
diff --git a/mm/memory.c b/mm/memory.c index 6793b9c68107..1002f473f497 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -1789,7 +1789,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
1789 | * not dirty accountable. | 1789 | * not dirty accountable. |
1790 | */ | 1790 | */ |
1791 | if (PageAnon(old_page)) { | 1791 | if (PageAnon(old_page)) { |
1792 | if (!TestSetPageLocked(old_page)) { | 1792 | if (trylock_page(old_page)) { |
1793 | reuse = can_share_swap_page(old_page); | 1793 | reuse = can_share_swap_page(old_page); |
1794 | unlock_page(old_page); | 1794 | unlock_page(old_page); |
1795 | } | 1795 | } |
@@ -2765,16 +2765,26 @@ int make_pages_present(unsigned long addr, unsigned long end) | |||
2765 | 2765 | ||
2766 | vma = find_vma(current->mm, addr); | 2766 | vma = find_vma(current->mm, addr); |
2767 | if (!vma) | 2767 | if (!vma) |
2768 | return -1; | 2768 | return -ENOMEM; |
2769 | write = (vma->vm_flags & VM_WRITE) != 0; | 2769 | write = (vma->vm_flags & VM_WRITE) != 0; |
2770 | BUG_ON(addr >= end); | 2770 | BUG_ON(addr >= end); |
2771 | BUG_ON(end > vma->vm_end); | 2771 | BUG_ON(end > vma->vm_end); |
2772 | len = DIV_ROUND_UP(end, PAGE_SIZE) - addr/PAGE_SIZE; | 2772 | len = DIV_ROUND_UP(end, PAGE_SIZE) - addr/PAGE_SIZE; |
2773 | ret = get_user_pages(current, current->mm, addr, | 2773 | ret = get_user_pages(current, current->mm, addr, |
2774 | len, write, 0, NULL, NULL); | 2774 | len, write, 0, NULL, NULL); |
2775 | if (ret < 0) | 2775 | if (ret < 0) { |
2776 | /* | ||
2777 | SUS require strange return value to mlock | ||
2778 | - invalid addr generate to ENOMEM. | ||
2779 | - out of memory should generate EAGAIN. | ||
2780 | */ | ||
2781 | if (ret == -EFAULT) | ||
2782 | ret = -ENOMEM; | ||
2783 | else if (ret == -ENOMEM) | ||
2784 | ret = -EAGAIN; | ||
2776 | return ret; | 2785 | return ret; |
2777 | return ret == len ? 0 : -1; | 2786 | } |
2787 | return ret == len ? 0 : -ENOMEM; | ||
2778 | } | 2788 | } |
2779 | 2789 | ||
2780 | #if !defined(__HAVE_ARCH_GATE_AREA) | 2790 | #if !defined(__HAVE_ARCH_GATE_AREA) |
diff --git a/mm/migrate.c b/mm/migrate.c index 153572fb60b8..2a80136b23bb 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -605,7 +605,7 @@ static int move_to_new_page(struct page *newpage, struct page *page) | |||
605 | * establishing additional references. We are the only one | 605 | * establishing additional references. We are the only one |
606 | * holding a reference to the new page at this point. | 606 | * holding a reference to the new page at this point. |
607 | */ | 607 | */ |
608 | if (TestSetPageLocked(newpage)) | 608 | if (!trylock_page(newpage)) |
609 | BUG(); | 609 | BUG(); |
610 | 610 | ||
611 | /* Prepare mapping for the new page.*/ | 611 | /* Prepare mapping for the new page.*/ |
@@ -667,7 +667,7 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private, | |||
667 | BUG_ON(charge); | 667 | BUG_ON(charge); |
668 | 668 | ||
669 | rc = -EAGAIN; | 669 | rc = -EAGAIN; |
670 | if (TestSetPageLocked(page)) { | 670 | if (!trylock_page(page)) { |
671 | if (!force) | 671 | if (!force) |
672 | goto move_newpage; | 672 | goto move_newpage; |
673 | lock_page(page); | 673 | lock_page(page); |
diff --git a/mm/mlock.c b/mm/mlock.c index 7b2656055d6a..01fbe93eff5c 100644 --- a/mm/mlock.c +++ b/mm/mlock.c | |||
@@ -78,8 +78,6 @@ success: | |||
78 | 78 | ||
79 | mm->locked_vm -= pages; | 79 | mm->locked_vm -= pages; |
80 | out: | 80 | out: |
81 | if (ret == -ENOMEM) | ||
82 | ret = -EAGAIN; | ||
83 | return ret; | 81 | return ret; |
84 | } | 82 | } |
85 | 83 | ||
diff --git a/mm/mm_init.c b/mm/mm_init.c index c6af41ea9994..936ef2efd892 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c | |||
@@ -14,6 +14,10 @@ | |||
14 | #ifdef CONFIG_DEBUG_MEMORY_INIT | 14 | #ifdef CONFIG_DEBUG_MEMORY_INIT |
15 | int __meminitdata mminit_loglevel; | 15 | int __meminitdata mminit_loglevel; |
16 | 16 | ||
17 | #ifndef SECTIONS_SHIFT | ||
18 | #define SECTIONS_SHIFT 0 | ||
19 | #endif | ||
20 | |||
17 | /* The zonelists are simply reported, validation is manual. */ | 21 | /* The zonelists are simply reported, validation is manual. */ |
18 | void mminit_verify_zonelist(void) | 22 | void mminit_verify_zonelist(void) |
19 | { | 23 | { |
@@ -74,11 +78,7 @@ void __init mminit_verify_pageflags_layout(void) | |||
74 | NR_PAGEFLAGS); | 78 | NR_PAGEFLAGS); |
75 | mminit_dprintk(MMINIT_TRACE, "pageflags_layout_shifts", | 79 | mminit_dprintk(MMINIT_TRACE, "pageflags_layout_shifts", |
76 | "Section %d Node %d Zone %d\n", | 80 | "Section %d Node %d Zone %d\n", |
77 | #ifdef SECTIONS_SHIFT | ||
78 | SECTIONS_SHIFT, | 81 | SECTIONS_SHIFT, |
79 | #else | ||
80 | 0, | ||
81 | #endif | ||
82 | NODES_SHIFT, | 82 | NODES_SHIFT, |
83 | ZONES_SHIFT); | 83 | ZONES_SHIFT); |
84 | mminit_dprintk(MMINIT_TRACE, "pageflags_layout_offsets", | 84 | mminit_dprintk(MMINIT_TRACE, "pageflags_layout_offsets", |
@@ -370,7 +370,7 @@ find_vma_prepare(struct mm_struct *mm, unsigned long addr, | |||
370 | if (vma_tmp->vm_end > addr) { | 370 | if (vma_tmp->vm_end > addr) { |
371 | vma = vma_tmp; | 371 | vma = vma_tmp; |
372 | if (vma_tmp->vm_start <= addr) | 372 | if (vma_tmp->vm_start <= addr) |
373 | return vma; | 373 | break; |
374 | __rb_link = &__rb_parent->rb_left; | 374 | __rb_link = &__rb_parent->rb_left; |
375 | } else { | 375 | } else { |
376 | rb_prev = __rb_parent; | 376 | rb_prev = __rb_parent; |
diff --git a/mm/nommu.c b/mm/nommu.c index 5edccd9c9218..ed75bc962fbe 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -266,6 +266,27 @@ void *vmalloc_node(unsigned long size, int node) | |||
266 | } | 266 | } |
267 | EXPORT_SYMBOL(vmalloc_node); | 267 | EXPORT_SYMBOL(vmalloc_node); |
268 | 268 | ||
269 | #ifndef PAGE_KERNEL_EXEC | ||
270 | # define PAGE_KERNEL_EXEC PAGE_KERNEL | ||
271 | #endif | ||
272 | |||
273 | /** | ||
274 | * vmalloc_exec - allocate virtually contiguous, executable memory | ||
275 | * @size: allocation size | ||
276 | * | ||
277 | * Kernel-internal function to allocate enough pages to cover @size | ||
278 | * the page level allocator and map them into contiguous and | ||
279 | * executable kernel virtual space. | ||
280 | * | ||
281 | * For tight control over page level allocator and protection flags | ||
282 | * use __vmalloc() instead. | ||
283 | */ | ||
284 | |||
285 | void *vmalloc_exec(unsigned long size) | ||
286 | { | ||
287 | return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL_EXEC); | ||
288 | } | ||
289 | |||
269 | /** | 290 | /** |
270 | * vmalloc_32 - allocate virtually contiguous memory (32bit addressable) | 291 | * vmalloc_32 - allocate virtually contiguous memory (32bit addressable) |
271 | * @size: allocation size | 292 | * @size: allocation size |
@@ -422,7 +422,7 @@ int page_referenced(struct page *page, int is_locked, | |||
422 | referenced += page_referenced_anon(page, mem_cont); | 422 | referenced += page_referenced_anon(page, mem_cont); |
423 | else if (is_locked) | 423 | else if (is_locked) |
424 | referenced += page_referenced_file(page, mem_cont); | 424 | referenced += page_referenced_file(page, mem_cont); |
425 | else if (TestSetPageLocked(page)) | 425 | else if (!trylock_page(page)) |
426 | referenced++; | 426 | referenced++; |
427 | else { | 427 | else { |
428 | if (page->mapping) | 428 | if (page->mapping) |
diff --git a/mm/shmem.c b/mm/shmem.c index c1e5a3b4f758..04fb4f1ab88e 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -1265,7 +1265,7 @@ repeat: | |||
1265 | } | 1265 | } |
1266 | 1266 | ||
1267 | /* We have to do this with page locked to prevent races */ | 1267 | /* We have to do this with page locked to prevent races */ |
1268 | if (TestSetPageLocked(swappage)) { | 1268 | if (!trylock_page(swappage)) { |
1269 | shmem_swp_unmap(entry); | 1269 | shmem_swp_unmap(entry); |
1270 | spin_unlock(&info->lock); | 1270 | spin_unlock(&info->lock); |
1271 | wait_on_page_locked(swappage); | 1271 | wait_on_page_locked(swappage); |
@@ -1329,7 +1329,7 @@ repeat: | |||
1329 | shmem_swp_unmap(entry); | 1329 | shmem_swp_unmap(entry); |
1330 | filepage = find_get_page(mapping, idx); | 1330 | filepage = find_get_page(mapping, idx); |
1331 | if (filepage && | 1331 | if (filepage && |
1332 | (!PageUptodate(filepage) || TestSetPageLocked(filepage))) { | 1332 | (!PageUptodate(filepage) || !trylock_page(filepage))) { |
1333 | spin_unlock(&info->lock); | 1333 | spin_unlock(&info->lock); |
1334 | wait_on_page_locked(filepage); | 1334 | wait_on_page_locked(filepage); |
1335 | page_cache_release(filepage); | 1335 | page_cache_release(filepage); |
@@ -444,7 +444,7 @@ void pagevec_strip(struct pagevec *pvec) | |||
444 | for (i = 0; i < pagevec_count(pvec); i++) { | 444 | for (i = 0; i < pagevec_count(pvec); i++) { |
445 | struct page *page = pvec->pages[i]; | 445 | struct page *page = pvec->pages[i]; |
446 | 446 | ||
447 | if (PagePrivate(page) && !TestSetPageLocked(page)) { | 447 | if (PagePrivate(page) && trylock_page(page)) { |
448 | if (PagePrivate(page)) | 448 | if (PagePrivate(page)) |
449 | try_to_release_page(page, 0); | 449 | try_to_release_page(page, 0); |
450 | unlock_page(page); | 450 | unlock_page(page); |
diff --git a/mm/swap_state.c b/mm/swap_state.c index b8035b055129..167cf2dc8a03 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c | |||
@@ -201,7 +201,7 @@ void delete_from_swap_cache(struct page *page) | |||
201 | */ | 201 | */ |
202 | static inline void free_swap_cache(struct page *page) | 202 | static inline void free_swap_cache(struct page *page) |
203 | { | 203 | { |
204 | if (PageSwapCache(page) && !TestSetPageLocked(page)) { | 204 | if (PageSwapCache(page) && trylock_page(page)) { |
205 | remove_exclusive_swap_page(page); | 205 | remove_exclusive_swap_page(page); |
206 | unlock_page(page); | 206 | unlock_page(page); |
207 | } | 207 | } |
@@ -302,9 +302,9 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, | |||
302 | * re-using the just freed swap entry for an existing page. | 302 | * re-using the just freed swap entry for an existing page. |
303 | * May fail (-ENOMEM) if radix-tree node allocation failed. | 303 | * May fail (-ENOMEM) if radix-tree node allocation failed. |
304 | */ | 304 | */ |
305 | SetPageLocked(new_page); | 305 | set_page_locked(new_page); |
306 | err = add_to_swap_cache(new_page, entry, gfp_mask & GFP_KERNEL); | 306 | err = add_to_swap_cache(new_page, entry, gfp_mask & GFP_KERNEL); |
307 | if (!err) { | 307 | if (likely(!err)) { |
308 | /* | 308 | /* |
309 | * Initiate read into locked page and return. | 309 | * Initiate read into locked page and return. |
310 | */ | 310 | */ |
@@ -312,7 +312,7 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, | |||
312 | swap_readpage(NULL, new_page); | 312 | swap_readpage(NULL, new_page); |
313 | return new_page; | 313 | return new_page; |
314 | } | 314 | } |
315 | ClearPageLocked(new_page); | 315 | clear_page_locked(new_page); |
316 | swap_free(entry); | 316 | swap_free(entry); |
317 | } while (err != -ENOMEM); | 317 | } while (err != -ENOMEM); |
318 | 318 | ||
diff --git a/mm/swapfile.c b/mm/swapfile.c index bb7f79641f9e..1e330f2998fa 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c | |||
@@ -403,7 +403,7 @@ void free_swap_and_cache(swp_entry_t entry) | |||
403 | if (p) { | 403 | if (p) { |
404 | if (swap_entry_free(p, swp_offset(entry)) == 1) { | 404 | if (swap_entry_free(p, swp_offset(entry)) == 1) { |
405 | page = find_get_page(&swapper_space, entry.val); | 405 | page = find_get_page(&swapper_space, entry.val); |
406 | if (page && unlikely(TestSetPageLocked(page))) { | 406 | if (page && unlikely(!trylock_page(page))) { |
407 | page_cache_release(page); | 407 | page_cache_release(page); |
408 | page = NULL; | 408 | page = NULL; |
409 | } | 409 | } |
diff --git a/mm/truncate.c b/mm/truncate.c index 894e9a70699f..250505091d37 100644 --- a/mm/truncate.c +++ b/mm/truncate.c | |||
@@ -187,7 +187,7 @@ void truncate_inode_pages_range(struct address_space *mapping, | |||
187 | if (page_index > next) | 187 | if (page_index > next) |
188 | next = page_index; | 188 | next = page_index; |
189 | next++; | 189 | next++; |
190 | if (TestSetPageLocked(page)) | 190 | if (!trylock_page(page)) |
191 | continue; | 191 | continue; |
192 | if (PageWriteback(page)) { | 192 | if (PageWriteback(page)) { |
193 | unlock_page(page); | 193 | unlock_page(page); |
@@ -280,7 +280,7 @@ unsigned long __invalidate_mapping_pages(struct address_space *mapping, | |||
280 | pgoff_t index; | 280 | pgoff_t index; |
281 | int lock_failed; | 281 | int lock_failed; |
282 | 282 | ||
283 | lock_failed = TestSetPageLocked(page); | 283 | lock_failed = !trylock_page(page); |
284 | 284 | ||
285 | /* | 285 | /* |
286 | * We really shouldn't be looking at the ->index of an | 286 | * We really shouldn't be looking at the ->index of an |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 75be453628bf..1ff1a58e7c10 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -496,7 +496,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
496 | page = lru_to_page(page_list); | 496 | page = lru_to_page(page_list); |
497 | list_del(&page->lru); | 497 | list_del(&page->lru); |
498 | 498 | ||
499 | if (TestSetPageLocked(page)) | 499 | if (!trylock_page(page)) |
500 | goto keep; | 500 | goto keep; |
501 | 501 | ||
502 | VM_BUG_ON(PageActive(page)); | 502 | VM_BUG_ON(PageActive(page)); |
@@ -582,7 +582,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
582 | * A synchronous write - probably a ramdisk. Go | 582 | * A synchronous write - probably a ramdisk. Go |
583 | * ahead and try to reclaim the page. | 583 | * ahead and try to reclaim the page. |
584 | */ | 584 | */ |
585 | if (TestSetPageLocked(page)) | 585 | if (!trylock_page(page)) |
586 | goto keep; | 586 | goto keep; |
587 | if (PageDirty(page) || PageWriteback(page)) | 587 | if (PageDirty(page) || PageWriteback(page)) |
588 | goto keep_locked; | 588 | goto keep_locked; |
diff --git a/net/ax25/sysctl_net_ax25.c b/net/ax25/sysctl_net_ax25.c index f597987b2424..f288fc4aef9b 100644 --- a/net/ax25/sysctl_net_ax25.c +++ b/net/ax25/sysctl_net_ax25.c | |||
@@ -36,6 +36,7 @@ static struct ctl_path ax25_path[] = { | |||
36 | { .procname = "ax25", .ctl_name = NET_AX25, }, | 36 | { .procname = "ax25", .ctl_name = NET_AX25, }, |
37 | { } | 37 | { } |
38 | }; | 38 | }; |
39 | |||
39 | static const ctl_table ax25_param_table[] = { | 40 | static const ctl_table ax25_param_table[] = { |
40 | { | 41 | { |
41 | .ctl_name = NET_AX25_IP_DEFAULT_MODE, | 42 | .ctl_name = NET_AX25_IP_DEFAULT_MODE, |
@@ -167,6 +168,7 @@ static const ctl_table ax25_param_table[] = { | |||
167 | .extra1 = &min_proto, | 168 | .extra1 = &min_proto, |
168 | .extra2 = &max_proto | 169 | .extra2 = &max_proto |
169 | }, | 170 | }, |
171 | #ifdef CONFIG_AX25_DAMA_SLAVE | ||
170 | { | 172 | { |
171 | .ctl_name = NET_AX25_DAMA_SLAVE_TIMEOUT, | 173 | .ctl_name = NET_AX25_DAMA_SLAVE_TIMEOUT, |
172 | .procname = "dama_slave_timeout", | 174 | .procname = "dama_slave_timeout", |
@@ -177,6 +179,8 @@ static const ctl_table ax25_param_table[] = { | |||
177 | .extra1 = &min_ds_timeout, | 179 | .extra1 = &min_ds_timeout, |
178 | .extra2 = &max_ds_timeout | 180 | .extra2 = &max_ds_timeout |
179 | }, | 181 | }, |
182 | #endif | ||
183 | |||
180 | { .ctl_name = 0 } /* that's all, folks! */ | 184 | { .ctl_name = 0 } /* that's all, folks! */ |
181 | }; | 185 | }; |
182 | 186 | ||
@@ -210,16 +214,6 @@ void ax25_register_sysctl(void) | |||
210 | ax25_table[n].procname = ax25_dev->dev->name; | 214 | ax25_table[n].procname = ax25_dev->dev->name; |
211 | ax25_table[n].mode = 0555; | 215 | ax25_table[n].mode = 0555; |
212 | 216 | ||
213 | #ifndef CONFIG_AX25_DAMA_SLAVE | ||
214 | /* | ||
215 | * We do not wish to have a representation of this parameter | ||
216 | * in /proc/sys/ when configured *not* to include the | ||
217 | * AX.25 DAMA slave code, do we? | ||
218 | */ | ||
219 | |||
220 | child[AX25_VALUES_DS_TIMEOUT].procname = NULL; | ||
221 | #endif | ||
222 | |||
223 | child[AX25_MAX_VALUES].ctl_name = 0; /* just in case... */ | 217 | child[AX25_MAX_VALUES].ctl_name = 0; /* just in case... */ |
224 | 218 | ||
225 | for (k = 0; k < AX25_MAX_VALUES; k++) | 219 | for (k = 0; k < AX25_MAX_VALUES; k++) |
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index 6e280a8a31ee..6a9a6cd74b1e 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
@@ -113,7 +113,7 @@ void br_netfilter_rtable_init(struct net_bridge *br) | |||
113 | struct rtable *rt = &br->fake_rtable; | 113 | struct rtable *rt = &br->fake_rtable; |
114 | 114 | ||
115 | atomic_set(&rt->u.dst.__refcnt, 1); | 115 | atomic_set(&rt->u.dst.__refcnt, 1); |
116 | rt->u.dst.dev = &br->dev; | 116 | rt->u.dst.dev = br->dev; |
117 | rt->u.dst.path = &rt->u.dst; | 117 | rt->u.dst.path = &rt->u.dst; |
118 | rt->u.dst.metrics[RTAX_MTU - 1] = 1500; | 118 | rt->u.dst.metrics[RTAX_MTU - 1] = 1500; |
119 | rt->u.dst.flags = DST_NOXFRM; | 119 | rt->u.dst.flags = DST_NOXFRM; |
diff --git a/net/bridge/br_stp.c b/net/bridge/br_stp.c index 921bbe5cb94a..6e63ec3f1fcf 100644 --- a/net/bridge/br_stp.c +++ b/net/bridge/br_stp.c | |||
@@ -368,14 +368,25 @@ static void br_make_blocking(struct net_bridge_port *p) | |||
368 | /* called under bridge lock */ | 368 | /* called under bridge lock */ |
369 | static void br_make_forwarding(struct net_bridge_port *p) | 369 | static void br_make_forwarding(struct net_bridge_port *p) |
370 | { | 370 | { |
371 | if (p->state == BR_STATE_BLOCKING) { | 371 | struct net_bridge *br = p->br; |
372 | if (p->br->stp_enabled == BR_KERNEL_STP) | ||
373 | p->state = BR_STATE_LISTENING; | ||
374 | else | ||
375 | p->state = BR_STATE_LEARNING; | ||
376 | 372 | ||
377 | br_log_state(p); | 373 | if (p->state != BR_STATE_BLOCKING) |
378 | mod_timer(&p->forward_delay_timer, jiffies + p->br->forward_delay); } | 374 | return; |
375 | |||
376 | if (br->forward_delay == 0) { | ||
377 | p->state = BR_STATE_FORWARDING; | ||
378 | br_topology_change_detection(br); | ||
379 | del_timer(&p->forward_delay_timer); | ||
380 | } | ||
381 | else if (p->br->stp_enabled == BR_KERNEL_STP) | ||
382 | p->state = BR_STATE_LISTENING; | ||
383 | else | ||
384 | p->state = BR_STATE_LEARNING; | ||
385 | |||
386 | br_log_state(p); | ||
387 | |||
388 | if (br->forward_delay != 0) | ||
389 | mod_timer(&p->forward_delay_timer, jiffies + br->forward_delay); | ||
379 | } | 390 | } |
380 | 391 | ||
381 | /* called under bridge lock */ | 392 | /* called under bridge lock */ |
diff --git a/net/core/dev.c b/net/core/dev.c index 69320a56a084..01993ad74e76 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1796,7 +1796,7 @@ gso: | |||
1796 | skb->tc_verd = SET_TC_AT(skb->tc_verd,AT_EGRESS); | 1796 | skb->tc_verd = SET_TC_AT(skb->tc_verd,AT_EGRESS); |
1797 | #endif | 1797 | #endif |
1798 | if (q->enqueue) { | 1798 | if (q->enqueue) { |
1799 | spinlock_t *root_lock = qdisc_root_lock(q); | 1799 | spinlock_t *root_lock = qdisc_lock(q); |
1800 | 1800 | ||
1801 | spin_lock(root_lock); | 1801 | spin_lock(root_lock); |
1802 | 1802 | ||
@@ -1805,7 +1805,6 @@ gso: | |||
1805 | 1805 | ||
1806 | spin_unlock(root_lock); | 1806 | spin_unlock(root_lock); |
1807 | 1807 | ||
1808 | rc = rc == NET_XMIT_BYPASS ? NET_XMIT_SUCCESS : rc; | ||
1809 | goto out; | 1808 | goto out; |
1810 | } | 1809 | } |
1811 | 1810 | ||
@@ -1909,7 +1908,6 @@ int netif_rx(struct sk_buff *skb) | |||
1909 | if (queue->input_pkt_queue.qlen <= netdev_max_backlog) { | 1908 | if (queue->input_pkt_queue.qlen <= netdev_max_backlog) { |
1910 | if (queue->input_pkt_queue.qlen) { | 1909 | if (queue->input_pkt_queue.qlen) { |
1911 | enqueue: | 1910 | enqueue: |
1912 | dev_hold(skb->dev); | ||
1913 | __skb_queue_tail(&queue->input_pkt_queue, skb); | 1911 | __skb_queue_tail(&queue->input_pkt_queue, skb); |
1914 | local_irq_restore(flags); | 1912 | local_irq_restore(flags); |
1915 | return NET_RX_SUCCESS; | 1913 | return NET_RX_SUCCESS; |
@@ -1995,7 +1993,7 @@ static void net_tx_action(struct softirq_action *h) | |||
1995 | smp_mb__before_clear_bit(); | 1993 | smp_mb__before_clear_bit(); |
1996 | clear_bit(__QDISC_STATE_SCHED, &q->state); | 1994 | clear_bit(__QDISC_STATE_SCHED, &q->state); |
1997 | 1995 | ||
1998 | root_lock = qdisc_root_lock(q); | 1996 | root_lock = qdisc_lock(q); |
1999 | if (spin_trylock(root_lock)) { | 1997 | if (spin_trylock(root_lock)) { |
2000 | qdisc_run(q); | 1998 | qdisc_run(q); |
2001 | spin_unlock(root_lock); | 1999 | spin_unlock(root_lock); |
@@ -2270,6 +2268,20 @@ out: | |||
2270 | return ret; | 2268 | return ret; |
2271 | } | 2269 | } |
2272 | 2270 | ||
2271 | /* Network device is going away, flush any packets still pending */ | ||
2272 | static void flush_backlog(void *arg) | ||
2273 | { | ||
2274 | struct net_device *dev = arg; | ||
2275 | struct softnet_data *queue = &__get_cpu_var(softnet_data); | ||
2276 | struct sk_buff *skb, *tmp; | ||
2277 | |||
2278 | skb_queue_walk_safe(&queue->input_pkt_queue, skb, tmp) | ||
2279 | if (skb->dev == dev) { | ||
2280 | __skb_unlink(skb, &queue->input_pkt_queue); | ||
2281 | kfree_skb(skb); | ||
2282 | } | ||
2283 | } | ||
2284 | |||
2273 | static int process_backlog(struct napi_struct *napi, int quota) | 2285 | static int process_backlog(struct napi_struct *napi, int quota) |
2274 | { | 2286 | { |
2275 | int work = 0; | 2287 | int work = 0; |
@@ -2279,7 +2291,6 @@ static int process_backlog(struct napi_struct *napi, int quota) | |||
2279 | napi->weight = weight_p; | 2291 | napi->weight = weight_p; |
2280 | do { | 2292 | do { |
2281 | struct sk_buff *skb; | 2293 | struct sk_buff *skb; |
2282 | struct net_device *dev; | ||
2283 | 2294 | ||
2284 | local_irq_disable(); | 2295 | local_irq_disable(); |
2285 | skb = __skb_dequeue(&queue->input_pkt_queue); | 2296 | skb = __skb_dequeue(&queue->input_pkt_queue); |
@@ -2288,14 +2299,9 @@ static int process_backlog(struct napi_struct *napi, int quota) | |||
2288 | local_irq_enable(); | 2299 | local_irq_enable(); |
2289 | break; | 2300 | break; |
2290 | } | 2301 | } |
2291 | |||
2292 | local_irq_enable(); | 2302 | local_irq_enable(); |
2293 | 2303 | ||
2294 | dev = skb->dev; | ||
2295 | |||
2296 | netif_receive_skb(skb); | 2304 | netif_receive_skb(skb); |
2297 | |||
2298 | dev_put(dev); | ||
2299 | } while (++work < quota && jiffies == start_time); | 2305 | } while (++work < quota && jiffies == start_time); |
2300 | 2306 | ||
2301 | return work; | 2307 | return work; |
@@ -3988,6 +3994,10 @@ int register_netdevice(struct net_device *dev) | |||
3988 | } | 3994 | } |
3989 | } | 3995 | } |
3990 | 3996 | ||
3997 | /* Enable software GSO if SG is supported. */ | ||
3998 | if (dev->features & NETIF_F_SG) | ||
3999 | dev->features |= NETIF_F_GSO; | ||
4000 | |||
3991 | netdev_initialize_kobject(dev); | 4001 | netdev_initialize_kobject(dev); |
3992 | ret = netdev_register_kobject(dev); | 4002 | ret = netdev_register_kobject(dev); |
3993 | if (ret) | 4003 | if (ret) |
@@ -4165,6 +4175,8 @@ void netdev_run_todo(void) | |||
4165 | 4175 | ||
4166 | dev->reg_state = NETREG_UNREGISTERED; | 4176 | dev->reg_state = NETREG_UNREGISTERED; |
4167 | 4177 | ||
4178 | on_each_cpu(flush_backlog, dev, 1); | ||
4179 | |||
4168 | netdev_wait_allrefs(dev); | 4180 | netdev_wait_allrefs(dev); |
4169 | 4181 | ||
4170 | /* paranoia */ | 4182 | /* paranoia */ |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index f62c8af85d38..9d92e41826e7 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
@@ -2281,6 +2281,7 @@ static struct neighbour *neigh_get_idx(struct seq_file *seq, loff_t *pos) | |||
2281 | struct neighbour *n = neigh_get_first(seq); | 2281 | struct neighbour *n = neigh_get_first(seq); |
2282 | 2282 | ||
2283 | if (n) { | 2283 | if (n) { |
2284 | --(*pos); | ||
2284 | while (*pos) { | 2285 | while (*pos) { |
2285 | n = neigh_get_next(seq, n, pos); | 2286 | n = neigh_get_next(seq, n, pos); |
2286 | if (!n) | 2287 | if (!n) |
@@ -2341,6 +2342,7 @@ static struct pneigh_entry *pneigh_get_idx(struct seq_file *seq, loff_t *pos) | |||
2341 | struct pneigh_entry *pn = pneigh_get_first(seq); | 2342 | struct pneigh_entry *pn = pneigh_get_first(seq); |
2342 | 2343 | ||
2343 | if (pn) { | 2344 | if (pn) { |
2345 | --(*pos); | ||
2344 | while (*pos) { | 2346 | while (*pos) { |
2345 | pn = pneigh_get_next(seq, pn, pos); | 2347 | pn = pneigh_get_next(seq, pn, pos); |
2346 | if (!pn) | 2348 | if (!pn) |
@@ -2354,10 +2356,11 @@ static void *neigh_get_idx_any(struct seq_file *seq, loff_t *pos) | |||
2354 | { | 2356 | { |
2355 | struct neigh_seq_state *state = seq->private; | 2357 | struct neigh_seq_state *state = seq->private; |
2356 | void *rc; | 2358 | void *rc; |
2359 | loff_t idxpos = *pos; | ||
2357 | 2360 | ||
2358 | rc = neigh_get_idx(seq, pos); | 2361 | rc = neigh_get_idx(seq, &idxpos); |
2359 | if (!rc && !(state->flags & NEIGH_SEQ_NEIGH_ONLY)) | 2362 | if (!rc && !(state->flags & NEIGH_SEQ_NEIGH_ONLY)) |
2360 | rc = pneigh_get_idx(seq, pos); | 2363 | rc = pneigh_get_idx(seq, &idxpos); |
2361 | 2364 | ||
2362 | return rc; | 2365 | return rc; |
2363 | } | 2366 | } |
@@ -2366,7 +2369,6 @@ void *neigh_seq_start(struct seq_file *seq, loff_t *pos, struct neigh_table *tbl | |||
2366 | __acquires(tbl->lock) | 2369 | __acquires(tbl->lock) |
2367 | { | 2370 | { |
2368 | struct neigh_seq_state *state = seq->private; | 2371 | struct neigh_seq_state *state = seq->private; |
2369 | loff_t pos_minus_one; | ||
2370 | 2372 | ||
2371 | state->tbl = tbl; | 2373 | state->tbl = tbl; |
2372 | state->bucket = 0; | 2374 | state->bucket = 0; |
@@ -2374,8 +2376,7 @@ void *neigh_seq_start(struct seq_file *seq, loff_t *pos, struct neigh_table *tbl | |||
2374 | 2376 | ||
2375 | read_lock_bh(&tbl->lock); | 2377 | read_lock_bh(&tbl->lock); |
2376 | 2378 | ||
2377 | pos_minus_one = *pos - 1; | 2379 | return *pos ? neigh_get_idx_any(seq, pos) : SEQ_START_TOKEN; |
2378 | return *pos ? neigh_get_idx_any(seq, &pos_minus_one) : SEQ_START_TOKEN; | ||
2379 | } | 2380 | } |
2380 | EXPORT_SYMBOL(neigh_seq_start); | 2381 | EXPORT_SYMBOL(neigh_seq_start); |
2381 | 2382 | ||
@@ -2385,7 +2386,7 @@ void *neigh_seq_next(struct seq_file *seq, void *v, loff_t *pos) | |||
2385 | void *rc; | 2386 | void *rc; |
2386 | 2387 | ||
2387 | if (v == SEQ_START_TOKEN) { | 2388 | if (v == SEQ_START_TOKEN) { |
2388 | rc = neigh_get_idx(seq, pos); | 2389 | rc = neigh_get_first(seq); |
2389 | goto out; | 2390 | goto out; |
2390 | } | 2391 | } |
2391 | 2392 | ||
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 3284605f2ec7..2498cdaf8cbe 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -2085,15 +2085,19 @@ static inline int f_pick(struct pktgen_dev *pkt_dev) | |||
2085 | if (pkt_dev->flows[flow].count >= pkt_dev->lflow) { | 2085 | if (pkt_dev->flows[flow].count >= pkt_dev->lflow) { |
2086 | /* reset time */ | 2086 | /* reset time */ |
2087 | pkt_dev->flows[flow].count = 0; | 2087 | pkt_dev->flows[flow].count = 0; |
2088 | pkt_dev->flows[flow].flags = 0; | ||
2088 | pkt_dev->curfl += 1; | 2089 | pkt_dev->curfl += 1; |
2089 | if (pkt_dev->curfl >= pkt_dev->cflows) | 2090 | if (pkt_dev->curfl >= pkt_dev->cflows) |
2090 | pkt_dev->curfl = 0; /*reset */ | 2091 | pkt_dev->curfl = 0; /*reset */ |
2091 | } | 2092 | } |
2092 | } else { | 2093 | } else { |
2093 | flow = random32() % pkt_dev->cflows; | 2094 | flow = random32() % pkt_dev->cflows; |
2095 | pkt_dev->curfl = flow; | ||
2094 | 2096 | ||
2095 | if (pkt_dev->flows[flow].count > pkt_dev->lflow) | 2097 | if (pkt_dev->flows[flow].count > pkt_dev->lflow) { |
2096 | pkt_dev->flows[flow].count = 0; | 2098 | pkt_dev->flows[flow].count = 0; |
2099 | pkt_dev->flows[flow].flags = 0; | ||
2100 | } | ||
2097 | } | 2101 | } |
2098 | 2102 | ||
2099 | return pkt_dev->curfl; | 2103 | return pkt_dev->curfl; |
@@ -2162,7 +2166,7 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) | |||
2162 | mc = random32() % pkt_dev->src_mac_count; | 2166 | mc = random32() % pkt_dev->src_mac_count; |
2163 | else { | 2167 | else { |
2164 | mc = pkt_dev->cur_src_mac_offset++; | 2168 | mc = pkt_dev->cur_src_mac_offset++; |
2165 | if (pkt_dev->cur_src_mac_offset > | 2169 | if (pkt_dev->cur_src_mac_offset >= |
2166 | pkt_dev->src_mac_count) | 2170 | pkt_dev->src_mac_count) |
2167 | pkt_dev->cur_src_mac_offset = 0; | 2171 | pkt_dev->cur_src_mac_offset = 0; |
2168 | } | 2172 | } |
@@ -2189,7 +2193,7 @@ static void mod_cur_headers(struct pktgen_dev *pkt_dev) | |||
2189 | 2193 | ||
2190 | else { | 2194 | else { |
2191 | mc = pkt_dev->cur_dst_mac_offset++; | 2195 | mc = pkt_dev->cur_dst_mac_offset++; |
2192 | if (pkt_dev->cur_dst_mac_offset > | 2196 | if (pkt_dev->cur_dst_mac_offset >= |
2193 | pkt_dev->dst_mac_count) { | 2197 | pkt_dev->dst_mac_count) { |
2194 | pkt_dev->cur_dst_mac_offset = 0; | 2198 | pkt_dev->cur_dst_mac_offset = 0; |
2195 | } | 2199 | } |
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index 770d827f5ab8..e0689fd7b798 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c | |||
@@ -232,6 +232,7 @@ static struct ctl_table ipv4_table[] = { | |||
232 | .mode = 0644, | 232 | .mode = 0644, |
233 | .proc_handler = &ipv4_doint_and_flush, | 233 | .proc_handler = &ipv4_doint_and_flush, |
234 | .strategy = &ipv4_doint_and_flush_strategy, | 234 | .strategy = &ipv4_doint_and_flush_strategy, |
235 | .extra2 = &init_net, | ||
235 | }, | 236 | }, |
236 | { | 237 | { |
237 | .ctl_name = NET_IPV4_NO_PMTU_DISC, | 238 | .ctl_name = NET_IPV4_NO_PMTU_DISC, |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index a027003d69a4..a4402de425d9 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -269,7 +269,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | |||
269 | skb->mark = sk->sk_mark; | 269 | skb->mark = sk->sk_mark; |
270 | 270 | ||
271 | mtu = dst_mtu(dst); | 271 | mtu = dst_mtu(dst); |
272 | if ((skb->len <= mtu) || ipfragok || skb_is_gso(skb)) { | 272 | if ((skb->len <= mtu) || skb->local_df || skb_is_gso(skb)) { |
273 | IP6_INC_STATS(ip6_dst_idev(skb->dst), | 273 | IP6_INC_STATS(ip6_dst_idev(skb->dst), |
274 | IPSTATS_MIB_OUTREQUESTS); | 274 | IPSTATS_MIB_OUTREQUESTS); |
275 | return NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, dst->dev, | 275 | return NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, dst->dev, |
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index ea33b26512c2..741cfcd96f88 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -346,6 +346,8 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, | |||
346 | */ | 346 | */ |
347 | if (optlen == 0) | 347 | if (optlen == 0) |
348 | optval = NULL; | 348 | optval = NULL; |
349 | else if (optval == NULL) | ||
350 | goto e_inval; | ||
349 | else if (optlen < sizeof(struct ipv6_opt_hdr) || | 351 | else if (optlen < sizeof(struct ipv6_opt_hdr) || |
350 | optlen & 0x7 || optlen > 8 * 255) | 352 | optlen & 0x7 || optlen > 8 * 255) |
351 | goto e_inval; | 353 | goto e_inval; |
diff --git a/net/ipv6/syncookies.c b/net/ipv6/syncookies.c index a46badd1082d..ec394cf5a19b 100644 --- a/net/ipv6/syncookies.c +++ b/net/ipv6/syncookies.c | |||
@@ -199,10 +199,8 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) | |||
199 | ireq6 = inet6_rsk(req); | 199 | ireq6 = inet6_rsk(req); |
200 | treq = tcp_rsk(req); | 200 | treq = tcp_rsk(req); |
201 | 201 | ||
202 | if (security_inet_conn_request(sk, skb, req)) { | 202 | if (security_inet_conn_request(sk, skb, req)) |
203 | reqsk_free(req); | 203 | goto out_free; |
204 | goto out; | ||
205 | } | ||
206 | 204 | ||
207 | req->mss = mss; | 205 | req->mss = mss; |
208 | ireq->rmt_port = th->source; | 206 | ireq->rmt_port = th->source; |
@@ -255,14 +253,13 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) | |||
255 | fl.fl_ip_dport = inet_rsk(req)->rmt_port; | 253 | fl.fl_ip_dport = inet_rsk(req)->rmt_port; |
256 | fl.fl_ip_sport = inet_sk(sk)->sport; | 254 | fl.fl_ip_sport = inet_sk(sk)->sport; |
257 | security_req_classify_flow(req, &fl); | 255 | security_req_classify_flow(req, &fl); |
258 | if (ip6_dst_lookup(sk, &dst, &fl)) { | 256 | if (ip6_dst_lookup(sk, &dst, &fl)) |
259 | reqsk_free(req); | 257 | goto out_free; |
260 | goto out; | 258 | |
261 | } | ||
262 | if (final_p) | 259 | if (final_p) |
263 | ipv6_addr_copy(&fl.fl6_dst, final_p); | 260 | ipv6_addr_copy(&fl.fl6_dst, final_p); |
264 | if ((xfrm_lookup(&dst, &fl, sk, 0)) < 0) | 261 | if ((xfrm_lookup(&dst, &fl, sk, 0)) < 0) |
265 | goto out; | 262 | goto out_free; |
266 | } | 263 | } |
267 | 264 | ||
268 | req->window_clamp = tp->window_clamp ? :dst_metric(dst, RTAX_WINDOW); | 265 | req->window_clamp = tp->window_clamp ? :dst_metric(dst, RTAX_WINDOW); |
@@ -273,7 +270,10 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) | |||
273 | ireq->rcv_wscale = rcv_wscale; | 270 | ireq->rcv_wscale = rcv_wscale; |
274 | 271 | ||
275 | ret = get_cookie_sock(sk, skb, req, dst); | 272 | ret = get_cookie_sock(sk, skb, req, dst); |
276 | 273 | out: | |
277 | out: return ret; | 274 | return ret; |
275 | out_free: | ||
276 | reqsk_free(req); | ||
277 | return NULL; | ||
278 | } | 278 | } |
279 | 279 | ||
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index a4f9a832722a..ec59345af65b 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -82,6 +82,7 @@ struct ieee80211_sta_bss { | |||
82 | 82 | ||
83 | u8 bssid[ETH_ALEN]; | 83 | u8 bssid[ETH_ALEN]; |
84 | u8 ssid[IEEE80211_MAX_SSID_LEN]; | 84 | u8 ssid[IEEE80211_MAX_SSID_LEN]; |
85 | u8 dtim_period; | ||
85 | u16 capability; /* host byte order */ | 86 | u16 capability; /* host byte order */ |
86 | enum ieee80211_band band; | 87 | enum ieee80211_band band; |
87 | int freq; | 88 | int freq; |
@@ -586,6 +587,7 @@ struct ieee80211_local { | |||
586 | struct timer_list sta_cleanup; | 587 | struct timer_list sta_cleanup; |
587 | 588 | ||
588 | unsigned long queues_pending[BITS_TO_LONGS(IEEE80211_MAX_QUEUES)]; | 589 | unsigned long queues_pending[BITS_TO_LONGS(IEEE80211_MAX_QUEUES)]; |
590 | unsigned long queues_pending_run[BITS_TO_LONGS(IEEE80211_MAX_QUEUES)]; | ||
589 | struct ieee80211_tx_stored_packet pending_packet[IEEE80211_MAX_QUEUES]; | 591 | struct ieee80211_tx_stored_packet pending_packet[IEEE80211_MAX_QUEUES]; |
590 | struct tasklet_struct tx_pending_tasklet; | 592 | struct tasklet_struct tx_pending_tasklet; |
591 | 593 | ||
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index a4c5b90de769..0c02c471bca2 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -1689,6 +1689,11 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
1689 | if (local->hw.conf.beacon_int < 10) | 1689 | if (local->hw.conf.beacon_int < 10) |
1690 | local->hw.conf.beacon_int = 100; | 1690 | local->hw.conf.beacon_int = 100; |
1691 | 1691 | ||
1692 | if (local->hw.max_listen_interval == 0) | ||
1693 | local->hw.max_listen_interval = 1; | ||
1694 | |||
1695 | local->hw.conf.listen_interval = local->hw.max_listen_interval; | ||
1696 | |||
1692 | local->wstats_flags |= local->hw.flags & (IEEE80211_HW_SIGNAL_UNSPEC | | 1697 | local->wstats_flags |= local->hw.flags & (IEEE80211_HW_SIGNAL_UNSPEC | |
1693 | IEEE80211_HW_SIGNAL_DB | | 1698 | IEEE80211_HW_SIGNAL_DB | |
1694 | IEEE80211_HW_SIGNAL_DBM) ? | 1699 | IEEE80211_HW_SIGNAL_DBM) ? |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index acb04133a95d..e1d11c9b6729 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -551,6 +551,7 @@ static void ieee80211_set_associated(struct net_device *dev, | |||
551 | /* set timing information */ | 551 | /* set timing information */ |
552 | sdata->bss_conf.beacon_int = bss->beacon_int; | 552 | sdata->bss_conf.beacon_int = bss->beacon_int; |
553 | sdata->bss_conf.timestamp = bss->timestamp; | 553 | sdata->bss_conf.timestamp = bss->timestamp; |
554 | sdata->bss_conf.dtim_period = bss->dtim_period; | ||
554 | 555 | ||
555 | changed |= ieee80211_handle_bss_capability(sdata, bss); | 556 | changed |= ieee80211_handle_bss_capability(sdata, bss); |
556 | 557 | ||
@@ -773,7 +774,8 @@ static void ieee80211_send_assoc(struct net_device *dev, | |||
773 | mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT, | 774 | mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT, |
774 | IEEE80211_STYPE_REASSOC_REQ); | 775 | IEEE80211_STYPE_REASSOC_REQ); |
775 | mgmt->u.reassoc_req.capab_info = cpu_to_le16(capab); | 776 | mgmt->u.reassoc_req.capab_info = cpu_to_le16(capab); |
776 | mgmt->u.reassoc_req.listen_interval = cpu_to_le16(1); | 777 | mgmt->u.reassoc_req.listen_interval = |
778 | cpu_to_le16(local->hw.conf.listen_interval); | ||
777 | memcpy(mgmt->u.reassoc_req.current_ap, ifsta->prev_bssid, | 779 | memcpy(mgmt->u.reassoc_req.current_ap, ifsta->prev_bssid, |
778 | ETH_ALEN); | 780 | ETH_ALEN); |
779 | } else { | 781 | } else { |
@@ -781,7 +783,8 @@ static void ieee80211_send_assoc(struct net_device *dev, | |||
781 | mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT, | 783 | mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT, |
782 | IEEE80211_STYPE_ASSOC_REQ); | 784 | IEEE80211_STYPE_ASSOC_REQ); |
783 | mgmt->u.assoc_req.capab_info = cpu_to_le16(capab); | 785 | mgmt->u.assoc_req.capab_info = cpu_to_le16(capab); |
784 | mgmt->u.assoc_req.listen_interval = cpu_to_le16(1); | 786 | mgmt->u.reassoc_req.listen_interval = |
787 | cpu_to_le16(local->hw.conf.listen_interval); | ||
785 | } | 788 | } |
786 | 789 | ||
787 | /* SSID */ | 790 | /* SSID */ |
@@ -2688,6 +2691,16 @@ static void ieee80211_rx_bss_info(struct net_device *dev, | |||
2688 | bss->beacon_int = le16_to_cpu(mgmt->u.beacon.beacon_int); | 2691 | bss->beacon_int = le16_to_cpu(mgmt->u.beacon.beacon_int); |
2689 | bss->capability = le16_to_cpu(mgmt->u.beacon.capab_info); | 2692 | bss->capability = le16_to_cpu(mgmt->u.beacon.capab_info); |
2690 | 2693 | ||
2694 | if (elems->tim) { | ||
2695 | struct ieee80211_tim_ie *tim_ie = | ||
2696 | (struct ieee80211_tim_ie *)elems->tim; | ||
2697 | bss->dtim_period = tim_ie->dtim_period; | ||
2698 | } | ||
2699 | |||
2700 | /* set default value for buggy APs */ | ||
2701 | if (!elems->tim || bss->dtim_period == 0) | ||
2702 | bss->dtim_period = 1; | ||
2703 | |||
2691 | bss->supp_rates_len = 0; | 2704 | bss->supp_rates_len = 0; |
2692 | if (elems->supp_rates) { | 2705 | if (elems->supp_rates) { |
2693 | clen = IEEE80211_MAX_SUPP_RATES - bss->supp_rates_len; | 2706 | clen = IEEE80211_MAX_SUPP_RATES - bss->supp_rates_len; |
@@ -3650,11 +3663,21 @@ static int ieee80211_sta_find_ibss(struct net_device *dev, | |||
3650 | "%s\n", print_mac(mac, bssid), | 3663 | "%s\n", print_mac(mac, bssid), |
3651 | print_mac(mac2, ifsta->bssid)); | 3664 | print_mac(mac2, ifsta->bssid)); |
3652 | #endif /* CONFIG_MAC80211_IBSS_DEBUG */ | 3665 | #endif /* CONFIG_MAC80211_IBSS_DEBUG */ |
3653 | if (found && memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0 && | 3666 | |
3654 | (bss = ieee80211_rx_bss_get(dev, bssid, | 3667 | if (found && memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0) { |
3655 | local->hw.conf.channel->center_freq, | ||
3656 | ifsta->ssid, ifsta->ssid_len))) { | ||
3657 | int ret; | 3668 | int ret; |
3669 | int search_freq; | ||
3670 | |||
3671 | if (ifsta->flags & IEEE80211_STA_AUTO_CHANNEL_SEL) | ||
3672 | search_freq = bss->freq; | ||
3673 | else | ||
3674 | search_freq = local->hw.conf.channel->center_freq; | ||
3675 | |||
3676 | bss = ieee80211_rx_bss_get(dev, bssid, search_freq, | ||
3677 | ifsta->ssid, ifsta->ssid_len); | ||
3678 | if (!bss) | ||
3679 | goto dont_join; | ||
3680 | |||
3658 | printk(KERN_DEBUG "%s: Selected IBSS BSSID %s" | 3681 | printk(KERN_DEBUG "%s: Selected IBSS BSSID %s" |
3659 | " based on configured SSID\n", | 3682 | " based on configured SSID\n", |
3660 | dev->name, print_mac(mac, bssid)); | 3683 | dev->name, print_mac(mac, bssid)); |
@@ -3662,6 +3685,8 @@ static int ieee80211_sta_find_ibss(struct net_device *dev, | |||
3662 | ieee80211_rx_bss_put(local, bss); | 3685 | ieee80211_rx_bss_put(local, bss); |
3663 | return ret; | 3686 | return ret; |
3664 | } | 3687 | } |
3688 | |||
3689 | dont_join: | ||
3665 | #ifdef CONFIG_MAC80211_IBSS_DEBUG | 3690 | #ifdef CONFIG_MAC80211_IBSS_DEBUG |
3666 | printk(KERN_DEBUG " did not try to join ibss\n"); | 3691 | printk(KERN_DEBUG " did not try to join ibss\n"); |
3667 | #endif /* CONFIG_MAC80211_IBSS_DEBUG */ | 3692 | #endif /* CONFIG_MAC80211_IBSS_DEBUG */ |
@@ -3895,7 +3920,7 @@ done: | |||
3895 | if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { | 3920 | if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { |
3896 | struct ieee80211_if_sta *ifsta = &sdata->u.sta; | 3921 | struct ieee80211_if_sta *ifsta = &sdata->u.sta; |
3897 | if (!(ifsta->flags & IEEE80211_STA_BSSID_SET) || | 3922 | if (!(ifsta->flags & IEEE80211_STA_BSSID_SET) || |
3898 | (!ifsta->state == IEEE80211_IBSS_JOINED && | 3923 | (!(ifsta->state == IEEE80211_IBSS_JOINED) && |
3899 | !ieee80211_sta_active_ibss(dev))) | 3924 | !ieee80211_sta_active_ibss(dev))) |
3900 | ieee80211_sta_find_ibss(dev, ifsta); | 3925 | ieee80211_sta_find_ibss(dev, ifsta); |
3901 | } | 3926 | } |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 69019e943873..771ec68b848d 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1060,13 +1060,14 @@ static int ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | |||
1060 | static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb, | 1060 | static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb, |
1061 | struct ieee80211_tx_data *tx) | 1061 | struct ieee80211_tx_data *tx) |
1062 | { | 1062 | { |
1063 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 1063 | struct ieee80211_tx_info *info; |
1064 | int ret, i; | 1064 | int ret, i; |
1065 | 1065 | ||
1066 | if (netif_subqueue_stopped(local->mdev, skb)) | ||
1067 | return IEEE80211_TX_AGAIN; | ||
1068 | |||
1069 | if (skb) { | 1066 | if (skb) { |
1067 | if (netif_subqueue_stopped(local->mdev, skb)) | ||
1068 | return IEEE80211_TX_AGAIN; | ||
1069 | info = IEEE80211_SKB_CB(skb); | ||
1070 | |||
1070 | ieee80211_dump_frame(wiphy_name(local->hw.wiphy), | 1071 | ieee80211_dump_frame(wiphy_name(local->hw.wiphy), |
1071 | "TX to low-level driver", skb); | 1072 | "TX to low-level driver", skb); |
1072 | ret = local->ops->tx(local_to_hw(local), skb); | 1073 | ret = local->ops->tx(local_to_hw(local), skb); |
@@ -1215,6 +1216,7 @@ retry: | |||
1215 | 1216 | ||
1216 | if (ret == IEEE80211_TX_FRAG_AGAIN) | 1217 | if (ret == IEEE80211_TX_FRAG_AGAIN) |
1217 | skb = NULL; | 1218 | skb = NULL; |
1219 | |||
1218 | set_bit(queue, local->queues_pending); | 1220 | set_bit(queue, local->queues_pending); |
1219 | smp_mb(); | 1221 | smp_mb(); |
1220 | /* | 1222 | /* |
@@ -1708,14 +1710,19 @@ void ieee80211_tx_pending(unsigned long data) | |||
1708 | netif_tx_lock_bh(dev); | 1710 | netif_tx_lock_bh(dev); |
1709 | for (i = 0; i < ieee80211_num_regular_queues(&local->hw); i++) { | 1711 | for (i = 0; i < ieee80211_num_regular_queues(&local->hw); i++) { |
1710 | /* Check that this queue is ok */ | 1712 | /* Check that this queue is ok */ |
1711 | if (__netif_subqueue_stopped(local->mdev, i)) | 1713 | if (__netif_subqueue_stopped(local->mdev, i) && |
1714 | !test_bit(i, local->queues_pending_run)) | ||
1712 | continue; | 1715 | continue; |
1713 | 1716 | ||
1714 | if (!test_bit(i, local->queues_pending)) { | 1717 | if (!test_bit(i, local->queues_pending)) { |
1718 | clear_bit(i, local->queues_pending_run); | ||
1715 | ieee80211_wake_queue(&local->hw, i); | 1719 | ieee80211_wake_queue(&local->hw, i); |
1716 | continue; | 1720 | continue; |
1717 | } | 1721 | } |
1718 | 1722 | ||
1723 | clear_bit(i, local->queues_pending_run); | ||
1724 | netif_start_subqueue(local->mdev, i); | ||
1725 | |||
1719 | store = &local->pending_packet[i]; | 1726 | store = &local->pending_packet[i]; |
1720 | tx.extra_frag = store->extra_frag; | 1727 | tx.extra_frag = store->extra_frag; |
1721 | tx.num_extra_frag = store->num_extra_frag; | 1728 | tx.num_extra_frag = store->num_extra_frag; |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 19f85e1b3695..0d463c80c404 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -361,6 +361,7 @@ void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue) | |||
361 | struct ieee80211_local *local = hw_to_local(hw); | 361 | struct ieee80211_local *local = hw_to_local(hw); |
362 | 362 | ||
363 | if (test_bit(queue, local->queues_pending)) { | 363 | if (test_bit(queue, local->queues_pending)) { |
364 | set_bit(queue, local->queues_pending_run); | ||
364 | tasklet_schedule(&local->tx_pending_tasklet); | 365 | tasklet_schedule(&local->tx_pending_tasklet); |
365 | } else { | 366 | } else { |
366 | netif_wake_subqueue(local->mdev, queue); | 367 | netif_wake_subqueue(local->mdev, queue); |
diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c index 28437f0001db..4310e2f65661 100644 --- a/net/mac80211/wme.c +++ b/net/mac80211/wme.c | |||
@@ -241,12 +241,14 @@ void ieee80211_ht_agg_queue_remove(struct ieee80211_local *local, | |||
241 | } else { | 241 | } else { |
242 | struct netdev_queue *txq; | 242 | struct netdev_queue *txq; |
243 | spinlock_t *root_lock; | 243 | spinlock_t *root_lock; |
244 | struct Qdisc *q; | ||
244 | 245 | ||
245 | txq = netdev_get_tx_queue(local->mdev, agg_queue); | 246 | txq = netdev_get_tx_queue(local->mdev, agg_queue); |
246 | root_lock = qdisc_root_lock(txq->qdisc); | 247 | q = rcu_dereference(txq->qdisc); |
248 | root_lock = qdisc_lock(q); | ||
247 | 249 | ||
248 | spin_lock_bh(root_lock); | 250 | spin_lock_bh(root_lock); |
249 | qdisc_reset(txq->qdisc); | 251 | qdisc_reset(q); |
250 | spin_unlock_bh(root_lock); | 252 | spin_unlock_bh(root_lock); |
251 | } | 253 | } |
252 | } | 254 | } |
diff --git a/net/rfkill/rfkill-input.c b/net/rfkill/rfkill-input.c index 8aa822730145..e5b69556bb5b 100644 --- a/net/rfkill/rfkill-input.c +++ b/net/rfkill/rfkill-input.c | |||
@@ -109,6 +109,25 @@ static DEFINE_RFKILL_TASK(rfkill_uwb, RFKILL_TYPE_UWB); | |||
109 | static DEFINE_RFKILL_TASK(rfkill_wimax, RFKILL_TYPE_WIMAX); | 109 | static DEFINE_RFKILL_TASK(rfkill_wimax, RFKILL_TYPE_WIMAX); |
110 | static DEFINE_RFKILL_TASK(rfkill_wwan, RFKILL_TYPE_WWAN); | 110 | static DEFINE_RFKILL_TASK(rfkill_wwan, RFKILL_TYPE_WWAN); |
111 | 111 | ||
112 | static void rfkill_schedule_evsw_rfkillall(int state) | ||
113 | { | ||
114 | /* EVERY radio type. state != 0 means radios ON */ | ||
115 | /* handle EPO (emergency power off) through shortcut */ | ||
116 | if (state) { | ||
117 | rfkill_schedule_set(&rfkill_wwan, | ||
118 | RFKILL_STATE_UNBLOCKED); | ||
119 | rfkill_schedule_set(&rfkill_wimax, | ||
120 | RFKILL_STATE_UNBLOCKED); | ||
121 | rfkill_schedule_set(&rfkill_uwb, | ||
122 | RFKILL_STATE_UNBLOCKED); | ||
123 | rfkill_schedule_set(&rfkill_bt, | ||
124 | RFKILL_STATE_UNBLOCKED); | ||
125 | rfkill_schedule_set(&rfkill_wlan, | ||
126 | RFKILL_STATE_UNBLOCKED); | ||
127 | } else | ||
128 | rfkill_schedule_epo(); | ||
129 | } | ||
130 | |||
112 | static void rfkill_event(struct input_handle *handle, unsigned int type, | 131 | static void rfkill_event(struct input_handle *handle, unsigned int type, |
113 | unsigned int code, int data) | 132 | unsigned int code, int data) |
114 | { | 133 | { |
@@ -132,21 +151,7 @@ static void rfkill_event(struct input_handle *handle, unsigned int type, | |||
132 | } else if (type == EV_SW) { | 151 | } else if (type == EV_SW) { |
133 | switch (code) { | 152 | switch (code) { |
134 | case SW_RFKILL_ALL: | 153 | case SW_RFKILL_ALL: |
135 | /* EVERY radio type. data != 0 means radios ON */ | 154 | rfkill_schedule_evsw_rfkillall(data); |
136 | /* handle EPO (emergency power off) through shortcut */ | ||
137 | if (data) { | ||
138 | rfkill_schedule_set(&rfkill_wwan, | ||
139 | RFKILL_STATE_UNBLOCKED); | ||
140 | rfkill_schedule_set(&rfkill_wimax, | ||
141 | RFKILL_STATE_UNBLOCKED); | ||
142 | rfkill_schedule_set(&rfkill_uwb, | ||
143 | RFKILL_STATE_UNBLOCKED); | ||
144 | rfkill_schedule_set(&rfkill_bt, | ||
145 | RFKILL_STATE_UNBLOCKED); | ||
146 | rfkill_schedule_set(&rfkill_wlan, | ||
147 | RFKILL_STATE_UNBLOCKED); | ||
148 | } else | ||
149 | rfkill_schedule_epo(); | ||
150 | break; | 155 | break; |
151 | default: | 156 | default: |
152 | break; | 157 | break; |
@@ -168,6 +173,7 @@ static int rfkill_connect(struct input_handler *handler, struct input_dev *dev, | |||
168 | handle->handler = handler; | 173 | handle->handler = handler; |
169 | handle->name = "rfkill"; | 174 | handle->name = "rfkill"; |
170 | 175 | ||
176 | /* causes rfkill_start() to be called */ | ||
171 | error = input_register_handle(handle); | 177 | error = input_register_handle(handle); |
172 | if (error) | 178 | if (error) |
173 | goto err_free_handle; | 179 | goto err_free_handle; |
@@ -185,6 +191,23 @@ static int rfkill_connect(struct input_handler *handler, struct input_dev *dev, | |||
185 | return error; | 191 | return error; |
186 | } | 192 | } |
187 | 193 | ||
194 | static void rfkill_start(struct input_handle *handle) | ||
195 | { | ||
196 | /* Take event_lock to guard against configuration changes, we | ||
197 | * should be able to deal with concurrency with rfkill_event() | ||
198 | * just fine (which event_lock will also avoid). */ | ||
199 | spin_lock_irq(&handle->dev->event_lock); | ||
200 | |||
201 | if (test_bit(EV_SW, handle->dev->evbit)) { | ||
202 | if (test_bit(SW_RFKILL_ALL, handle->dev->swbit)) | ||
203 | rfkill_schedule_evsw_rfkillall(test_bit(SW_RFKILL_ALL, | ||
204 | handle->dev->sw)); | ||
205 | /* add resync for further EV_SW events here */ | ||
206 | } | ||
207 | |||
208 | spin_unlock_irq(&handle->dev->event_lock); | ||
209 | } | ||
210 | |||
188 | static void rfkill_disconnect(struct input_handle *handle) | 211 | static void rfkill_disconnect(struct input_handle *handle) |
189 | { | 212 | { |
190 | input_close_device(handle); | 213 | input_close_device(handle); |
@@ -225,6 +248,7 @@ static struct input_handler rfkill_handler = { | |||
225 | .event = rfkill_event, | 248 | .event = rfkill_event, |
226 | .connect = rfkill_connect, | 249 | .connect = rfkill_connect, |
227 | .disconnect = rfkill_disconnect, | 250 | .disconnect = rfkill_disconnect, |
251 | .start = rfkill_start, | ||
228 | .name = "rfkill", | 252 | .name = "rfkill", |
229 | .id_table = rfkill_ids, | 253 | .id_table = rfkill_ids, |
230 | }; | 254 | }; |
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c index c6f2f388cb72..d2d45655cd1a 100644 --- a/net/rfkill/rfkill.c +++ b/net/rfkill/rfkill.c | |||
@@ -105,6 +105,16 @@ static void rfkill_led_trigger(struct rfkill *rfkill, | |||
105 | #endif /* CONFIG_RFKILL_LEDS */ | 105 | #endif /* CONFIG_RFKILL_LEDS */ |
106 | } | 106 | } |
107 | 107 | ||
108 | #ifdef CONFIG_RFKILL_LEDS | ||
109 | static void rfkill_led_trigger_activate(struct led_classdev *led) | ||
110 | { | ||
111 | struct rfkill *rfkill = container_of(led->trigger, | ||
112 | struct rfkill, led_trigger); | ||
113 | |||
114 | rfkill_led_trigger(rfkill, rfkill->state); | ||
115 | } | ||
116 | #endif /* CONFIG_RFKILL_LEDS */ | ||
117 | |||
108 | static void notify_rfkill_state_change(struct rfkill *rfkill) | 118 | static void notify_rfkill_state_change(struct rfkill *rfkill) |
109 | { | 119 | { |
110 | blocking_notifier_call_chain(&rfkill_notifier_list, | 120 | blocking_notifier_call_chain(&rfkill_notifier_list, |
@@ -589,7 +599,10 @@ static void rfkill_led_trigger_register(struct rfkill *rfkill) | |||
589 | #ifdef CONFIG_RFKILL_LEDS | 599 | #ifdef CONFIG_RFKILL_LEDS |
590 | int error; | 600 | int error; |
591 | 601 | ||
592 | rfkill->led_trigger.name = rfkill->dev.bus_id; | 602 | if (!rfkill->led_trigger.name) |
603 | rfkill->led_trigger.name = rfkill->dev.bus_id; | ||
604 | if (!rfkill->led_trigger.activate) | ||
605 | rfkill->led_trigger.activate = rfkill_led_trigger_activate; | ||
593 | error = led_trigger_register(&rfkill->led_trigger); | 606 | error = led_trigger_register(&rfkill->led_trigger); |
594 | if (error) | 607 | if (error) |
595 | rfkill->led_trigger.name = NULL; | 608 | rfkill->led_trigger.name = NULL; |
diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c index 6b517b9dac5b..43d37256c15e 100644 --- a/net/sched/sch_atm.c +++ b/net/sched/sch_atm.c | |||
@@ -415,7 +415,7 @@ static int atm_tc_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
415 | case TC_ACT_QUEUED: | 415 | case TC_ACT_QUEUED: |
416 | case TC_ACT_STOLEN: | 416 | case TC_ACT_STOLEN: |
417 | kfree_skb(skb); | 417 | kfree_skb(skb); |
418 | return NET_XMIT_SUCCESS; | 418 | return NET_XMIT_SUCCESS | __NET_XMIT_STOLEN; |
419 | case TC_ACT_SHOT: | 419 | case TC_ACT_SHOT: |
420 | kfree_skb(skb); | 420 | kfree_skb(skb); |
421 | goto drop; | 421 | goto drop; |
@@ -432,9 +432,11 @@ static int atm_tc_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
432 | ret = qdisc_enqueue(skb, flow->q); | 432 | ret = qdisc_enqueue(skb, flow->q); |
433 | if (ret != 0) { | 433 | if (ret != 0) { |
434 | drop: __maybe_unused | 434 | drop: __maybe_unused |
435 | sch->qstats.drops++; | 435 | if (net_xmit_drop_count(ret)) { |
436 | if (flow) | 436 | sch->qstats.drops++; |
437 | flow->qstats.drops++; | 437 | if (flow) |
438 | flow->qstats.drops++; | ||
439 | } | ||
438 | return ret; | 440 | return ret; |
439 | } | 441 | } |
440 | sch->bstats.bytes += qdisc_pkt_len(skb); | 442 | sch->bstats.bytes += qdisc_pkt_len(skb); |
@@ -455,7 +457,7 @@ drop: __maybe_unused | |||
455 | return 0; | 457 | return 0; |
456 | } | 458 | } |
457 | tasklet_schedule(&p->task); | 459 | tasklet_schedule(&p->task); |
458 | return NET_XMIT_BYPASS; | 460 | return NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; |
459 | } | 461 | } |
460 | 462 | ||
461 | /* | 463 | /* |
@@ -530,7 +532,7 @@ static int atm_tc_requeue(struct sk_buff *skb, struct Qdisc *sch) | |||
530 | if (!ret) { | 532 | if (!ret) { |
531 | sch->q.qlen++; | 533 | sch->q.qlen++; |
532 | sch->qstats.requeues++; | 534 | sch->qstats.requeues++; |
533 | } else { | 535 | } else if (net_xmit_drop_count(ret)) { |
534 | sch->qstats.drops++; | 536 | sch->qstats.drops++; |
535 | p->link.qstats.drops++; | 537 | p->link.qstats.drops++; |
536 | } | 538 | } |
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 14954bf4a683..4e261ce62f48 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c | |||
@@ -230,7 +230,7 @@ cbq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr) | |||
230 | (cl = cbq_class_lookup(q, prio)) != NULL) | 230 | (cl = cbq_class_lookup(q, prio)) != NULL) |
231 | return cl; | 231 | return cl; |
232 | 232 | ||
233 | *qerr = NET_XMIT_BYPASS; | 233 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; |
234 | for (;;) { | 234 | for (;;) { |
235 | int result = 0; | 235 | int result = 0; |
236 | defmap = head->defaults; | 236 | defmap = head->defaults; |
@@ -256,7 +256,7 @@ cbq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr) | |||
256 | switch (result) { | 256 | switch (result) { |
257 | case TC_ACT_QUEUED: | 257 | case TC_ACT_QUEUED: |
258 | case TC_ACT_STOLEN: | 258 | case TC_ACT_STOLEN: |
259 | *qerr = NET_XMIT_SUCCESS; | 259 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN; |
260 | case TC_ACT_SHOT: | 260 | case TC_ACT_SHOT: |
261 | return NULL; | 261 | return NULL; |
262 | case TC_ACT_RECLASSIFY: | 262 | case TC_ACT_RECLASSIFY: |
@@ -377,7 +377,7 @@ cbq_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
377 | q->rx_class = cl; | 377 | q->rx_class = cl; |
378 | #endif | 378 | #endif |
379 | if (cl == NULL) { | 379 | if (cl == NULL) { |
380 | if (ret == NET_XMIT_BYPASS) | 380 | if (ret & __NET_XMIT_BYPASS) |
381 | sch->qstats.drops++; | 381 | sch->qstats.drops++; |
382 | kfree_skb(skb); | 382 | kfree_skb(skb); |
383 | return ret; | 383 | return ret; |
@@ -397,9 +397,11 @@ cbq_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
397 | return ret; | 397 | return ret; |
398 | } | 398 | } |
399 | 399 | ||
400 | sch->qstats.drops++; | 400 | if (net_xmit_drop_count(ret)) { |
401 | cbq_mark_toplevel(q, cl); | 401 | sch->qstats.drops++; |
402 | cl->qstats.drops++; | 402 | cbq_mark_toplevel(q, cl); |
403 | cl->qstats.drops++; | ||
404 | } | ||
403 | return ret; | 405 | return ret; |
404 | } | 406 | } |
405 | 407 | ||
@@ -430,8 +432,10 @@ cbq_requeue(struct sk_buff *skb, struct Qdisc *sch) | |||
430 | cbq_activate_class(cl); | 432 | cbq_activate_class(cl); |
431 | return 0; | 433 | return 0; |
432 | } | 434 | } |
433 | sch->qstats.drops++; | 435 | if (net_xmit_drop_count(ret)) { |
434 | cl->qstats.drops++; | 436 | sch->qstats.drops++; |
437 | cl->qstats.drops++; | ||
438 | } | ||
435 | return ret; | 439 | return ret; |
436 | } | 440 | } |
437 | 441 | ||
@@ -664,13 +668,15 @@ static int cbq_reshape_fail(struct sk_buff *skb, struct Qdisc *child) | |||
664 | q->rx_class = NULL; | 668 | q->rx_class = NULL; |
665 | 669 | ||
666 | if (cl && (cl = cbq_reclassify(skb, cl)) != NULL) { | 670 | if (cl && (cl = cbq_reclassify(skb, cl)) != NULL) { |
671 | int ret; | ||
667 | 672 | ||
668 | cbq_mark_toplevel(q, cl); | 673 | cbq_mark_toplevel(q, cl); |
669 | 674 | ||
670 | q->rx_class = cl; | 675 | q->rx_class = cl; |
671 | cl->q->__parent = sch; | 676 | cl->q->__parent = sch; |
672 | 677 | ||
673 | if (qdisc_enqueue(skb, cl->q) == 0) { | 678 | ret = qdisc_enqueue(skb, cl->q); |
679 | if (ret == NET_XMIT_SUCCESS) { | ||
674 | sch->q.qlen++; | 680 | sch->q.qlen++; |
675 | sch->bstats.packets++; | 681 | sch->bstats.packets++; |
676 | sch->bstats.bytes += qdisc_pkt_len(skb); | 682 | sch->bstats.bytes += qdisc_pkt_len(skb); |
@@ -678,7 +684,8 @@ static int cbq_reshape_fail(struct sk_buff *skb, struct Qdisc *child) | |||
678 | cbq_activate_class(cl); | 684 | cbq_activate_class(cl); |
679 | return 0; | 685 | return 0; |
680 | } | 686 | } |
681 | sch->qstats.drops++; | 687 | if (net_xmit_drop_count(ret)) |
688 | sch->qstats.drops++; | ||
682 | return 0; | 689 | return 0; |
683 | } | 690 | } |
684 | 691 | ||
diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c index a935676987e2..edd1298f85f6 100644 --- a/net/sched/sch_dsmark.c +++ b/net/sched/sch_dsmark.c | |||
@@ -236,7 +236,7 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
236 | case TC_ACT_QUEUED: | 236 | case TC_ACT_QUEUED: |
237 | case TC_ACT_STOLEN: | 237 | case TC_ACT_STOLEN: |
238 | kfree_skb(skb); | 238 | kfree_skb(skb); |
239 | return NET_XMIT_SUCCESS; | 239 | return NET_XMIT_SUCCESS | __NET_XMIT_STOLEN; |
240 | 240 | ||
241 | case TC_ACT_SHOT: | 241 | case TC_ACT_SHOT: |
242 | goto drop; | 242 | goto drop; |
@@ -254,7 +254,8 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
254 | 254 | ||
255 | err = qdisc_enqueue(skb, p->q); | 255 | err = qdisc_enqueue(skb, p->q); |
256 | if (err != NET_XMIT_SUCCESS) { | 256 | if (err != NET_XMIT_SUCCESS) { |
257 | sch->qstats.drops++; | 257 | if (net_xmit_drop_count(err)) |
258 | sch->qstats.drops++; | ||
258 | return err; | 259 | return err; |
259 | } | 260 | } |
260 | 261 | ||
@@ -267,7 +268,7 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
267 | drop: | 268 | drop: |
268 | kfree_skb(skb); | 269 | kfree_skb(skb); |
269 | sch->qstats.drops++; | 270 | sch->qstats.drops++; |
270 | return NET_XMIT_BYPASS; | 271 | return NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; |
271 | } | 272 | } |
272 | 273 | ||
273 | static struct sk_buff *dsmark_dequeue(struct Qdisc *sch) | 274 | static struct sk_buff *dsmark_dequeue(struct Qdisc *sch) |
@@ -321,7 +322,8 @@ static int dsmark_requeue(struct sk_buff *skb, struct Qdisc *sch) | |||
321 | 322 | ||
322 | err = p->q->ops->requeue(skb, p->q); | 323 | err = p->q->ops->requeue(skb, p->q); |
323 | if (err != NET_XMIT_SUCCESS) { | 324 | if (err != NET_XMIT_SUCCESS) { |
324 | sch->qstats.drops++; | 325 | if (net_xmit_drop_count(err)) |
326 | sch->qstats.drops++; | ||
325 | return err; | 327 | return err; |
326 | } | 328 | } |
327 | 329 | ||
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 9c9cd4d94890..7cf83b37459d 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
@@ -29,7 +29,7 @@ | |||
29 | /* Main transmission queue. */ | 29 | /* Main transmission queue. */ |
30 | 30 | ||
31 | /* Modifications to data participating in scheduling must be protected with | 31 | /* Modifications to data participating in scheduling must be protected with |
32 | * qdisc_root_lock(qdisc) spinlock. | 32 | * qdisc_lock(qdisc) spinlock. |
33 | * | 33 | * |
34 | * The idea is the following: | 34 | * The idea is the following: |
35 | * - enqueue, dequeue are serialized via qdisc root lock | 35 | * - enqueue, dequeue are serialized via qdisc root lock |
@@ -126,7 +126,7 @@ static inline int qdisc_restart(struct Qdisc *q) | |||
126 | if (unlikely((skb = dequeue_skb(q)) == NULL)) | 126 | if (unlikely((skb = dequeue_skb(q)) == NULL)) |
127 | return 0; | 127 | return 0; |
128 | 128 | ||
129 | root_lock = qdisc_root_lock(q); | 129 | root_lock = qdisc_lock(q); |
130 | 130 | ||
131 | /* And release qdisc */ | 131 | /* And release qdisc */ |
132 | spin_unlock(root_lock); | 132 | spin_unlock(root_lock); |
@@ -507,7 +507,7 @@ errout: | |||
507 | } | 507 | } |
508 | EXPORT_SYMBOL(qdisc_create_dflt); | 508 | EXPORT_SYMBOL(qdisc_create_dflt); |
509 | 509 | ||
510 | /* Under qdisc_root_lock(qdisc) and BH! */ | 510 | /* Under qdisc_lock(qdisc) and BH! */ |
511 | 511 | ||
512 | void qdisc_reset(struct Qdisc *qdisc) | 512 | void qdisc_reset(struct Qdisc *qdisc) |
513 | { | 513 | { |
@@ -543,7 +543,7 @@ static void __qdisc_destroy(struct rcu_head *head) | |||
543 | kfree((char *) qdisc - qdisc->padded); | 543 | kfree((char *) qdisc - qdisc->padded); |
544 | } | 544 | } |
545 | 545 | ||
546 | /* Under qdisc_root_lock(qdisc) and BH! */ | 546 | /* Under qdisc_lock(qdisc) and BH! */ |
547 | 547 | ||
548 | void qdisc_destroy(struct Qdisc *qdisc) | 548 | void qdisc_destroy(struct Qdisc *qdisc) |
549 | { | 549 | { |
@@ -659,7 +659,7 @@ static bool some_qdisc_is_running(struct net_device *dev, int lock) | |||
659 | 659 | ||
660 | dev_queue = netdev_get_tx_queue(dev, i); | 660 | dev_queue = netdev_get_tx_queue(dev, i); |
661 | q = dev_queue->qdisc; | 661 | q = dev_queue->qdisc; |
662 | root_lock = qdisc_root_lock(q); | 662 | root_lock = qdisc_lock(q); |
663 | 663 | ||
664 | if (lock) | 664 | if (lock) |
665 | spin_lock_bh(root_lock); | 665 | spin_lock_bh(root_lock); |
@@ -735,7 +735,7 @@ static void shutdown_scheduler_queue(struct net_device *dev, | |||
735 | struct Qdisc *qdisc_default = _qdisc_default; | 735 | struct Qdisc *qdisc_default = _qdisc_default; |
736 | 736 | ||
737 | if (qdisc) { | 737 | if (qdisc) { |
738 | spinlock_t *root_lock = qdisc_root_lock(qdisc); | 738 | spinlock_t *root_lock = qdisc_lock(qdisc); |
739 | 739 | ||
740 | dev_queue->qdisc = qdisc_default; | 740 | dev_queue->qdisc = qdisc_default; |
741 | dev_queue->qdisc_sleeping = qdisc_default; | 741 | dev_queue->qdisc_sleeping = qdisc_default; |
diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index 0ae7d19dcba8..c2b8d9cce3d2 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c | |||
@@ -1159,14 +1159,14 @@ hfsc_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr) | |||
1159 | if (cl->level == 0) | 1159 | if (cl->level == 0) |
1160 | return cl; | 1160 | return cl; |
1161 | 1161 | ||
1162 | *qerr = NET_XMIT_BYPASS; | 1162 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; |
1163 | tcf = q->root.filter_list; | 1163 | tcf = q->root.filter_list; |
1164 | while (tcf && (result = tc_classify(skb, tcf, &res)) >= 0) { | 1164 | while (tcf && (result = tc_classify(skb, tcf, &res)) >= 0) { |
1165 | #ifdef CONFIG_NET_CLS_ACT | 1165 | #ifdef CONFIG_NET_CLS_ACT |
1166 | switch (result) { | 1166 | switch (result) { |
1167 | case TC_ACT_QUEUED: | 1167 | case TC_ACT_QUEUED: |
1168 | case TC_ACT_STOLEN: | 1168 | case TC_ACT_STOLEN: |
1169 | *qerr = NET_XMIT_SUCCESS; | 1169 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN; |
1170 | case TC_ACT_SHOT: | 1170 | case TC_ACT_SHOT: |
1171 | return NULL; | 1171 | return NULL; |
1172 | } | 1172 | } |
@@ -1578,7 +1578,7 @@ hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
1578 | 1578 | ||
1579 | cl = hfsc_classify(skb, sch, &err); | 1579 | cl = hfsc_classify(skb, sch, &err); |
1580 | if (cl == NULL) { | 1580 | if (cl == NULL) { |
1581 | if (err == NET_XMIT_BYPASS) | 1581 | if (err & __NET_XMIT_BYPASS) |
1582 | sch->qstats.drops++; | 1582 | sch->qstats.drops++; |
1583 | kfree_skb(skb); | 1583 | kfree_skb(skb); |
1584 | return err; | 1584 | return err; |
@@ -1586,8 +1586,10 @@ hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
1586 | 1586 | ||
1587 | err = qdisc_enqueue(skb, cl->qdisc); | 1587 | err = qdisc_enqueue(skb, cl->qdisc); |
1588 | if (unlikely(err != NET_XMIT_SUCCESS)) { | 1588 | if (unlikely(err != NET_XMIT_SUCCESS)) { |
1589 | cl->qstats.drops++; | 1589 | if (net_xmit_drop_count(err)) { |
1590 | sch->qstats.drops++; | 1590 | cl->qstats.drops++; |
1591 | sch->qstats.drops++; | ||
1592 | } | ||
1591 | return err; | 1593 | return err; |
1592 | } | 1594 | } |
1593 | 1595 | ||
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 75a40951c4f2..be35422711a3 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
@@ -214,14 +214,14 @@ static struct htb_class *htb_classify(struct sk_buff *skb, struct Qdisc *sch, | |||
214 | if ((cl = htb_find(skb->priority, sch)) != NULL && cl->level == 0) | 214 | if ((cl = htb_find(skb->priority, sch)) != NULL && cl->level == 0) |
215 | return cl; | 215 | return cl; |
216 | 216 | ||
217 | *qerr = NET_XMIT_BYPASS; | 217 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; |
218 | tcf = q->filter_list; | 218 | tcf = q->filter_list; |
219 | while (tcf && (result = tc_classify(skb, tcf, &res)) >= 0) { | 219 | while (tcf && (result = tc_classify(skb, tcf, &res)) >= 0) { |
220 | #ifdef CONFIG_NET_CLS_ACT | 220 | #ifdef CONFIG_NET_CLS_ACT |
221 | switch (result) { | 221 | switch (result) { |
222 | case TC_ACT_QUEUED: | 222 | case TC_ACT_QUEUED: |
223 | case TC_ACT_STOLEN: | 223 | case TC_ACT_STOLEN: |
224 | *qerr = NET_XMIT_SUCCESS; | 224 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN; |
225 | case TC_ACT_SHOT: | 225 | case TC_ACT_SHOT: |
226 | return NULL; | 226 | return NULL; |
227 | } | 227 | } |
@@ -567,14 +567,16 @@ static int htb_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
567 | } | 567 | } |
568 | #ifdef CONFIG_NET_CLS_ACT | 568 | #ifdef CONFIG_NET_CLS_ACT |
569 | } else if (!cl) { | 569 | } else if (!cl) { |
570 | if (ret == NET_XMIT_BYPASS) | 570 | if (ret & __NET_XMIT_BYPASS) |
571 | sch->qstats.drops++; | 571 | sch->qstats.drops++; |
572 | kfree_skb(skb); | 572 | kfree_skb(skb); |
573 | return ret; | 573 | return ret; |
574 | #endif | 574 | #endif |
575 | } else if (qdisc_enqueue(skb, cl->un.leaf.q) != NET_XMIT_SUCCESS) { | 575 | } else if ((ret = qdisc_enqueue(skb, cl->un.leaf.q)) != NET_XMIT_SUCCESS) { |
576 | sch->qstats.drops++; | 576 | if (net_xmit_drop_count(ret)) { |
577 | cl->qstats.drops++; | 577 | sch->qstats.drops++; |
578 | cl->qstats.drops++; | ||
579 | } | ||
578 | return NET_XMIT_DROP; | 580 | return NET_XMIT_DROP; |
579 | } else { | 581 | } else { |
580 | cl->bstats.packets += | 582 | cl->bstats.packets += |
@@ -610,15 +612,17 @@ static int htb_requeue(struct sk_buff *skb, struct Qdisc *sch) | |||
610 | } | 612 | } |
611 | #ifdef CONFIG_NET_CLS_ACT | 613 | #ifdef CONFIG_NET_CLS_ACT |
612 | } else if (!cl) { | 614 | } else if (!cl) { |
613 | if (ret == NET_XMIT_BYPASS) | 615 | if (ret & __NET_XMIT_BYPASS) |
614 | sch->qstats.drops++; | 616 | sch->qstats.drops++; |
615 | kfree_skb(skb); | 617 | kfree_skb(skb); |
616 | return ret; | 618 | return ret; |
617 | #endif | 619 | #endif |
618 | } else if (cl->un.leaf.q->ops->requeue(skb, cl->un.leaf.q) != | 620 | } else if ((ret = cl->un.leaf.q->ops->requeue(skb, cl->un.leaf.q)) != |
619 | NET_XMIT_SUCCESS) { | 621 | NET_XMIT_SUCCESS) { |
620 | sch->qstats.drops++; | 622 | if (net_xmit_drop_count(ret)) { |
621 | cl->qstats.drops++; | 623 | sch->qstats.drops++; |
624 | cl->qstats.drops++; | ||
625 | } | ||
622 | return NET_XMIT_DROP; | 626 | return NET_XMIT_DROP; |
623 | } else | 627 | } else |
624 | htb_activate(q, cl); | 628 | htb_activate(q, cl); |
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index a59085700678..fb0294d0b55e 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
@@ -176,7 +176,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
176 | if (count == 0) { | 176 | if (count == 0) { |
177 | sch->qstats.drops++; | 177 | sch->qstats.drops++; |
178 | kfree_skb(skb); | 178 | kfree_skb(skb); |
179 | return NET_XMIT_BYPASS; | 179 | return NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; |
180 | } | 180 | } |
181 | 181 | ||
182 | skb_orphan(skb); | 182 | skb_orphan(skb); |
@@ -240,8 +240,9 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
240 | sch->q.qlen++; | 240 | sch->q.qlen++; |
241 | sch->bstats.bytes += qdisc_pkt_len(skb); | 241 | sch->bstats.bytes += qdisc_pkt_len(skb); |
242 | sch->bstats.packets++; | 242 | sch->bstats.packets++; |
243 | } else | 243 | } else if (net_xmit_drop_count(ret)) { |
244 | sch->qstats.drops++; | 244 | sch->qstats.drops++; |
245 | } | ||
245 | 246 | ||
246 | pr_debug("netem: enqueue ret %d\n", ret); | 247 | pr_debug("netem: enqueue ret %d\n", ret); |
247 | return ret; | 248 | return ret; |
diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index f849243eb095..eac197610edf 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c | |||
@@ -38,14 +38,14 @@ prio_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr) | |||
38 | struct tcf_result res; | 38 | struct tcf_result res; |
39 | int err; | 39 | int err; |
40 | 40 | ||
41 | *qerr = NET_XMIT_BYPASS; | 41 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; |
42 | if (TC_H_MAJ(skb->priority) != sch->handle) { | 42 | if (TC_H_MAJ(skb->priority) != sch->handle) { |
43 | err = tc_classify(skb, q->filter_list, &res); | 43 | err = tc_classify(skb, q->filter_list, &res); |
44 | #ifdef CONFIG_NET_CLS_ACT | 44 | #ifdef CONFIG_NET_CLS_ACT |
45 | switch (err) { | 45 | switch (err) { |
46 | case TC_ACT_STOLEN: | 46 | case TC_ACT_STOLEN: |
47 | case TC_ACT_QUEUED: | 47 | case TC_ACT_QUEUED: |
48 | *qerr = NET_XMIT_SUCCESS; | 48 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN; |
49 | case TC_ACT_SHOT: | 49 | case TC_ACT_SHOT: |
50 | return NULL; | 50 | return NULL; |
51 | } | 51 | } |
@@ -74,7 +74,7 @@ prio_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
74 | #ifdef CONFIG_NET_CLS_ACT | 74 | #ifdef CONFIG_NET_CLS_ACT |
75 | if (qdisc == NULL) { | 75 | if (qdisc == NULL) { |
76 | 76 | ||
77 | if (ret == NET_XMIT_BYPASS) | 77 | if (ret & __NET_XMIT_BYPASS) |
78 | sch->qstats.drops++; | 78 | sch->qstats.drops++; |
79 | kfree_skb(skb); | 79 | kfree_skb(skb); |
80 | return ret; | 80 | return ret; |
@@ -88,7 +88,8 @@ prio_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
88 | sch->q.qlen++; | 88 | sch->q.qlen++; |
89 | return NET_XMIT_SUCCESS; | 89 | return NET_XMIT_SUCCESS; |
90 | } | 90 | } |
91 | sch->qstats.drops++; | 91 | if (net_xmit_drop_count(ret)) |
92 | sch->qstats.drops++; | ||
92 | return ret; | 93 | return ret; |
93 | } | 94 | } |
94 | 95 | ||
@@ -102,7 +103,7 @@ prio_requeue(struct sk_buff *skb, struct Qdisc* sch) | |||
102 | qdisc = prio_classify(skb, sch, &ret); | 103 | qdisc = prio_classify(skb, sch, &ret); |
103 | #ifdef CONFIG_NET_CLS_ACT | 104 | #ifdef CONFIG_NET_CLS_ACT |
104 | if (qdisc == NULL) { | 105 | if (qdisc == NULL) { |
105 | if (ret == NET_XMIT_BYPASS) | 106 | if (ret & __NET_XMIT_BYPASS) |
106 | sch->qstats.drops++; | 107 | sch->qstats.drops++; |
107 | kfree_skb(skb); | 108 | kfree_skb(skb); |
108 | return ret; | 109 | return ret; |
@@ -114,7 +115,8 @@ prio_requeue(struct sk_buff *skb, struct Qdisc* sch) | |||
114 | sch->qstats.requeues++; | 115 | sch->qstats.requeues++; |
115 | return 0; | 116 | return 0; |
116 | } | 117 | } |
117 | sch->qstats.drops++; | 118 | if (net_xmit_drop_count(ret)) |
119 | sch->qstats.drops++; | ||
118 | return NET_XMIT_DROP; | 120 | return NET_XMIT_DROP; |
119 | } | 121 | } |
120 | 122 | ||
diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c index 3f2d1d7f3bbd..5da05839e225 100644 --- a/net/sched/sch_red.c +++ b/net/sched/sch_red.c | |||
@@ -97,7 +97,7 @@ static int red_enqueue(struct sk_buff *skb, struct Qdisc* sch) | |||
97 | sch->bstats.bytes += qdisc_pkt_len(skb); | 97 | sch->bstats.bytes += qdisc_pkt_len(skb); |
98 | sch->bstats.packets++; | 98 | sch->bstats.packets++; |
99 | sch->q.qlen++; | 99 | sch->q.qlen++; |
100 | } else { | 100 | } else if (net_xmit_drop_count(ret)) { |
101 | q->stats.pdrop++; | 101 | q->stats.pdrop++; |
102 | sch->qstats.drops++; | 102 | sch->qstats.drops++; |
103 | } | 103 | } |
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index 8589da666568..6e041d10dbdb 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c | |||
@@ -171,14 +171,14 @@ static unsigned int sfq_classify(struct sk_buff *skb, struct Qdisc *sch, | |||
171 | if (!q->filter_list) | 171 | if (!q->filter_list) |
172 | return sfq_hash(q, skb) + 1; | 172 | return sfq_hash(q, skb) + 1; |
173 | 173 | ||
174 | *qerr = NET_XMIT_BYPASS; | 174 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; |
175 | result = tc_classify(skb, q->filter_list, &res); | 175 | result = tc_classify(skb, q->filter_list, &res); |
176 | if (result >= 0) { | 176 | if (result >= 0) { |
177 | #ifdef CONFIG_NET_CLS_ACT | 177 | #ifdef CONFIG_NET_CLS_ACT |
178 | switch (result) { | 178 | switch (result) { |
179 | case TC_ACT_STOLEN: | 179 | case TC_ACT_STOLEN: |
180 | case TC_ACT_QUEUED: | 180 | case TC_ACT_QUEUED: |
181 | *qerr = NET_XMIT_SUCCESS; | 181 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN; |
182 | case TC_ACT_SHOT: | 182 | case TC_ACT_SHOT: |
183 | return 0; | 183 | return 0; |
184 | } | 184 | } |
@@ -285,7 +285,7 @@ sfq_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
285 | 285 | ||
286 | hash = sfq_classify(skb, sch, &ret); | 286 | hash = sfq_classify(skb, sch, &ret); |
287 | if (hash == 0) { | 287 | if (hash == 0) { |
288 | if (ret == NET_XMIT_BYPASS) | 288 | if (ret & __NET_XMIT_BYPASS) |
289 | sch->qstats.drops++; | 289 | sch->qstats.drops++; |
290 | kfree_skb(skb); | 290 | kfree_skb(skb); |
291 | return ret; | 291 | return ret; |
@@ -339,7 +339,7 @@ sfq_requeue(struct sk_buff *skb, struct Qdisc *sch) | |||
339 | 339 | ||
340 | hash = sfq_classify(skb, sch, &ret); | 340 | hash = sfq_classify(skb, sch, &ret); |
341 | if (hash == 0) { | 341 | if (hash == 0) { |
342 | if (ret == NET_XMIT_BYPASS) | 342 | if (ret & __NET_XMIT_BYPASS) |
343 | sch->qstats.drops++; | 343 | sch->qstats.drops++; |
344 | kfree_skb(skb); | 344 | kfree_skb(skb); |
345 | return ret; | 345 | return ret; |
diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index b296672f7632..7d3b7ff3bf07 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c | |||
@@ -135,7 +135,8 @@ static int tbf_enqueue(struct sk_buff *skb, struct Qdisc* sch) | |||
135 | 135 | ||
136 | ret = qdisc_enqueue(skb, q->qdisc); | 136 | ret = qdisc_enqueue(skb, q->qdisc); |
137 | if (ret != 0) { | 137 | if (ret != 0) { |
138 | sch->qstats.drops++; | 138 | if (net_xmit_drop_count(ret)) |
139 | sch->qstats.drops++; | ||
139 | return ret; | 140 | return ret; |
140 | } | 141 | } |
141 | 142 | ||
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index a238d6834b33..483a01d0740a 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c | |||
@@ -195,8 +195,7 @@ out: | |||
195 | } | 195 | } |
196 | 196 | ||
197 | /* Based on tcp_v6_xmit() in tcp_ipv6.c. */ | 197 | /* Based on tcp_v6_xmit() in tcp_ipv6.c. */ |
198 | static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport, | 198 | static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport) |
199 | int ipfragok) | ||
200 | { | 199 | { |
201 | struct sock *sk = skb->sk; | 200 | struct sock *sk = skb->sk; |
202 | struct ipv6_pinfo *np = inet6_sk(sk); | 201 | struct ipv6_pinfo *np = inet6_sk(sk); |
@@ -231,7 +230,10 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport, | |||
231 | 230 | ||
232 | SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS); | 231 | SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS); |
233 | 232 | ||
234 | return ip6_xmit(sk, skb, &fl, np->opt, ipfragok); | 233 | if (!(transport->param_flags & SPP_PMTUD_ENABLE)) |
234 | skb->local_df = 1; | ||
235 | |||
236 | return ip6_xmit(sk, skb, &fl, np->opt, 0); | ||
235 | } | 237 | } |
236 | 238 | ||
237 | /* Returns the dst cache entry for the given source and destination ip | 239 | /* Returns the dst cache entry for the given source and destination ip |
diff --git a/net/sctp/output.c b/net/sctp/output.c index 45684646b1db..0dc4a7dfb234 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
@@ -586,10 +586,8 @@ int sctp_packet_transmit(struct sctp_packet *packet) | |||
586 | SCTP_DEBUG_PRINTK("***sctp_transmit_packet*** skb len %d\n", | 586 | SCTP_DEBUG_PRINTK("***sctp_transmit_packet*** skb len %d\n", |
587 | nskb->len); | 587 | nskb->len); |
588 | 588 | ||
589 | if (tp->param_flags & SPP_PMTUD_ENABLE) | 589 | nskb->local_df = packet->ipfragok; |
590 | (*tp->af_specific->sctp_xmit)(nskb, tp, packet->ipfragok); | 590 | (*tp->af_specific->sctp_xmit)(nskb, tp); |
591 | else | ||
592 | (*tp->af_specific->sctp_xmit)(nskb, tp, 1); | ||
593 | 591 | ||
594 | out: | 592 | out: |
595 | packet->size = packet->overhead; | 593 | packet->size = packet->overhead; |
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index a6e0818bcff5..0b65354aaf64 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -862,16 +862,21 @@ static int sctp_inet_supported_addrs(const struct sctp_sock *opt, | |||
862 | 862 | ||
863 | /* Wrapper routine that calls the ip transmit routine. */ | 863 | /* Wrapper routine that calls the ip transmit routine. */ |
864 | static inline int sctp_v4_xmit(struct sk_buff *skb, | 864 | static inline int sctp_v4_xmit(struct sk_buff *skb, |
865 | struct sctp_transport *transport, int ipfragok) | 865 | struct sctp_transport *transport) |
866 | { | 866 | { |
867 | struct inet_sock *inet = inet_sk(skb->sk); | ||
868 | |||
867 | SCTP_DEBUG_PRINTK("%s: skb:%p, len:%d, " | 869 | SCTP_DEBUG_PRINTK("%s: skb:%p, len:%d, " |
868 | "src:%u.%u.%u.%u, dst:%u.%u.%u.%u\n", | 870 | "src:%u.%u.%u.%u, dst:%u.%u.%u.%u\n", |
869 | __func__, skb, skb->len, | 871 | __func__, skb, skb->len, |
870 | NIPQUAD(skb->rtable->rt_src), | 872 | NIPQUAD(skb->rtable->rt_src), |
871 | NIPQUAD(skb->rtable->rt_dst)); | 873 | NIPQUAD(skb->rtable->rt_dst)); |
872 | 874 | ||
875 | inet->pmtudisc = transport->param_flags & SPP_PMTUD_ENABLE ? | ||
876 | IP_PMTUDISC_DO : IP_PMTUDISC_DONT; | ||
877 | |||
873 | SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS); | 878 | SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS); |
874 | return ip_queue_xmit(skb, ipfragok); | 879 | return ip_queue_xmit(skb, 0); |
875 | } | 880 | } |
876 | 881 | ||
877 | static struct sctp_af sctp_af_inet; | 882 | static struct sctp_af sctp_af_inet; |
diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index 9fba838c7069..36b5eedcdc75 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c | |||
@@ -596,7 +596,7 @@ int main(int ac, char **av) | |||
596 | break; | 596 | break; |
597 | } | 597 | } |
598 | 598 | ||
599 | if (conf_get_changed() && conf_write(NULL)) { | 599 | if (conf_write(NULL)) { |
600 | fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n")); | 600 | fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n")); |
601 | exit(1); | 601 | exit(1); |
602 | } | 602 | } |
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 07597611cc50..df6a188b9930 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c | |||
@@ -222,10 +222,8 @@ load: | |||
222 | continue; | 222 | continue; |
223 | if (def == S_DEF_USER) { | 223 | if (def == S_DEF_USER) { |
224 | sym = sym_find(line + 9); | 224 | sym = sym_find(line + 9); |
225 | if (!sym) { | 225 | if (!sym) |
226 | conf_warning("trying to assign nonexistent symbol %s", line + 9); | ||
227 | break; | 226 | break; |
228 | } | ||
229 | } else { | 227 | } else { |
230 | sym = sym_lookup(line + 9, 0); | 228 | sym = sym_lookup(line + 9, 0); |
231 | if (sym->type == S_UNKNOWN) | 229 | if (sym->type == S_UNKNOWN) |
@@ -261,10 +259,8 @@ load: | |||
261 | } | 259 | } |
262 | if (def == S_DEF_USER) { | 260 | if (def == S_DEF_USER) { |
263 | sym = sym_find(line + 7); | 261 | sym = sym_find(line + 7); |
264 | if (!sym) { | 262 | if (!sym) |
265 | conf_warning("trying to assign nonexistent symbol %s", line + 7); | ||
266 | break; | 263 | break; |
267 | } | ||
268 | } else { | 264 | } else { |
269 | sym = sym_lookup(line + 7, 0); | 265 | sym = sym_lookup(line + 7, 0); |
270 | if (sym->type == S_UNKNOWN) | 266 | if (sym->type == S_UNKNOWN) |
diff --git a/scripts/kernel-doc b/scripts/kernel-doc index d8f77e26081c..ff787e6ff8ed 100755 --- a/scripts/kernel-doc +++ b/scripts/kernel-doc | |||
@@ -1403,7 +1403,7 @@ sub dump_struct($$) { | |||
1403 | my $members = $3; | 1403 | my $members = $3; |
1404 | 1404 | ||
1405 | # ignore embedded structs or unions | 1405 | # ignore embedded structs or unions |
1406 | $members =~ s/{.*?}//g; | 1406 | $members =~ s/{.*}//g; |
1407 | 1407 | ||
1408 | # ignore members marked private: | 1408 | # ignore members marked private: |
1409 | $members =~ s/\/\*.*?private:.*?public:.*?\*\///gos; | 1409 | $members =~ s/\/\*.*?private:.*?public:.*?\*\///gos; |
diff --git a/sound/core/seq/oss/seq_oss_synth.c b/sound/core/seq/oss/seq_oss_synth.c index 558dadbf45f1..e024e4588b82 100644 --- a/sound/core/seq/oss/seq_oss_synth.c +++ b/sound/core/seq/oss/seq_oss_synth.c | |||
@@ -604,6 +604,9 @@ snd_seq_oss_synth_make_info(struct seq_oss_devinfo *dp, int dev, struct synth_in | |||
604 | { | 604 | { |
605 | struct seq_oss_synth *rec; | 605 | struct seq_oss_synth *rec; |
606 | 606 | ||
607 | if (dev < 0 || dev >= dp->max_synthdev) | ||
608 | return -ENXIO; | ||
609 | |||
607 | if (dp->synths[dev].is_midi) { | 610 | if (dp->synths[dev].is_midi) { |
608 | struct midi_info minf; | 611 | struct midi_info minf; |
609 | snd_seq_oss_midi_make_info(dp, dp->synths[dev].midi_mapped, &minf); | 612 | snd_seq_oss_midi_make_info(dp, dp->synths[dev].midi_mapped, &minf); |